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

Как распределить нагрузку трафика между двумя независимыми NAT-устройствами с помощью ядра Linux?

У меня есть сеть с несколькими рабочими станциями / серверами 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.