Завантажте балансування та NAT-ing декількох підключень 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-сервера для всіх машин в локальній мережі.

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

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

Будь-яка допомога буде вдячна.

PS - Я знаю про pFsense, але мені потрібно використовувати Linux.


2
які інструкції вам потрібні? все пояснено на lartc.org. У вас зокрема є якісь проблеми?
lorenzog

Відповіді:


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, щоб додати карту між номерами таблиці маршрутів та іменами провайдера ISP

...
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

3
Гарна відповідь за посиланнями. Вам не обов’язково потрібні нові iptables, щоб це зробити, як і раніше, коли відбулося збіг статистики, там були випадкові та n-ті збіги, які виконують ту саму роль.
SiegeX

1
У мене питання щодо позначок на iptables. У посиланні, розміщеному, вони позначають лише ті пакети, які відповідають новому стану. Чому ти це робиш інакше?
Матіас

Чи можу я використовувати ще одну мережу, наприклад ISP3, ISP4 тощо?
Вітор Мазуко

3

Відповідь mefat мені дуже допомогла, але замість одноразової копії всіх основних правил таблиці у дві таблиці провайдерів, кращим підходом може бути використання правила prio для додання правил за замовчуванням після основної таблиці.

Налаштуйте / etc / iproute2 / rt_tables як звичайне:

...
10 ISP1
20 ISP2
...

Зауважте, що

ip rule show

Показує правила 0-> локальні, 32766-> основні та 32767-> за замовчуванням. Дивіться 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

ще раз перевірити, що ці правила є вищими за основні

Тоді використовуйте CONNMARK mangling, як сказав м'ясо:

# 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інакше, він встановлюється в основному; коли пристрій перезапускається, таблиці 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>з користувальної області. Отже, якщо на одному з’єднанні є тривала завантаження, а інше з'єднання злегка завантажене, слід віддавати перевагу злегка завантаженому з'єднанню.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.