Ответ 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>
из пространства пользователя. Таким образом, если на одно соединение выполняется длительная загрузка, а другое соединение загружено незначительно, мы должны предпочесть слегка загруженное соединение.