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

Как мне настроить маршрут по умолчанию на маршрутизаторе Linux с двумя ссылками на ISP?

Итак, вот ситуация.

У меня есть двойные ссылки ISP, которые в настоящее время активны и работают для маршрутизации трафика из моей сети, с настройкой iptables, очень похожей на принятый ответ на Балансировка нагрузки и NAT-подключение нескольких подключений к Интернет-провайдеру в Linux

У меня две строчки в моем /etc/iproute2/rt_tables которые выглядят так:

...
10 COMCAST
20 CENTURYLINK
...

Я настроил маршруты в каждой таблице с соответствующим шлюзом по умолчанию и установил следующие правила:

ip rule add fwmark 1 table COMCAST prio 33000
ip rule add fwmark 2 table CENTURYLINK prio 33000

Затем я настроил маркировку и маршрутизацию пакетов на основе iptables:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
CONNMARK   all  --  anywhere             anywhere             CONNMARK restore
ACCEPT     all  --  anywhere             anywhere             mark match ! 0x0
MARK       all  --  anywhere             anywhere             MARK set 0x1
MARK       all  --  anywhere             anywhere             statistic mode random probability 0.33300000010 MARK set 0x2
CONNMARK   all  --  anywhere             anywhere             CONNMARK save

Проблема в том, что если я оставлю общесистемный маршрут по умолчанию (как в ip route list без table аргументы) для любого интернет-провайдера, похоже, что это отменяет iptables маршрутизация для клиентских машин - никакие пакеты не проходят через нестандартное соединение, согласно watch -n 1 ifconfig [interface]. Если я удалю общесистемный маршрут по умолчанию, маршрутизация будет отлично работать для всех моих клиентских машин, при этом 33% пакетов проходят через линию CenturyLink, а остальные - через линию Comcast. Это круто!

Однако отсутствие маршрута по умолчанию нарушает все, что требует подключения к Интернету на самом маршрутизаторе. Я не могу бежать apt-get update на роутере, например. Итак, как мне настроить маршрут по умолчанию для системы, который не отменяет iptables настройка маршрутизации? Я попытался настроить многопутевый маршрут в соответствии с инструкциями сайта LARTC следующим образом:

ip route add default scope global nexthop via $P1 dev $IF1 weight 1 nexthop dev $IF2 weight 1

(Мне пришлось немного изменить руководство LARTC, потому что маршрут по умолчанию для соединения CenturyLink не имеет IP-адреса шлюза, просто dev ppp0, и он работает для шлюза по умолчанию для этой таблицы.)

Но многопутевый маршрут разрушает все на сервере И на клиентах, для которых он маршрутизируется. Помогите?

Я смог разобраться в этом самостоятельно.

Решением на тот случай, если кто-то еще столкнется с подобной ситуацией, было изменение приоритета ip rule записи для fwmark. Я не читал lbt ответ на связанный вопрос достаточно осторожно; он особо отмечает, что установка приоритета на 33000 заставит эти правила вступить в силу после в default поиск в таблице, что противоположно тому, что я хочу. Итак, я изменил правила, чтобы они выглядели так:

100:    from all fwmark 0x1 lookup COMCAST
100:    from all fwmark 0x2 lookup CENTURYLINK

И теперь наличие маршрута по умолчанию не нарушает маршрутизацию на основе брандмауэра, и я могу запустить apt-get и все другие мои программы без каких-либо проблем. Ура!