Назад | Перейти на главную страницу

Как я могу туннелировать многоадресный трафик?

Я пытаюсь получить многоадресную рассылку на 1 машине, переслать ее на другую машину, а затем воспроизвести на этой машине.

Что я пробовал до сих пор:

Объединение 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

Вопросы:

Это не работает, потому что вам нужно установить 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 -