В моем 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?
Заранее спасибо, Телекс