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

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

  • 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 -
Другие вопросы по тегам