Назад | Перейти на главную страницу

Как ужесточить прямую цепочку пересылки iptables для трафика DNAT + SNAT

Я хочу, чтобы мой 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 через ваш маршрутизатор. Это может или не может считаться небезопасным в зависимости от вашей политики.