ОБНОВЛЕНИЕ: Это произошло при использовании док-контейнеров внутри сети. Я не уверен, что это важно, но это может как-то повлиять на топологию ...
Я изо всех сил пытаюсь понять поведение, которое не могу объяснить в примере сети. По сути, я хочу иметь возможность переключать некоторые из моих серверов путем перенаправления на другой сервер (чтобы я мог, например, указать свои приложения на каком-либо сервере базы данных, а затем переключить соединения базы данных на другой сервер без изменения приложений). Я, вероятно, собираюсь использовать что-то вроде rinetd для этого, но мне любопытно, почему некоторые правила iptables не работают так, как я ожидал.
В примере сети было 3 сервера: gw (192.168.0.1/24), s1 (192.168.0.2/24) и s2 (192.168.0.3/24). gw - это шлюз по умолчанию для s1 и s2. Затем я настроил в PRWOUTING gw в таблице nat перенаправление трафика на 192.168.1.1:5432 (который находится за пределами основной сети, что означает, что он идет к шлюзу) на s2: 5432 (192.168.0.2). Адрес 192.168.1.1 вообще не должен существовать, это может быть любой адрес вне маршрутизируемой внутренней сети (192.168.0.0/24).
Теперь я понимаю, почему я не могу получить доступ к 192.168.1.1:5432 из шлюза gw, поскольку трафик не проходит через NAT PREROUTING (где происходит DNAT), и я знаю, как сделать это возможным, добавив правило DNAT к выходу nat OUTPUT. цепь и правило SNAT для POSTROUTING. Как и ожидалось, указание на 192.168.1.1:5432 будет перенаправлено на 192.168.0.2:5432 при доступе из s1. Теперь я не понимаю, почему соединение не принимается или не принимается, когда я пытаюсь подключиться к 192.168.1.1:5432 из s2. Я думаю, что соединение должно быть перенаправлено обратно на s2 (192.168.0.2).
Выполнение SNAT или MASQUERADE в nat POSTROUTING также не имеет никакого значения в моих тестах. Почему перенаправление назад не работает с iptables?
ОБНОВЛЕНИЕ: Я искал некоторую помощь в канале #Netfilter на Freenode, и оказалось, что это должно работать, как подтверждено "evilman_work" при репликации в лабораторной среде. Кроме того, мы заметили, что это работало и на моем сервере, если интерфейс был переведен в смешанный режим. Мы не смогли выяснить причину этого, поэтому, если у вас есть какие-либо идеи, я бы хотел их услышать. Это не большая проблема, потому что это была тестовая среда, использующая Docker, в то время как хост был шлюзом. Я хочу использовать это в реальных виртуальных машинах, поэтому я подозреваю, что у меня не будет проблем в этом сценарии. Возможно это было вызвано чем-то связанным с Докером ...