.png)
В моем 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
так, чтобы App 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
все идет нормально. Нет записи conntrack в /proc/net/ip_conntrack
и OUT пакет совпадает rule 3
. Когда приходит ответ из Srv X to App A
, пакет проходит через таблицу raw, но он DOES NOT
подвергается DNAT
и напрямую переходит к правилу таблицы фильтров 1. Это означает, что ответ Srv X приходит на мой ящик, но он идет в App B вместо App A.
Вопросы:
Таблица RAW показывает, что нет
CONNTRACK
. Однако, приведенное выше поведение указывает на то, что первый пакетApp A -> Srv X
с src и dst port36000 - 36000
отслеживается каким-то модулем где-то. Следовательно, ответ от,Srv X -> App A
похоже, не подвергается DNAT. Как этого избежатьCONNTRACK
?Как гарантировать, что каждый входящий пакет от Srv X с портом назначения 36000 всегда проходит DNAT?
Спасибо заранее, Телекс
решение1
Глядя наДокументация Netfilter, он сказал, что«Отслеживание соединений имеет основополагающее значение для NAT», поэтому вы не можете иметь DNAT без включенияconntrack.