Как распределить нагрузку трафика между двумя независимыми устройствами 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) или хосту с несколькими интерфейсами ... а не к политике для нескольких маршрутизаторов, подключенных к одному интерфейсу.

Edit : Я нашел еще один вопрос , также без ответа, который спрашивает о той же ситуации (примечание 192.168.0.0/23 , что и в локальной сети), но фокусируется на политике для исходящего трафика. ; мой вопрос здесь конкретно о политике для входящего трафика. (Оба устройства NAT имеют функцию «переадресация порта по диапазону портов на хост». )

2
задан 30 August 2016 в 15:29
1 ответ

Да, это можно сделать, используя 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-устройств.

.
1
ответ дан 3 December 2019 в 12:39

Теги

Похожие вопросы