Итак, вот ситуация.
У меня есть двойные ссылки 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
и все другие мои программы без каких-либо проблем. Ура!