Я пытаюсь получить многоадресную рассылку на 1 машине, переслать ее на другую машину, а затем воспроизвести на этой машине.
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
недействительным?Это не работает, потому что вам нужно установить stdout 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
и вывод на стандартный вывод, строчная буферизация:
$ 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 -