Почему дублированные пакеты UDP отбрасываются 10 из 11 раз при такой конфигурации iptables?

Я пытаюсь продублировать UDP-пакеты, поступающие на порт 50007 по интернет-адресу с устройств в локальной сети NAT (192.168.12.0/24) с целью их локальной обработки (192.168.12.1:50006).

На 38 из 40 моих устройств следующие таблицы iptables mangle и nat делают свое дело - порт 50006 принимает пакеты со скоростью передачи 12 в минуту - 1 раз в 5 секунд.

Однако на двух устройствах, которые имеют конфигурацию, идентичную другим 38, порт 50006 принимает пакеты со скоростью 1/11 от скорости передачи, например, 1 пакет каждые 55 секунд - остальные 10 из 11 пакетов предположительно отбрасываются.

Порт 50006 прослушивается скриптом socat:

socat UDP-RECVFROM:50006,fork "EXEC:handler-script"

Сценарий обработчика возвращается в течение 1 секунды, и при изменении сценария на изменение не наблюдается никакого изменения в скорости поступления.

Одно из двух неисправных устройств самопроизвольно исправилось, и порт 50006 начал принимать пакеты с передаваемой скоростью.

Оставшееся устройство все еще принимает пакеты только на 1/11 от скорости передачи, даже если tcpdump показывает исходные пакеты, поступающие с полной скоростью.

$ sudo iptables -L -t mangle
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
TEE        udp  --  192.168.12.0/24      anywhere             udp dpt:50007 TEE gw:10.0.0.1

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
$ sudo iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
DNAT       udp  --  192.168.12.0/24      anywhere             udp dpt:50007 to:192.168.12.1:50006

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  192.168.12.0/24      anywhere            

Одна странность с неисправным узлом состоит в том, что tcpdump показывает дублированный пакет с исходным адресом источника и адресом источника, соответствующим IP локального узла на восходящей линии связи. На рабочих узлах tcpdump показывает только оригинальный (предварительно маскированный) пакет.

$ sudo tcpdump -i eth2 port 50007

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes
03:56:41.851719 IP 192.168.12.66.4097 > example.com.50007: UDP, length 216
03:56:41.851996 IP 10.0.0.8.4097 > example.com.50007: UDP, length 216`

ЦП на неисправном узле выглядит номинальным, и почти наверняка нет различий в конфигурации между работающим и неисправным узлами. Однако узлы развернуты в разных локальных сетях.

Таким образом, вопрос заключается в следующем: что может вызывать сбой в работе неисправного узла 10 из каждых 11 пакетов? Второй вопрос: почему tcpdump ведет себя по-разному на этом узле и показывает замаскированный пакет, а также исходный пакет.

Любые предложения о том, как я мог бы отладить эту проблему?

1 ответ

Хорошо, получается, что объяснение было дано этим вопросом и ответом:

Почему iptables не сбрасывает пакеты?

Оказывается, что эта установка имела особенно хорошее соединение Wi-Fi между нисходящим устройством и маршрутизатором, и запись ip_conntrack была установлена ​​до того, как было установлено правило DNAT, что привело к обстоятельству, которое применялось в упомянутых вопросах и ответах.

Я смог подтвердить это, отключив точку доступа на маршрутизаторе на 185 секунд (на 5 секунд дольше, чем время ожидания входа по умолчанию), а затем снова включив его. Как только я это сделал, пакеты передавались с ожидаемой скоростью.

Кроме того, неожиданное дублирование пакетов, видимое в трассировке tcpdump, исчезло после устранения этой проблемы.

Другие вопросы по тегам