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

Балансировка нагрузки и NAT-подключение нескольких подключений к Интернет-провайдеру в Linux

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

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

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

eth1 (192.168.1.0/24) - провайдер №1

eth2 (192.168.2.0/24) - провайдер №2

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

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

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

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

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

Я выполнил балансировку нагрузки с помощью 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 таблицы маршрутизации, по одной для каждого провайдера.

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

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

...
10 ISP1
20 ISP2
...

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

ip rule show

Показывает правила 0-> local, 32766-> main и 32767-> default. Видеть man ip Больше подробностей.

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

См. Раздел «бросок» здесь: 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

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

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

# 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

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

Я использую скрипт в /etc/ppp/ip-{up,down}.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> из пользовательского пространства. Поэтому, если по одному соединению выполняется длительная загрузка, а другое соединение загружено слабо, мы должны предпочесть слабо загруженное соединение.