Балансировка нагрузки и NAT-соединение нескольких ISP-соединений в Linux

15

У меня есть два интернет-соединения от двух разных интернет-провайдеров, и мне нужно сбалансировать трафик, исходящий из моей сети и между ней, между двумя интернет-провайдерами. Я использую Debian GNU / Linux.

Моя установка такова -

eth0 (192.168.0.0/24) - Локальная сеть

eth1 (192.168.1.0/24) - ISP # 1

eth2 (192.168.2.0/24) - ISP # 2

Моя локальная сеть подключена к этому серверу через eth0, а в поле установлен сервер DHCP cum Gateway для всех машин в локальной сети.

Сервер должен выполнять балансировку нагрузки между двумя Интернет-провайдерами, а также выполнять NAT.

Я следовал инструкциям по маршрутизации на lartc.org, но мне все еще нужны инструкции для правильной работы NAT.

Любая помощь будет оценена.

PS - я знаю о pFsense, но мне нужно использовать Linux.

Baishampayan Ghose
источник
2
какие инструкции вам нужны? все объясняется на lartc.org. Есть ли у вас какие-либо проблемы в частности?
Лоренцог

Ответы:

19

Я выполнил балансировку нагрузки, используя методы lartc.org и iptables , и обнаружил, что метод iptables легче понять и реализовать. Единственным недостатком является то, что вам нужна довольно свежая версия iptables, чтобы иметь возможность использовать модуль статистики.

Давайте предположим несколько вещей:

LAN: eth0: 192.168.0.1/24

ISP1: eth1: 192.168.1.1/24, шлюз: 192.168.1.2/24

ISP2: eth2: 192.168.2.1/24, шлюз: 192.168.2.2/24

Итак, вот как я бы сделал, используя метод iptables:

Таблицы маршрутов

Сначала отредактируйте / etc / iproute2 / rt_tables, чтобы добавить карту между номерами таблицы маршрутов и именами интернет-провайдеров.

...
10 ISP1
20 ISP2
...

Таким образом, таблица 10 и 20 для ISP1 и ISP2, соответственно. Мне нужно заполнить эти таблицы маршрутами из основной таблицы с помощью этого фрагмента кода (который я взял из hxxp: //linux-ip.net/html/adv-multi-internet.html)

ip route show table main | grep -Ev '^default' \
   | while read ROUTE ; do
     ip route add table ISP1 $ROUTE
done

И добавьте шлюз по умолчанию к ISP1 через шлюз этого ISP1:

ip route add default via 192.168.1.2 table ISP1

Сделайте то же самое для ISP2

Итак, теперь у меня есть 2 таблицы маршрутов, по 1 на каждого провайдера.

Iptables

Хорошо, теперь я использую iptables для равномерного распределения пакетов по каждой таблице маршрутов. Больше информации о том, как эта работа может быть найдена здесь ( http://www.diegolima.org/wordpress/?p=36 ) и здесь ( http://home.regit.org/?page_id=7 )

# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

NAT

Ну NAT это просто

# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
# iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
mefat
источник
3
Хороший ответ со ссылками. Вам не обязательно нужны новые iptables, чтобы сделать это, так как до статистического совпадения были случайные и n-ые совпадения, для которых сервер выполнял одну и ту же роль.
SiegeX
1
У меня вопрос по поводу отметок на iptables. На размещенной ссылке они отмечают только те пакеты, которые соответствуют новому состоянию. Почему ты делаешь это по-другому?
Матиас
Могу ли я использовать еще одну сеть, например, ISP3, ISP4 и т. Д.?
Витор Мазуко
3

Ответ mefat мне очень помог, но вместо единовременного копирования всех правил основных таблиц в две таблицы ISP лучшим подходом может быть использование правила prio для добавления правил по умолчанию после основной таблицы.

Настройте / etc / iproute2 / rt_tables как обычно:

...
10 ISP1
20 ISP2
...

Обратите внимание, что

ip rule show

Показывает правила 0-> local, 32766-> main и 32767-> default. Смотрите man ipдля более подробной информации.

Важно, что процесс маршрутизации будет работать от правил низкого уровня до правил высокого уровня ... но 32767 - это не самое высокое правило #. Таким образом, если основная таблица маршрутизации не имеет маршрута по умолчанию (но может содержать все виды динамически изменяющихся маршрутов для vpns и т. Д.), То, если совпадение не выполнено, оно сбрасывается до значения по умолчанию (обычно пустого) и затем ищет более высокие правила prio.

Смотрите раздел 'throw' здесь: http://linux-ip.net/html/routing-tables.html

Итак, теперь настройка

ip route add default dev $ISP1_IFACE table ISP1
ip route add default dev $ISP2_IFACE table ISP2

и чтобы убедиться, что они смотрятся после основной таблицы:

ip rule add fwmark 20 table ISP1 prio 33000
ip rule add fwmark 10 table ISP2 prio 33000

использование

ip rule show

еще раз, чтобы убедиться, что эти правила выше, чем основные

Затем используйте CONNMARK mangling, как сказал mefat:

# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark

На что нужно обратить внимание: в nodefaultrouteпротивном случае pppd должен быть установлен в main; когда устройство перезагружается, таблицы ISP1 / ISP2 очищаются, поэтому их необходимо восстановить с помощью сценария.

Я использую скрипт в /etc/ppp/ip-ndomup,downcasts.d/dual-routing

# One of my connections is ~2x faster than the other
BALANCED=0.3
ALL_ISP1=0
ALL_ISP2=1

RULENUM=4
set_balance() {
    iptables -t mangle -R PREROUTING $RULENUM -m statistic --mode random --probability $0 -j MARK --set-mark 2
}

# if both up
set_balance $BALANCED
# if ppp1 down:
set_balance $ALL_ISP1
# if ppp0 down:
set_balance $ALL_ISP2

Это балансировка нагрузки на основе соединений, поэтому я собираюсь рассмотреть использование нагрузки для мониторинга и замены правила статистики: iptables -t mangle -R PREROUTING <n>из пространства пользователя. Таким образом, если на одно соединение выполняется длительная загрузка, а другое соединение загружено незначительно, мы должны предпочесть слегка загруженное соединение.

LBT
источник