Как я могу туннелировать многоадресный трафик?
Я пытаюсь получить многоадресную рассылку на одной машине, переслать ее на другую машину и затем воспроизвести на этой машине.
test_env
: машина, которая имеет доступ к исходному многоадресному потокуmcast_sender
: машина, на которую я пытаюсь переслать многоадресную рассылку
Что я пробовал до сих пор:
Объединяя tcpdump
, netcat
а также tcpreplay
Я попытался следующее:
на test_env
:
У меня есть скрипт Python, который выполняет соединение IGMP и просто сидит там всегда, читая из сокета и отбрасывая данные (просто держа сокет открытым)
$ ./mcast_sub INADDR_ANY 239.194.5.1 21001 &
Теперь рассматриваемый интерфейс будет получать многоадресные данные, поэтому я могу запустить tcp_dump
:
$ sudo tcpdump -i eth5 host 239.194.5.1 > /tmp/capture.pcap
Теперь я могу бежать tail
в файле pcap и передайте его netcat
$ tail -f /tmp/capture.pcap -n+1 | nc -l 12345
на mcast_sender
:
На mcast_sender
Затем я могу получить эти данные из порта netcat и скопировать их в локальный файл:
$ nc test_env 12345 > /tmp/capture.pcap
С помощью tcpreplay
Затем я могу прочитать файл захвата на mcast_sender
и повтори это
$ sudo tcpreplay --intf1=eth8 /tmp/capture.pcap
Моя проблема:
tcpdump
- netcat
Трубопровод вроде бы работает. Я подтвердил, что пишу файл на mcast_sender
,
Тем не менее, когда я пытаюсь запустить tcpreplay
на нем я получаю ошибку:
$ sudo tcpreplay --intf1=eth8 /tmp/capture.pcap
Failed: Error opening pcap file: unknown file format
Вопросы:
- Можно ли сделать то, что я пытаюсь здесь?
- Почему файл написан на
mcast_sender
недействительным? - Есть ли лучший способ добиться того, что я пытаюсь сделать здесь?
1 ответ
Это не работает, потому что вам нужно установить стандартный вывод tcpdump для буферизации строки
От man tcpdump
:
-l Make stdout line buffered. Useful if you want to see the data while capturing it. E.g. tcpdump -l | tee dat tcpdump -l > dat & tail -f dat
Вы также можете покончить с промежуточным файлом и netcat
по трубопроводу вывод tcpdump
прямо в tcpreplay
,
Это достигается путем запуска tcpdump
через сессию ssh, выводит вывод на стандартный вывод и передает его на стандартный вывод tcpreplay
:
Запустите команду через сеанс SSH:
$ ssh remote_server "command"
Бежать tcpdump
и вывод в stdout, буферизованная строка:
$ sudo tcpdump ... -l -w -
Бежать tcpreplay
чтение со стандартного ввода:
$ sudo tcpreplay ... -
Собираем все вместе:
$ ssh test_env "sudo tcpdump -i eth5 host 239.194.5.1 -l -w -" |
sudo tcpreplay --intf1=eth8 -