Как настроить таблицы маршрутизации для двух динамических IP-подключений WAN с использованием nmcli

Вопрос или проблема

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

  1. Создайте новый скрипт в /etc/NetworkManager/dispatcher.d:
sudo nano /etc/NetworkManager/dispatcher.d/50-routing-table
  1. Напишите в скрипте следующее (не забудьте сделать его исполняемым):
#!/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
  1. Сделайте файл исполняемым:
sudo chmod +x /etc/NetworkManager/dispatcher.d/50-routing-table

Преимущества подхода

  • Автоматизация: Скрипты в dispatcher.d обеспечивают автоматическое обновление правил маршрутизации при каждом активации соединения, убирая необходимость вручную повторно конфигурировать маршруты после перезагрузки системы или отключения связи.

  • Динамичность: Через использование env-переменных Network Manager, скрипты могут получать и использовать такие параметры, как динамический шлюз, что существенно упрощает настройку и управление сетевыми маршрутами.

  • Гибкость: Эксплуатация таких скриптов позволяет легко расширять возможности маршрутизации, добавляя новые правила и условия, необходимые для более сложных сетевых конфигураций.

Таким образом, использование nmcli в комбинации с скриптами диспетчера в /etc/NetworkManager/dispatcher.d позволяет достигнуть высокой степени автоматизации и гибкости в управлении политиками маршрутизации для динамических WAN-соединений.

Оцените материал
Добавить комментарий

Капча загружается...