1

Здесь происходит что-то жуткое, и я не знаю, как это исправить. Резюме: трафик, который выглядит идентично 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 и переиздать правило на весь день, и оно просто переключается между этими двумя состояниями.

У кого-нибудь есть понимание того, что может происходить?

1 ответ1

0

Оказывается, что оба устройства отправляли хост Linux на 192.168.0.121 с 192.168.0.27, просто с разными MAC-адресами. Очевидно, что это не соответствует правилам поведения, и iptables не должен с этим справляться.

Я хотел бы предложить несколько советов о том, как позволить двум этим устройствам сосуществовать в одной сети, не заставляя производителя написать нам обновление прошивки. Так что если у кого-то есть идея, дайте мне знать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .