Автоматическая маршрутизация при подключении 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.
Сравнение подходов
| Характеристика | OpenVPN | WireGuard |
|---|---|---|
| Добавление маршрутов | route-up | PostUp |
| Удаление маршрутов | route-pre-down | PreDown |
| Управление таблицей | через route-noexec | Table = off |
| Скрипт | внешний .sh | встроен в конфиг |
| Policy routing | возможен | возможен |
Для Windows
OpenVPN
Используйте Add-VpnConnectionRoute: маршруты привязываются к VPN-подключению, добавляются при соединении и автоматически удаляются при отключении.
WireGuard
В WireGuard for Windows чаще удобнее управлять маршрутизацией через AllowedIPs, а для особых случаев — через PowerShell/route-скрипты.
Практические рекомендации
Для обоих протоколов оптимальная схема:
AllowedIPs (WireGuard) /
route(OpenVPN) — только нужные подсетиPostUp (WireGuard) /
route-up(OpenVPN) — добавить дополнительные маршрутыPreDown (WireGuard) /
route-pre-down(OpenVPN) — удалить маршруты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-туннелями.