У меня есть два интернет-соединения от двух разных интернет-провайдеров, и мне нужно сбалансировать трафик, исходящий в мою сеть и из моей сети, между двумя интернет-провайдерами. Я использую 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 для равномерного распределения пакетов по каждой таблице маршрутизации. Более подробную информацию о том, как эта работа, можно найти здесь (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 - это просто:
# 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>
из пользовательского пространства. Поэтому, если по одному соединению выполняется длительная загрузка, а другое соединение загружено слабо, мы должны предпочесть слабо загруженное соединение.