WireGuard split tunneling: раздельное туннелирование трафика
Настройте WireGuard так, чтобы через VPN шёл только нужный трафик. Разбираем AllowedIPs, маршруты, проблемы DNS и типичные ошибки.
Содержание
WireGuard — это современный VPN-протокол, который по умолчанию туннелирует весь IP-трафик. Однако на практике часто требуется, чтобы через VPN шёл только трафик до определённых ресурсов, а остальной — напрямую. Такой режим называется split tunneling (раздельное туннелирование). В этой статье разберём, как настроить его в WireGuard без костылей и с минимальным риском ошибок.
Что такое split tunneling и зачем он нужен
Обычный VPN-маршрут отправляет все пакеты устройства в туннель, где они шифруются и передаются на VPN-сервер. Это надёжно, но приводит к лишним задержкам, расходу трафика и невозможности доступа к локальным ресурсам, например, к принтеру или домашней NAS одновременно с VPN-подключением. Split tunneling позволяет задать политику: какие подсети или домены идут через VPN, а какие — напрямую.
Основные сценарии:
- Обход географических блокировок для стриминга, но при этом сохранение быстрого доступа к местным сайтам.
- Работа с корпоративной сетью: через VPN ходит только служебный трафик, а интернет-сёрфинг — напрямую.
- Экономия мобильного трафика при подключении к публичному Wi-Fi — в туннель уходят только важные запросы.
Как WireGuard управляет маршрутизацией
В WireGuard маршрутизация определяется параметром AllowedIPs в конфигурации каждого пира. Это список IP-адресов или подсетей, которые доступны через данный пир. Для клиента AllowedIPs указывает, какие адреса следует отправлять в туннель. Если указано 0.0.0.0/0, то весь IPv4-трафик уходит через VPN. Для split tunneling достаточно перечислить конкретные подсети, например:
AllowedIPs = 10.10.0.0/16, 192.168.1.0/24Важно понимать: WireGuard не использует отдельные правила firewall, а полагается на системную таблицу маршрутизации. wg-quick автоматически добавляет маршруты для подсетей из AllowedIPs на клиенте. На сервере AllowedIPs также используется для контроля доступа и позволяет настроить маршрутизацию обратно к клиенту.
Базовая настройка: AllowedIPs на клиенте
Самый простой способ настроить split tunneling — изменить AllowedIPs в конфигурации клиента. Для этого отредактируйте файл интерфейса, обычно /etc/wireguard/wg0.conf на Linux или соответствующий конфиг в приложении на Windows/Android. Уберите 0.0.0.0/0 и вместо него впишите нужные подсети.
Пример конфигурации клиента:
[Interface]
PrivateKey = ...
Address = 10.10.0.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = ...
PresharedKey = ...
Endpoint = vpn.example.com:51820
AllowedIPs = 10.10.0.0/16, 192.168.10.0/24После перезапуска интерфейса (wg-quick down wg0 && wg-quick up wg0) трафик к подсетям 10.10.0.0/16 и 192.168.10.0/24 пойдёт через VPN, а всё остальное — напрямую. Обратите внимание, что DNS-запросы по умолчанию будут уходить через VPN, если задан параметр DNS. Это может привести к утечке: если вы не туннелируете весь трафик, но DNS идёт в туннель, то домены могут резолвиться некорректно. При необходимости оставьте DNS только для доменов из VPN-подсети или вообще уберите строку DNS, если он не нужен.
Настройка на стороне сервера
Сервер также должен разрешать маршрутизацию трафика для клиента. Если вы туннелируете только часть подсетей, сервер должен знать, куда отправлять ответные пакеты. Обычно это достигается автоматически: сервер видит источник пакета (IP клиента из его Address) и отправляет ответы через туннель обратно. Но если клиенту нужно получить доступ к другим подсетям за сервером (например, к 10.20.0.0/16), то на сервере должен быть настроен маршрут к этим подсетям через соответствующий интерфейс, а также включён IP-forwarding.
На Linux сервере добавьте в /etc/sysctl.conf:
net.ipv4.ip_forward = 1и примените (sysctl -p). Затем убедитесь, что в секции [Peer] для данного клиента в AllowedIPs указан его IP-адрес (например, 10.10.0.2/32) или подсеть клиентов. Это необходимо, чтобы сервер знал, какие IP считаются «доступными» через этого пира и куда отправлять ответы.
Пример пира на сервере:
[Peer]
PublicKey = ...
AllowedIPs = 10.10.0.2/32Если вы хотите, чтобы клиент мог получить доступ к другим клиентам той же VPN-сети, то в AllowedIPs можно указать общую подсеть, например, 10.10.0.0/24. Проверьте, что на сервере включён форвардинг и нет блокирующих правил firewall.
Динамические маршруты и исключения
Иногда нужно добавлять или удалять маршруты без перезапуска всего туннеля. Для этого можно использовать команды wg set, чтобы изменить AllowedIPs на лету, но это повлияет только на сам WireGuard, а не на таблицу маршрутизации. Более правильный способ — использовать утилиту ip route для добавления/удаления маршрутов вручную, при этом WireGuard-интерфейс уже существует.
Например, чтобы добавить маршрут к подсети 172.16.0.0/12 через wg0:
ip route add 172.16.0.0/12 dev wg0Но при таком подходе нужно быть осторожным: если сервер не знает об этой подсети (нет соответствующего AllowedIPs на сервере для клиента), пакеты могут не получить ответ. Для постоянных изменений лучше редактировать конфигурацию и перезапускать интерфейс.
Также можно настроить split tunneling на основе доменных имён, но это требует дополнительных инструментов (например, dnsmasq, policy routing и т.п.). В базовом WireGuard такой функциональности нет, поэтому используйте подсети.
Особенности и ограничения
Помните, что параметры могут различаться в зависимости от версии и вашего региона — проверьте документацию для вашей версии. На некоторых платформах (Windows, Android) графические клиенты имеют опцию «только для определённых приложений» или «split tunneling», но она может использовать собственные механизмы, а не чистый AllowedIPs. Внимательно читайте описание клиента.
Если вы туннелируете не весь трафик, следите за утечками DNS: если DNS-сервер указан в конфигурации, но маршрут до него не идёт через туннель, запросы могут уйти напрямую. Используйте AllowedIPs, включающий DNS-сервер, либо отключите DNS в WireGuard и настройте системный DNS отдельно.
Заключение
Split tunneling в WireGuard — это, по сути, правильная настройка AllowedIPs. Укажите на клиенте только те подсети, которые должны идти через VPN, и проверьте, что сервер корректно отвечает. Не забывайте о форвардинге и DNS. Этих действий достаточно для большинства задач.
Мини-чеклист
- Убедитесь, что на клиенте AllowedIPs не содержит 0.0.0.0/0, а только нужные подсети.
- Проверьте, что на сервере включён IP-forwarding (net.ipv4.ip_forward=1).
- Настройте DNS: если не туннелируете весь трафик, решите, должен ли DNS идти через VPN.
- После перезапуска интерфейса проверьте трассировку до ресурса: должно быть видно, что пакеты идут через wg0 или напрямую.
Частые ошибки
- Оставить AllowedIPs = 0.0.0.0/0 на клиенте — тогда весь трафик идёт через VPN, split tunneling не работает.
- Указать на сервере AllowedIPs клиента как 10.10.0.2/32, но не добавить маршрут для подсетей, которые должны быть доступны клиенту.
- Игнорировать DNS: если DNS-сервер не входит в AllowedIPs, запросы будут идти напрямую и могут раскрыть ваш IP.
- Вносить изменения только командой ip route, не меняя AllowedIPs — после перезапуска интерфейса маршруты исчезнут.
Источники и документация
FAQ
Что такое AllowedIPs в WireGuard?
AllowedIPs — это список IP-адресов и подсетей, которые разрешено отправлять через туннель. На клиенте он определяет, какой трафик шифруется и уходит на VPN-сервер. На сервере он используется для контроля доступа и маршрутизации обратно к клиенту.
Можно ли изменить маршруты без перезапуска туннеля?
Да, вы можете добавить или удалить маршруты вручную командой ip route. Однако такие изменения временные и исчезнут после перезапуска WireGuard. Для постоянной настройки редактируйте AllowedIPs в конфигурации.
Как туннелировать только трафик до одного сервера?
В AllowedIPs на клиенте укажите точный IP-адрес назначения с маской /32, например AllowedIPs = 192.0.2.10/32. Тогда только пакеты к этому адресу пойдут через VPN, а остальные — напрямую.
Хотите перейти сразу к рабочему доступу?
Если сценарий уже ясен и не хочется проходить все шаги вручную, оформите доступ и проверьте подключение на своем устройстве.
Получить доступ