TimVin

Автоматическая маршрутизация при подключении VPN и очистка после отключения — ключевая задача для корректной работы туннелей. Ниже практические решения для OpenVPN и WireGuard на Linux.


OpenVPN

Принцип работы

Для OpenVPN используются шуки:

  • route-noexec — запрещаем OpenVPN автоматически добавлять маршруты

  • script-security 2 — разрешаем запуск скриптов

  • route-up — добавить маршруты при поднятии туннеля

  • route-pre-down — удалить маршруты перед отключением

Конфиг OpenVPN-клиента

client
dev tun
proto udp
remote vpn.example.com 1194

script-security 2
route-noexec

route-up /etc/openvpn/routes.sh
route-pre-down /etc/openvpn/routes.sh

Скрипт для маршрутов

#!/bin/sh
case "$script_type" in
route-up)
ip route add 192.168.10.0/24 via "$route_vpn_gateway" dev "$dev"
ip route add 10.10.0.0/16 via "$route_vpn_gateway" dev "$dev"
;;
route-pre-down)
ip route del 192.168.10.0/24 via "$route_vpn_gateway" dev "$dev"
ip route del 10.10.0.0/16 via "$route_vpn_gateway" dev "$dev"
;;
esac

Сохраните в /etc/openvpn/routes.sh и добавьте права:.

chmod +x /etc/openvpn/routes.sh

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

  • Маршруты добавляются только при активном туннеле

  • Корректная очистка таблицы маршрутизации при отключении

  • Полный контроль над policy routing

  • Удобен для split tunnel и маршрутизации в отдельной таблице


WireGuard

Принцип работы

Для WireGuard используются директивы конфигурационного файла:

  • PostUp — добавить маршруты/правила после поднятия интерфейса

  • PreDown — удалить маршруты перед остановкой интерфейса (важнее, чем PostDown)

  • Table = off — полное ручное управление таблицей маршрутизации

Почему именно PreDown

Использование PreDown вместо PostDown гарантирует, что маршруты будут удалены ещё до исчезновения интерфейса wg0, что критично для корректной очистки таблицы маршрутизации и policy routing.

Конфиг WireGuard-клиента

[Interface]
Address = 10.10.0.2/32
PrivateKey = <ваш_приватный_ключ>
Table = off

PostUp = ip route add 192.168.10.0/24 dev %i
PostUp = ip route add 10.20.0.0/16 dev %i

PreDown = ip route del 192.168.10.0/24 dev %i
PreDown = ip route del 10.20.0.0/16 dev %i

[Peer]
PublicKey = <public_key_сервера>
Endpoint = vpn.example.com:51820
AllowedIPs = 10.10.0.0/24
PersistentKeepalive = 25

Policy routing для WireGuard

Пример для раздельной маршрутизации TCP 22 через отдельную таблицу:

[Interface]
Address = 10.192.122.1/24
PrivateKey = ...
Table = 1234

PostUp = ip rule add ipproto tcp dport 22 table 1234
PreDown = ip rule delete ipproto tcp dport 22 table 1234

Full-tunnel вариант

Если нужен пропуск всего трафика через туннель:

[Peer]
AllowedIPs = 0.0.0.0/0

Для исключений добавляйте отдельные PostUp/PreDown команды или используйте policy routing.


Сравнение подходов

ХарактеристикаOpenVPNWireGuard
Добавление маршрутовroute-upPostUp
Удаление маршрутовroute-pre-downPreDown
Управление таблицейчерез route-noexecTable = off
Скриптвнешний .shвстроен в конфиг
Policy routingвозможенвозможен

Для Windows

OpenVPN

Используйте Add-VpnConnectionRoute: маршруты привязываются к VPN-подключению, добавляются при соединении и автоматически удаляются при отключении.

WireGuard

В WireGuard for Windows чаще удобнее управлять маршрутизацией через AllowedIPs, а для особых случаев — через PowerShell/route-скрипты.


Практические рекомендации

Для обоих протоколов оптимальная схема:

  1. AllowedIPs (WireGuard) / route (OpenVPN) — только нужные подсети

  2. PostUp (WireGuard) / route-up (OpenVPN) — добавить дополнительные маршруты

  3. PreDown (WireGuard) / route-pre-down (OpenVPN) — удалить маршруты

  4. Table = off (WireGuard) / route-noexec (OpenVPN) — полный ручной контроль


Ключевые моменты

  • OpenVPN: route-noexec + route-up + route-pre-down + внешний скрипт

  • WireGuard: PostUp + PreDown + Table = off (встроен в конфиг)

  • WireGuard: использовать PreDown, а не PostDown для удаления перед исчезновением интерфейса

  • Оба подхода корректно работают с policy routing и split tunnel


Инструкция подходит для системных администраторов, DevOps и специалистов по сетевой инфраструктуре, работающих с Linux-серверами и VPN-туннелями.

Рубрики: LinuxMicrosoft