У меня есть сеть с несколькими рабочими станциями / серверами Linux и двумя подключениями к Интернету, каждое с маршрутизатором NAT потребительского уровня перед ним. Итак, для конкретности, устройства:
192.0.2.0/26 network
192.0.2.1 router A
192.0.2.62 router B
192.0.2.10 host X
192.0.2.11 host Y
Вот диаграмма, похожая на ту, что в LARTC HOWTO:
________
+------------+ /
| | |
+-----------+-[NAT router A]------+ Provider 1 +-------
_| | | /
___/ \_ +--------------+ +------------+ |
_/ \__ | Linux host | /
/ \ | | |
| Local network -----+ if1 | | Internet
\_ __/ | | |
\__ __/ | | \
\___/ +--------------+ +------------+ |
| | | \
+---------------[NAT router B]----+ Provider 2 +-------
| | |
+------------+ \________
Если новое TCP-соединение входит через тот или иной маршрутизатор, обратный трафик должен выходить через этот маршрутизатор. В противном случае возвращаемый SYN-пакет будет неправильно преобразован в NAT (если вообще будет передан), и соединение будет фактически заблокировано. Я мог бы настроить взаимоисключающие наборы переадресации портов на двух маршрутизаторах, если бы это помогло, но я бы предпочел сохранить их одинаковыми (или, по крайней мере, в некоторых случаях, перекрывающимися), если это возможно.
Для новых исходящих подключений я хочу распределить трафик по диапазону с помощью основной таблицы маршрутизации, но для определенного трафика я могу случайным образом сбалансировать новые подключения между двумя маршрутизаторами.
Я подозреваю, что то, о чем я спрашиваю, можно сделать, используя iptables
и ip
, или, возможно, только один из этих инструментов. Однако все HOWTO и другие ответы, которые я нашел, похоже, относятся к одному маршрутизатору (под управлением Linux) или хосту с несколькими интерфейсами ... а не к политике для нескольких маршрутизаторов, подключенных к одному интерфейсу.
редактировать: Я нашел еще одного вопрос, также без ответа, это вопрос о той же ситуации (примечание 192.168.0.0/23
как локальная сеть), но фокусируется на политике для исходящего трафика; мой вопрос здесь конкретно о политике для входящего трафика. (Оба устройства NAT имеют функцию «переадресация порта по диапазону портов на хост».)
Да, это можно сделать с помощью iptables
и ip
все вместе. В моем случае все рассматриваемые системы Linux работают под управлением Debian Stable, поэтому я написал собственный сценарий для /etc/network/if-up.d
.
# First set up two routing-tables
ip route add to default table 11 via 192.0.2.1 dev $IFACE
ip route add to default table 33 via 192.0.2.62 dev $IFACE
# ... and rules to use them.
ip rule add priority 99 table 11 fwmark 11
ip rule add priority 99 table 33 fwmark 33
# Copy connmark to fwmark for applicable outgoing packets.
iptables -t mangle -A OUTPUT ! -d 192.0.2.0/26 \
-m addrtype --dst-type UNICAST -j CONNMARK --restore-mark
# Set connmark for applicable incoming packets.
iptables -A INPUT -i $IFACE ! -s 192.0.2.0/26 \
-m addrtype --src-type UNICAST \
-m mac --mac-source 00:00:5E:00:53:05 \
-j CONNMARK --set-mark 11
iptables -A INPUT -i $IFACE ! -s 192.0.2.0/26 \
-m addrtype --src-type UNICAST \
-m mac --mac-source 00:00:5E:00:53:07 \
-j CONNMARK --set-mark 33
Обратите внимание, что он определен в таком порядке, чтобы все это вступило в силу с двумя последними командами. 00:00:5E:00:53:05
и 00:00:5E:00:53:07
будут адреса соединения двух устройств NAT.