У меня есть служба, работающая на определенном порте, но чтобы сделать ее доступной через более запоминающийся порт, а также через обычный порт, я добавил правило iptables, которое действует как псевдоним порта:

iptables -A PREROUTING -i eth0 -p tcp -m tcp --dport 5555 -j REDIRECT --to-ports [configured port]

Возможно, я был немного наивен, но на самом деле я начал с добавления второго правила в POSTROUTING, в котором исходный порт TCP был преобразован в псевдоним порта в исходящем трафике. Однако оказывается, что это правило мне вообще не нужно. Итак, мой вопрос: почему это работает, используя только одно правило?

Клиент устанавливает соединение с хостом: псевдоним порта. Поскольку в iptables нет правила переназначения исходного порта для исходящего трафика этой службы, он получит ответ от хоста, но с другим исходным портом. Не вызовет ли это проблемы с отображением диалога TCP с клиентом? Я имею в виду, что клиент ожидает ответ от порта host: alias, но вместо этого (теоретически) получает ответ от host: real port. И поскольку трафик не будет считаться «связанным», он не должен даже проходить через NAT или другой брандмауэр с отслеживанием состояния - но это так. Есть ли какая-то магия в iptables, которая видит правило входящей предварительной маршрутизации, а затем автоматически настраивает исходящий трафик на это правило?

1 ответ1

2

Цель REDIRECT - это особый случай цели DNAT , используемый для удобства. См. Соответствующую документацию по netfilter и эту форму ответа Unix StackExchange.

Цели DNAT изменяют не только первый пакет, но и все будущие пакеты того же соединения, поэтому достаточно одного правила. От man iptables (смотрите раздел с целевыми расширениями, dnat):

все будущие пакеты в этом соединении также будут искажены

Примечание: цели DNAT и REDIRECT действительны только в таблице nat , цепочках PREROUTING и OUTPUT .

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