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