Я удалил свой оригинальный ответ, потому что я не был полностью уверен, что он был правильным. С тех пор у меня было некоторое время, чтобы настроить небольшую виртуальную сеть виртуальных машин для симуляции рассматриваемой сети. Вот набор правил брандмауэра, который работал для меня (в 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).
Интересно, что оказывается, что есть пара вариантов второго правила POSTROUTING, которые также работают. Если цель изменяется на -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
не работает, потому что правило никогда не совпадает с пакетами, поступающими от клиентов LAN (так как они не входят в маршрутизатор через ppp0
интерфейс). Можно было бы заставить его работать, добавив второе PREROUTING
правило только для клиентов внутренней ЛВС, но оно было бы не элегантным (IMO) и все равно требовало бы явной ссылки на внешний IP-адрес.
Теперь, даже после того, как я подробно изложил решение «шпилька NAT» (или «петля NAT», или «отражение NAT», или как его предпочитают называть), я по-прежнему считаю, что решение DNS с разделением горизонта - - с разрешением внешних клиентов на внешние IP и разрешением внутренних клиентов на внутренние IP --- было бы более приемлемым путем. Почему? Потому что больше людей понимают, как работает DNS, чем понимают, как работает NAT, и большая часть построения хороших систем выбирает использование частей, которые можно обслуживать. Настройка DNS более понятна и, следовательно, правильно поддерживается, чем тайная настройка NAT (конечно, IMO).