Вопрос или проблема
У меня есть два WAN-подключения, поступающие в мой самодельный маршрутизатор на базе Linux. Оба представлены как Ethernet-подключения. Одно использует DHCP, другое — PPPoE. Оба я настроил с помощью nmcli.
Следующий шаг — использовать политическую маршрутизацию для выбранных систем. В качестве теста я добавил таблицу маршрутизации для каждого WAN-подключения, создал два новых IP-адреса на стороне LAN маршрутизатора и добавил IP-правило для каждого из этих IP-адресов, чтобы использовать одну из таблиц маршрутизации. Это также работает нормально при ручной настройке с помощью команд iproute2.
Проблема возникает, когда я пытаюсь настроить этот сценарий с помощью nmcli. Я близок к цели с:
nmcli con mod pppoe ipv4.routes "0.0.0.0/0 onlink=1 table=200"
nmcli con mod pppoe ipv4.routing-rules "priority 999 from 10.87.3.204 lookup 200"
nmcli con up pppoe
nmcli con mod eth2 ipv4.routes "0.0.0.0/0 onlink=1 table=201"
nmcli con mod eth2 ipv4.routing-rules "priority 999 from 10.87.3.59 lookup 201"
nmcli con up eth2
Я был приятно удивлен, обнаружив, что соединение PPPoE действительно работает, так как отсутствие параметра nexthop в правиле по умолчанию использует устройство для маршрутизации, что именно я и сделал вручную.
Однако то же самое для соединения DHCP не работает, так как использование ‘dev eth2’ для маршрута является неправильным… Нужен адрес следующего хопа/шлюза, который является динамическим и что я сделал вручную.
Очевидно, что скрипт обновления таблицы маршрутизации прост, но было бы лучше, если бы это делал NetworkManager при подключении. Очевидно, у него будет эта информация, как интерфейс ppp известен для соединения PPPoE.
Существует ли механизм для встраивания ip4.gateway в строку маршрутизации? Или есть другой способ достижения той же цели?
Я не эксперт по nmcli, так как много лет назад я всегда избегал его. Сейчас мне нравится вызов справляться с ним, поэтому надеюсь, что я упустил что-то очень базовое, чему я не научился на своем пути до сих пор.
Любая помощь будет признательна
Вместо определения статических маршрутов, используйте опцию ipv4.route-table
, чтобы NetworkManager помещал полученные динамически маршруты в указанную таблицу. См. man nm-settings
.
Используйте /etc/NetworkManager/dispatcher.d для написания скриптов обновлений после активации профиля подключения. Скрипты получают все детали через переменные среды.
Ответ или решение
Конфигурирование таблиц маршрутизации для двух динамических WAN-подключений с помощью nmcli — это сложная задача, особенно в условиях динамического назначения IP-адресов через DHCP и PPPoE. Давайте рассмотрим более подробно, как правильно настроить эту систему в Linux для обеспечения эффективного использования и автоматизации данного процесса через Network Manager.
Теория
Суть задачи заключается в создании и управлении таблицами маршрутизации, которые позволяют различным устройствам в сети использовать разные WAN-соединения в зависимости от заданных правил. Для достижения этой цели мы используем такие инструменты, как nmcli
— командная строка для управления Network Manager, и iproute2
для манипуляции IP-маршрутами и правилами.
Когда у вас есть два WAN-соединения, каждое из которых должно обрабатывать трафик от определенных IP-адресов в вашей локальной сети, очень важно правильно настроить политику маршрутизации. Первое соединение у вас через PPPoE, а второе через DHCP. PPPoE удобно в том, что маршрутизация по умолчанию идет через указываемое устройство, тогда как для DHCP необходимо указывать шлюз, получаемый динамически.
Пример
Ваша текущая настройка через nmcli
для PPPoE-соединения выглядит следующим образом:
nmcli con mod pppoe ipv4.routes "0.0.0.0/0 onlink=1 table=200"
nmcli con mod pppoe ipv4.routing-rules "priority 999 from 10.87.3.204 lookup 200"
nmcli con up pppoe
Эти команды позволяют маршрутизировать весь трафик (0.0.0.0/0) через новый маршрут, используя таблицу 200, что настроено на PPPoE-соединение. Однако, при попытке сделать аналогичное для DHCP возникает проблема с указанием динамического шлюза.
Применение
Чтобы решить эту проблему с DHCP, мы можем использовать скрипты диспетчера Network Manager. Эти скрипты, находящиеся в /etc/NetworkManager/dispatcher.d
, могут автоматически обновлять таблицы маршрутизации и правила, когда соединение активируется. Вот пример, как это можно сделать:
- Создайте новый скрипт в
/etc/NetworkManager/dispatcher.d
:
sudo nano /etc/NetworkManager/dispatcher.d/50-routing-table
- Напишите в скрипте следующее (не забудьте сделать его исполняемым):
#!/bin/bash
interface=$1
status=$2
if [ "$status" == "up" ]; then
if [ "$interface" == "eth2" ]; then
# Получаем динамическую информацию о новым шлюзе
GW=$(ip route show dev eth2 | grep default | cut -d' ' -f3)
# Добавляем маршрутизацию с использованием новой таблицы
ip route add table 201 default via $GW dev eth2
ip rule add priority 999 from 10.87.3.59 lookup 201
fi
fi
- Сделайте файл исполняемым:
sudo chmod +x /etc/NetworkManager/dispatcher.d/50-routing-table
Преимущества подхода
-
Автоматизация: Скрипты в
dispatcher.d
обеспечивают автоматическое обновление правил маршрутизации при каждом активации соединения, убирая необходимость вручную повторно конфигурировать маршруты после перезагрузки системы или отключения связи. -
Динамичность: Через использование env-переменных Network Manager, скрипты могут получать и использовать такие параметры, как динамический шлюз, что существенно упрощает настройку и управление сетевыми маршрутами.
-
Гибкость: Эксплуатация таких скриптов позволяет легко расширять возможности маршрутизации, добавляя новые правила и условия, необходимые для более сложных сетевых конфигураций.
Таким образом, использование nmcli
в комбинации с скриптами диспетчера в /etc/NetworkManager/dispatcher.d
позволяет достигнуть высокой степени автоматизации и гибкости в управлении политиками маршрутизации для динамических WAN-соединений.