Я хочу, чтобы мой Linux-маршрутизатор / интернет-шлюз 192.168.80.1 перенаправлял порт 9091 на 192.168.80.15:9091 при запросе через локальную сеть. Я также хочу, чтобы мой маршрутизатор перенаправлял запросы, исходящие из глобальной сети, на порт 9091 на порт 192.168.80.15:9091.
Вторую часть я завершил успешно, и большую часть пути я использую в первой части
iptables -A PREROUTING -p tcp -m tcp --dport 9091 -j DNAT --to-destination 192.168.80.15:9091
iptables -A POSTROUTING -d 192.168.80.15/32 -p tcp -m tcp --dport 9091 -j SNAT --to-source 192.168.80.1
согласно главный ответ здесь. Однако это работает, только если я установил для политики FORWARD значение ACCEPT. Я хотел бы сохранить политику пересылки как DROP и создать конкретное исключение для трафика, который я пересылаю.
я пробовал
iptables -A FORWARD -p tcp --dport 9091 -j ACCEPT
и он передает трафик на 192.168.80.15:9091, но ответ с 192.168.80.15 на 192.168.80.1 возвращается на другой порт, и я думаю, что его сбрасывают. Как я могу создать правило, которое обеспечивает относительную безопасность, разрешая при этом желаемый трафик? Я играл с conntrack, но пока безуспешно.
ОБНОВИТЬ:
Я понимаю, что есть альтернативный подход, называемый шпилькой NAT. Я открыт для аргументов, если это лучший подход, но я должен отметить, что в настоящее время bind
настроен на моем шлюзе / маршрутизаторе так, что мое доменное имя разрешается до 192.168.80.1 для клиентов в моей локальной сети (тогда как оно разрешается на общедоступный IP-адрес шлюза извне)
В конечном итоге я хочу, чтобы mydomain.com:9091 имел доступ к одной и той же службе независимо от запроса, исходящего из LAN или WAN.
Пакеты должны проходить через ваш маршрутизатор, поэтому они должны проходить цепочку FORWARD.
Легкий способ добиться этого - использовать эту команду:
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED -j ACCEPT
В любом случае отслеживание подключений необходимо для работы NAT (SNAT или DNAT), поэтому оно даже не добавляет много накладных расходов, и вам не нужно беспокоиться о конкретных правилах.
Использовать
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,DNAT -j ACCEPT
Он будет охватывать оба
iptables -A FORWARD -p tcp --dport 9091 -j ACCEPT
что вы правильно поняли и
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED -j ACCEPT
из предыдущего ответа, который необходим, чтобы разрешить возврат трафика через маршрутизатор.
Недостаток - правило будет разрешать ЛЮБОЙ трафик, который вы используете DNAT через ваш маршрутизатор. Это может или не может считаться небезопасным в зависимости от вашей политики.