Маршрутизация трафика на локальный LAN-адрес при доступности, в противном случае использование WireGuard VPN

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

У меня настроен VPN WireGuard, использующий диапазон IP 10.20.30.0/24. Я хочу настроить маршрутизацию на своем ноутбуке так, чтобы трафик к 10.20.30.xy направлялся через 192.168.99.xy, когда последний доступен в локальной сети. Если локальный адрес не доступен, я хочу, чтобы трафик направлялся через туннель WireGuard, как обычно.

Я понимаю, что могу добиться этого примерно на 80%, используя скрипт, активируемый NetworkManager, каждый раз, когда я подключаюсь к локальной сети. Скрипт просто добавит необходимые маршруты с помощью:

Существует ли простой способ автоматизировать это, учитывая доступность локальной сети? Мне также интересно, не может ли быть решение с использованием OSPF или другого динамического протокола маршрутизации, который сможет автоматически определять доступность и соответственно настраивать маршрутизацию.

Есть ли простой способ автоматизировать это, учитывая доступность локальной сети?

Я думаю, что это, вероятно, самый близкий к решению вариант с вашей текущей сетевой конфигурацией.

Основная проблема в том, что обсуждаемый подсеть непосредственно назначен интерфейсу wg0 на вашем ноутбуке, и внешние маршруты обычно имеют низкий приоритет по сравнению с автоматическим маршрутом “локальная подсеть”. Поэтому часть вашего скрипта NM придется отключать wg0, когда он в локальной сети, и включать его снова, когда он находится в другом месте.

Динамические протоколы маршрутизации не помогут по той же причине – например, если демон OSPF настроен для работы на обоих интерфейсах eth0 и wg0 (чтобы предоставлять маршруты к удалённым подсетям), он всегда будет рассматривать 10.20.30.0/24 как локальную сеть на wg0.

Чтобы это работало правильно, следует изменить туннель WireGuard так, чтобы он не был VPN подсетью сам по себе, а вместо этого функционировал строго как точка-точка (например, /30), через которую достигается реальная подсеть 10.20.30.0/24, например, ваш ноутбук будет 10.20.255.2/30 с статическим маршрутом “10.20.30.0/24 via 10.20.255.1”.

Это позволит использовать OSPF (тем не менее, вам, вероятно, всё равно нужно будет включить OSPF на eth0, управляемый NetworkManager, чтобы не спамить Wi-Fi других людей частыми пакетами HELLO), но это также позволит вам использовать более простой подход, чтобы DHCP вашей локальной сети предоставлял прямой маршрут.

Возможно задействовать пользовательские маршруты через DHCP опцию 121 (или опцию 249 для WinXP) – однако вам всё равно придется внимательно выбирать метрику маршрута “через wg0”, чтобы она была достаточно высокой (т.е. чтобы она всегда имела более высокую метрику и, следовательно, более низкий приоритет, чем маршрут, полученный от DHCP). Например:

$ dhcpclassless @192.168.99.1 10.20.30.0/[email protected]
Маршруты:
    0.0.0.0/0 через 192.168.99.1
    10.20.30.0/24 через 192.168.99.123

Код опции: 121 (стандартный), 249 (MS предстандарт)
Данные опции: 0x00C0A86301180A141EC0A8637B

Mikrotik RouterOS:
/ip dhcp-server option
add name=classless code=121 value=0x00C0A86301180A141EC0A8637B
add name=ms-classless code=249 value=0x00C0A86301180A141EC0A8637B

ISC DHCP (старый):
option option-121 0:c0:a8:63:1:18:a:14:1e:c0:a8:63:7b;

С этой конфигурацией ваш ноутбук будет учить “10.20.30.0/24 через 192.168.99.123 метрика 600” (например) от DHCP, когда находится в локальной сети, но будет возвращаться к статически определенному “10.20.30.0/24 через 10.20.255.1 метрика 9999”, когда находится в роуминге.

Ответ или решение

Чтобы настроить маршрутизацию трафика на адреса локальной сети (LAN) при их доступности, а в противном случае использовать WireGuard VPN, необходимо правильно сконфигурировать маршруты на вашем ноутбуке. Основная идея состоит в том, чтобы создавать маршруты которые бы в первую очередь использовали локальные адреса, а при их недоступности — VPN.

1. Настройка WireGuard

Как уже упомянуто, ваша конфигурация WireGuard использует подсеть 10.20.30.0/24. Чтобы упростить процесс маршрутизации и избежать конфликтов, я рекомендую изменить конфигурацию WireGuard на точечно-точечный канал (например, использовать подсеть /30, например 10.20.255.0/30), чтобы ваш ноутбук получал адрес, например, 10.20.255.2, и получал доступ к 10.20.30.0/24 через статический маршрут к 10.20.255.1.

2. DHCP с маршрутами

Следующий шаг заключается в настройке DHCP-сервера для обеспечения вашего ноутбука дополнительным маршрутом к сети 10.20.30.0/24. Для этого можно использовать опцию DHCP 121 (classless static routes) для передачи информации о маршрутах.

Пример конфигурации DHCP:

/ip dhcp-server option
add name=classless code=121 value=0x00C0A86301180A141EC0A8637B

Здесь важным моментом является указание метрики маршрута. Для локального маршрута метрика должна быть ниже, чем у маршрута через VPN.

3. Сценарий для NetworkManager

Используйте сценарий, привязанный к NetworkManager, чтобы автоматически добавлять или удалять маршруты в зависимости от доступности локальной сети. Как только ваш ноутбук подключится к сети 192.168.99.0/24, он должен добавлять локальные маршруты. Если локальная сеть недоступна, вы удаляете эти маршруты, и использовать WireGuard по умолчанию.

Пример сценария на Bash может выглядеть так:

#!/bin/bash

LOCAL_NETWORK="192.168.99.0/24"
WG_INTERFACE="wg0"
WG_ROUTE="10.20.30.0/24 via 10.20.255.1 metric 9999"
LOCAL_ROUTE="10.20.30.0/24 via 192.168.99.1 metric 600"

if ip route show | grep -q "$LOCAL_NETWORK"; then
    # Если локальная сеть доступна, добавьте маршрут
    ip route add $LOCAL_ROUTE
else
    # Если локальная сеть недоступна, добавьте маршрут через WireGuard
    ip route add $WG_ROUTE
fi

4. Использование OSPF

Использование динамического протокола маршрутизации, такого как OSPF, также возможно, но как было отмечено, это может усложнить конфигурацию из-за конфликта с маршрутами. Если вы все же решите использовать OSPF, вам нужно будет настроить демона OSPF так, чтобы он правил маршрутизацией для eth0 и игнорировал wg0.

Заключение

Это подход, который позволяет реализовать желаемую маршрутизацию. Изменение настройки WireGuard, добавление маршрутов через DHCP и использование скриптов NetworkManager помогут вам в достижении автоматической маршрутизации. Надеюсь, это поможет вам в правильной настройке вашей сети.

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

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