Подключение сетей с одинаковыми IP-адресами через iptables+NAT: выбор исходящего сетевого интерфейса
Я хочу разрешить подключение между двумя хостами, которые находятся в двух разных сетях. Каждая сеть управляется индивидуально, поэтому у них могут быть конфликтующие 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, его Dest IP будет изменен на 1.1.1.1. В этот момент пакет должен быть маршрутизирован, но, поскольку 1.1.1.1 существует в обеих сетях, как машина NAT узнает, в какую сеть направить пакет? Могу ли я заставить его маршрутизировать такие пакеты через eth1? Как мне настроить мою таблицу маршрутизации для этого?
Я предполагаю, что логика маршрутизации может гарантировать никогда не направлять пакет обратно на его входящий интерфейс, но этого будет недостаточно, если я хочу использовать одну и ту же машину NAT для подключения сети A к сетям B и C (то есть иметь три интерфейса): в этом случае входящим интерфейсом будет eth0, а исходящим интерфейсом может быть eth1 или eth2: как выбрать тот, который я хочу использовать?
1 ответ
Ваша вторая конфигурация не будет работать, когда есть пересекающиеся конфигурации IP на любой стороне NAT. Это справедливо даже при наличии промежуточной сети между NAT(ами) - например, в двух сетях с NAT для размещения перекрывающихся IP-планов (например, 192.168.1.0/24), подключенных через Интернет.