Здесь происходит что-то жуткое, и я не знаю, как это исправить. Резюме: трафик, который выглядит идентично tcpdump, обрабатывается iptables по-разному. Подробности ниже.
Испытательная установка:
устройство 0 - машина linux, сидящая по IP 192.168.0.121
устройство 1 - тупое устройство, которое просто отправляет пакеты на порт 4000 на 192.168.0.121. IP-адрес этого устройства устанавливается с помощью команды: sudo arp -s 192.168.0.27 MAC_ADDRESS, потому что оно не выполняет DHCP-запросов и не может выполнять какие-либо действия, кроме своей работы.
устройство 2 - машина linux, отправляющая пакеты на порт 4000 по 192.168.121 с помощью команды:
смотреть -n 1 "дата | nc -4u -w1 -v 192.168.0.121 4000"
Вывод tcpdump из ситуации:
22:00:01.845359 IP 192.168.3.30.50705 > 192.168.0.121.4000: UDP, length 1
22:00:01.845391 IP 192.168.3.30.50705 > 192.168.0.121.4000: UDP, length 29
22:00:02.022257 IP 192.168.0.27.27 > 192.168.0.121.4000: UDP, length 12
22:00:03.022797 IP 192.168.0.27.27 > 192.168.0.121.4000: UDP, length 12
...
В этом случае вывод команды socat udp-l:4000,fork stdout
:
�����XX@�XWed Sep 2 22:02:18 PDT 2015
������XX��XWed Sep 2 22:02:22 PDT 201
...
И вывод socat udp-l:2700,fork stdout
пуста.
Странный мусор от датчика, а дата от вышеупомянутой команды. Обратите внимание, что IP-адрес назначения / порт этого трафика в точности совпадает с tcpdump. Теперь, если я перенаправлю весь трафик с UDP-порта 4000 на 2700:
sudo iptables -t nat -A PREROUTING -p udp --dst 192.168.0.121 --dport 4000 -j DNAT --to-destination 192.168.0.121:2700
tcpdump выглядит точно так же, но теперь вывод socat udp-l:4000,fork stdout
:
���@�@�@�������@�@�@�������@������������@�@@����@��� ...
и вывод socat udp-l:2700,fork stdout
:
XXXWed Sep 2 22:05:42 PDT 2015
XXXWed Sep 2 22:05:46 PDT 2015
XXXWed Sep 2 22:05:50 PDT 2015
...
Как вы можете видеть, трафик с устройства 1 игнорируется iptables и продолжается до хоста через порт 4000, но трафик с устройства 2 попадает под правило и перенаправляется на порт 2700. Я могу очистить iptables и переиздать правило на весь день, и оно просто переключается между этими двумя состояниями.
У кого-нибудь есть понимание того, что может происходить?