У меня есть служба, работающая на определенном порте, но чтобы сделать ее доступной через более запоминающийся порт, а также через обычный порт, я добавил правило 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, которая видит правило входящей предварительной маршрутизации, а затем автоматически настраивает исходящий трафик на это правило?