Я видалив свою оригінальну відповідь, оскільки не був повністю впевнений, що вона правильна. З тих пір я мав певний час створити трохи віртуальної мережі віртуальних машин, щоб імітувати цю мережу. Ось набір правил брандмауера, які працювали для мене (у iptables-save
форматі, лише для nat
таблиці):
-A PREROUTING -d 89.179.245.232/32 -p tcp -m multiport --dports 22,25,80,443 -j DNAT --to-destination 192.168.2.10
-A POSTROUTING -s 192.168.2.0/24 -o ppp0 -j MASQUERADE
-A POSTROUTING -s 192.168.2.0/24 -d 192.168.2.10/32 -p tcp -m multiport --dports 22,25,80,443 -j MASQUERADE
Перше POSTROUTING
правило - це простий спосіб спільного доступу до Інтернету з локальною мережею. Я залишив його там для повноти.
PREROUTING
Правило і друге POSTROUTING
правило разом встановлюють відповідні NATs, так що підключення до сервера через зовнішній IP - адреса може статися, незалежно від того , з'єднання відбуваються з - за меж або всередині локальної мережі. Коли клієнти в локальній мережі підключаються до сервера через зовнішню IP-адресу, сервер сприймає з'єднання як внутрішні IP-адреси маршрутизатора (192.168.2.1).
Цікаво, що виявляється, що існує пару варіантів другого правила ПОСТРОЙТУВАННЯ, які також працюють. Якщо ціль буде змінено на -j SNAT --to-source 192.168.2.1
, ефект (не дивно) такий же, як MASQUERADE
: сервер бачить з'єднання локальних клієнтів локальної мережі як джерела з внутрішньої IP-адреси маршрутизатора . З іншого боку, якщо ціль буде змінена -j SNAT --to-source 89.179.245.232
, то NAT все ще працює, але цього разу сервер бачить з'єднання локальних клієнтів локальної мережі як джерела зовнішньої IP-адреси маршрутизатора (89.179.245.232).
Нарешті, зауважте, що ваше оригінал PREROUTING
/ DNAT
правило з -i ppp0
не працює, оскільки правило ніколи не відповідає пакетам, що надходять від клієнтів локальної мережі (оскільки вони не входять в маршрутизатор через ppp0
інтерфейс). Можна було б змусити його працювати, додавши друге PREROUTING
правило лише для внутрішніх клієнтів локальної мережі, але це було б неелегантно (IMO) і все одно потрібно було б чітко посилатися на зовнішню IP-адресу.
Тепер, навіть після того, як виклав рішення "шпильки NAT" (або "петління NAT", або "відбиття NAT", або як би хто вважає за краще це), я все ще вважаю, що рішення DNS з розділеним горизонтом ... -за зовнішніми клієнтами, які вирішують зовнішній IP, і внутрішніми клієнтами, що вирішують внутрішній IP ---, було б більш доцільним шляхом. Чому? Оскільки більшість людей розуміють, як працює DNS, ніж розуміють, як працює NAT, і значна частина створення хороших систем вирішує використовувати деталі, які є ремонтом. Настройка DNS швидше зрозуміла та, таким чином, правильно підтримується, ніж таємна установка NAT (звичайно, IMO).