Я хочу разрешить соединение между двумя хостами, которые находятся в двух разных сетях. Каждая сеть управляется индивидуально, поэтому у них могут быть конфликтующие IP-адреса. Я понимаю, что NAT - это учебный способ сделать это, поэтому, насколько я понимаю, у меня должен быть компьютер с двумя интерфейсами, по одному в каждой сети, например:
Network A Network B
+---------------+ 1.1.1.0 2.2.2.0 +---------------+
| | eth0 +----------+ eth1 | |
| 1.1.1.1 |---------| NAT |---------| 2.2.2.2 |
+---------------+ +----------+ +---------------+
Итак, машина NAT имеет eth0, подключенный к сети A, и eth1, подключенный к сети B. Предположим, что IP-адрес NAT-машины в сети A равен 1.1.1.0, а в сети B - 2.2.2.0. Теперь 1.1.1.1 хочет связаться с 2.2.2.2:8080, перенаправив 1.1.1.0:1111 на сеть B 2.2.2.2:8080.
Я считаю, что могу сделать это с помощью iptables следующим образом:
iptables -t NAT -A PREROUTING -i eth0 -d 1.1.1.0 --dport 1111 -j DNAT --to 2.2.2.2:8080
iptables -t NAT -A POSTROUTING -o eth1 -d 2.2.2.2 --dport 8080 -j SNAT --to-source 2.2.2.0
Все идет нормально.
Однако что произойдет, если IP-адреса в обеих сетях идентичны (что может случиться, поскольку сети независимы)? Вышесказанное превращается в:
Network A Network B
+---------------+ 1.1.1.0 1.1.1.0 +---------------+
| | eth0 +----------+ eth1 | |
| 1.1.1.1 |---------| NAT |---------| 1.1.1.1 |
+---------------+ +----------+ +---------------+
iptables -t NAT -A PREROUTING -i eth0 -d 1.1.1.0 --dport 1111 -j DNAT --to 1.1.1.1:8080
iptables -t NAT -A POSTROUTING -o eth1 -d 1.1.1.1 --dport 8080 -j SNAT --to-source 1.1.1.0
Если я правильно понимаю цепочки, то, когда пакет 1.1.1.0:1111 прибывает на eth0, его целевой IP-адрес будет изменен на 1.1.1.1. На этом этапе пакет должен быть маршрутизирован, но поскольку 1.1.1.1 существует в обеих сетях, как машина NAT узнает, в какую сеть направить пакет? Могу ли я заставить его маршрутизировать такие пакеты через eth1? Как мне настроить для этого свою таблицу маршрутизации?
Я полагаю, что логика маршрутизации может гарантировать, что пакет никогда не будет направлен обратно на входящий интерфейс, но этого будет недостаточно, если я хочу использовать тот же NAT-компьютер для подключения сети A к сетям B и C (т.е. три интерфейсы): в этом случае входящим интерфейсом будет eth0, а исходящим интерфейсом может быть eth1 или eth2: как я могу выбрать тот, который я хочу использовать?
Ваша вторая конфигурация не будет работать, если по обе стороны от NAT есть перекрывающиеся IP-конфигурации. Это справедливо даже при наличии промежуточной сети между NAT (ами) - например, две сети с NAT, в которых размещены перекрывающиеся IP-планы (например, 192.168.1.0/24), подключенные через Интернет.