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