В моем linux box 10.20.1.1 я получил два приложения UDP, привязанных к порту 46000 (App A) и 36000(App B) соответственно. Приложения обмениваются данными с двумя серверами UDP, которые связаны как 10.10.1.1:36000 (Srv X) и 10.10.1.2:36000 (Srv Y) соответственно.
Когда я отправляю пакет, у меня есть требование всегда использовать UDP-порт src как 36000. Пакет на проводе всегда будет 36000 - 36000 портов src и dst.
Мои правила iptables как ниже. Мое намерение состоит в том, чтобы DNAT входящий пакет от Srv X от порта 36000 to 46000 чтобы приложение A получило его.
*nat
-A PREROUTING -s 10.10.1.1/32 -p udp --dport 36000 -j DNAT --to-destination :46000
*raw
-A PREROUTING -p udp --dport 36000 -j CT --notrack
-A PREROUTING -p udp -j ACCEPT
-A OUTPUT -p udp --dport 36000 -j CT --notrack
-A OUTPUT -p udp -j ACCEPT
*filter
-A INPUT -p udp -m udp --dport 36000 -j ACCEPT --> rule 1
-A INPUT -p udp -m udp --dport 46000 -j ACCEPT --> rule 2
-A OUTPUT -p udp -m udp --dport 36000 -j ACCEPT -> rule 3
Когда я отправляю пакет из App A to Srv X все идет хорошо. В файле /proc/net/ip_conntrack нет записи conntrack, а пакет OUT соответствует rule 3 . Когда ответ приходит от Srv X to App A , пакет пересекает необработанную таблицу, но он DOES NOT проходит DNAT и напрямую переходит к правилу таблицы фильтрации 1. Это означает, что ответ Srv X приходит на мою коробку, но идет в приложение B вместо приложения A.
Вопросы:
Таблица RAW указывает на отсутствие
CONNTRACK. Тем не менее, описанное выше поведение указывает на первый пакетApp A -> Srv Xс портом src и dst, так как какой-то модуль отслеживает где-то36000 - 36000. Следовательно, ответ отSrv X -> App A, кажется, не подвергается DNAT. Как мне избежать этогоCONNTRACK?Как обеспечить, чтобы каждый входящий пакет из Srv X с портом dst 36000 всегда проходил DNAT?
Заранее спасибо, Телекс
