Назад | Перейти на главную страницу

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