Подключение сетей с одинаковыми 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), подключенных через Интернет.

Другие вопросы по тегам