Split Tunneling в WireGuard через AllowedIPs
В WireGuard параметр AllowedIPs одновременно и ACL-фильтр, и таблица маршрутизации. NetRoute Pro генерирует готовую строку AllowedIPs из доменов любого сайта — дополнительные ip route команды не нужны, просто отредактируйте конфиг пира и перезапустите туннель.
Синтаксис команды
Синтаксис:
AllowedIPs = <CIDR1>, <CIDR2>, <CIDR3>
Пример:
AllowedIPs = 1.1.1.0/24, 8.8.8.0/24, 162.159.0.0/16
Добавьте в секцию [Peer] файла wg0.conf. Описано в официальном quickstart WireGuard.
Что понадобится
- Любой клиент WireGuard:
wg-quickна Linux, WireGuard GUI на Windows/macOS, мобильные приложения Android/iOS или роутер с WireGuard - Расширение NetRoute Pro в Chrome
- Доступ к конфигу пира (файл
.confили настройки в GUI)
Шаг 1. Сгенерируйте AllowedIPs в NetRoute Pro
- Откройте нужный сайт в Chrome
- Нажмите на иконку NetRoute Pro в панели расширений
- Выберите платформу WireGuard
- Нажмите Analyze Website
- Скопируйте полученную строку вида:
AllowedIPs = 104.21.32.0/24, 172.67.182.0/24, ...
Шаг 2. Вставьте AllowedIPs в конфиг пира
Linux (wg-quick)
Отредактируйте файл конфига (обычно /etc/wireguard/wg0.conf) и замените строку AllowedIPs в секции [Peer]:
[Interface]
PrivateKey = <ваш приватный ключ>
Address = 10.0.0.2/32
[Peer]
PublicKey = <публичный ключ сервера>
Endpoint = vpn.example.com:51820
AllowedIPs = 104.21.32.0/24, 172.67.182.0/24, ...
PersistentKeepalive = 25
Windows / macOS (GUI)
- Откройте приложение WireGuard
- Выберите ваш туннель и нажмите Edit tunnel
- В секции
[Peer]замените значение поляAllowedIPs - Нажмите Save
Android / iOS
- Откройте приложение WireGuard и выберите ваш туннель
- Нажмите на пира → поле Allowed IPs
- Вставьте новый список подсетей
- Нажмите Save явно — приложение иногда сбрасывает изменения при выходе без сохранения
Шаг 3. Перезапустите туннель
Чтобы новые AllowedIPs применились, переподключите туннель:
- Linux:
sudo wg-quick down wg0 && sudo wg-quick up wg0 - Windows / macOS: в GUI выключите и включите туннель
- Android / iOS: отключите и включите переключатель туннеля
DNS leak — обязательно прочитать
WireGuard через AllowedIPs направляет трафик по IP. DNS он не направляет. Браузер всё равно спрашивает у системного резолвера (обычно ISP, через DHCP) какой IP у example.com — через туннель идёт только сам IP-трафик. ISP видит какие сайты вы посещаете, даже если данные зашифрованы.
Три варианта в зависимости от модели угроз:
- Полностью спрятать DNS от ISP (split-DNS через wg-quick). Добавьте строку
DNS =в[Interface]— wg-quick применит её при подъёме туннеля:
Записи[Interface] PrivateKey = ... Address = 10.0.0.2/24 DNS = 10.0.0.1, ~example.com, ~another-site.com~домензаставляют systemd-resolved использовать VPN-DNS только для этих доменов (split-DNS). Без них через VPN-DNS пойдут все запросы. - Снизить видимость для ISP (публичный DoH/DoT). Используйте публичный резолвер для всего:
ISP больше не видит запросы; их видит Cloudflare.DNS = 1.1.1.1, 1.0.0.1 - Принять leak. Уберите строку
DNSсовсем — шифруется только данные, lookup'ы остаются на дефолтном резолвере. Подходит для случая "просто разблокировать сайт".
Проверить: dnsleaktest.com или browserleaks.com/dns — показанный резолвер должен принадлежать вашему VPN-провайдеру или выбранному DoH, не ISP.
Утечки IP в браузере (WebRTC)
Даже когда split tunneling корректно настроен на уровне ОС, JavaScript на странице может через WebRTC (STUN/ICE) узнать ваш реальный локальный и публичный IP, минуя VPN. Это by design (для P2P видео/аудио нужны прямые адреса), не баг — но это утечка которую VPN не может предотвратить на сетевом уровне.
- Chrome/Edge: откройте
chrome://flags/#enable-webrtc-hide-local-ips-with-mdnsи включите. Скрывает локальный IP за per-session mDNS-hostname. - Firefox:
about:config→ установитеmedia.peerconnection.enabledвfalse, если не пользуетесь WebRTC-приложениями. Более точечно — через per-site policy. - uBlock Origin (любой браузер): Settings → Privacy → включите «Prevent WebRTC from leaking local IP addresses».
- Тест на browserleaks.com/webrtc — публичный IP должен соответствовать VPN exit, не ISP.
IPv6 dual-stack bypass
Записи AllowedIPs в WireGuard специфичны для address family. Если вы перечислили только IPv4-префиксы, трафик к тому же домену через IPv6 (а его большинство современных сайтов предпочитают согласно RFC 6724) пройдёт мимо туннеля через дефолтный v6-маршрут ISP.
Два варианта решения:
- Маршрутизировать v6 тоже (если у вашего VPN есть IPv6-endpoint). Добавьте v6-префиксы рядом с v4:
Для всего v6 через туннель:AllowedIPs = 1.1.1.0/24, 8.8.8.0/24, 2606:4700::/32, 2001:4860::/32AllowedIPs = 0.0.0.0/0, ::/0. - Отключить IPv6 системно если VPN не поддерживает v6. На Linux:
sysctl net.ipv6.conf.all.disable_ipv6=1. На Windows: отключить IPv6 на активном адаптере. На роутерах: per-WAN переключатель IPv6. Весь трафик откатится на v4 и будет тунелирован.
Fail-closed (kill switch)
Когда WireGuard-туннель падает (смена сети, ручной стоп, ошибка маршрутизации), ядро убирает маршруты привязанные к wg-интерфейсу — и трафик к ранее-тунелированным CIDR'ам уходит через дефолтный маршрут. Используйте PostUp/PostDown wg-quick для firewall-правил, привязанных к жизненному циклу туннеля:
[Interface]
PrivateKey = ...
Address = 10.0.0.2/24
# Fail-closed: дропать трафик к тунелированным CIDR'ам если он не идёт через %i (этот туннель)
PostUp = iptables -I OUTPUT ! -o %i -d 1.1.1.0/24 -j REJECT
PostUp = iptables -I OUTPUT ! -o %i -d 8.8.8.0/24 -j REJECT
PostDown = iptables -D OUTPUT ! -o %i -d 1.1.1.0/24 -j REJECT
PostDown = iptables -D OUTPUT ! -o %i -d 8.8.8.0/24 -j REJECT
%i заменяется на реальное имя интерфейса (например wg0). Когда туннель поднят, трафик идёт через него; при wg-quick down правила удаляются. Если туннель падает аварийно без выполнения PostDown — CIDR'ы остаются заблокированы, что и есть безопасный failure mode (блок, не leak).
Для продвинутых: Table = off
По умолчанию wg-quick добавляет маршрут для каждого CIDR из AllowedIPs в главную таблицу маршрутизации. Table = off под [Interface] отключает автоматическую установку маршрутов — вы управляете routing'ом сами через PostUp/PostDown. Полезно когда нужен policy routing (по source IP, fwmark, процессу), кастомная routing-таблица или интеграция с frr/bird/quagga.
[Interface]
PrivateKey = ...
Address = 10.0.0.2/24
Table = off # не устанавливать маршруты автоматически
# Управляйте маршрутами сами — пример policy routing:
PostUp = ip route add 1.1.1.0/24 dev %i table 100
PostUp = ip rule add from 192.168.1.100 lookup 100
PostDown = ip rule del from 192.168.1.100 lookup 100
PostDown = ip route flush table 100
Большинству это не нужно — дефолтное поведение (автоинсталл маршрутов из AllowedIPs) и есть то, на что рассчитан вывод NetRoute Pro.
Проверка
Команда sudo wg show отобразит пира с применёнными allowed ips:
sudo wg show
В выводе должны быть все подсети, которые вы указали. На клиенте в LAN можно дополнительно проверить:
tracert example.com # Windows
traceroute example.com # Linux/macOS
Первые хопы должны идти через WireGuard-эндпоинт.
Частые проблемы
Страницы зависают или грузятся частично (PMTU black hole)
Симптом: страница начинает грузиться, приходят первые килобайты, потом замирает; или одни сайты работают, другие — нет. Классический path MTU black hole — большие пакеты дробятся по пути, ICMP «fragmentation needed» блокируется upstream firewall'ом, отправитель ретрансмитит вслепую.
Дефолтный MTU WireGuard — 1420 (или 1280 по IPv6). На PPPoE реальный канал 1492; на 4G/LTE часто 1400; на некоторых CGNAT — 1280. Понизьте MTU под [Interface]:
[Interface]
MTU = 1380 # попробуйте 1380, далее 1280 / 1200 если страницы всё ещё зависают
На роутерах которые форвардят через туннель (WG-клиент на роутере с LAN-клиентами) дополнительно clamp'ните TCP MSS чтобы downstream клиенты не превышали PMTU:
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu
Пропал весь интернет
Убрали 0.0.0.0/0, но новый AllowedIPs не покрывает нужные подсети. Добавьте явно все подсети, которые должны идти через VPN, или верните 0.0.0.0/0.
На Android туннель бесконечно "connecting"
Приложение не сохранило изменения. Откройте туннель, ещё раз впишите AllowedIPs, явно нажмите Save и переподключитесь.
Error: AllowedIPs has invalid format
Проверьте запятые и переносы строк в конфиге: подсети в одну строку, разделены запятой с пробелом. Никаких лишних переносов внутри значения.
Пример конфигурационного файла
Готовый шаблон с комментариями. Замените примеры маршрутов выводом NetRoute Pro для ваших сайтов.
wireguard-split-tunnel.conf— Конфиг пира WireGuard со сплит-туннелем черезAllowedIPs
# Example WireGuard peer config with split tunneling.
# Generated by NetRoute Pro: https://alexander2k.github.io/netroute-site/
#
# AllowedIPs in [Peer] section doubles as both an ACL and routing table.
# Only the listed networks are sent through the tunnel — everything else
# uses the default route. Replace placeholders with your real keys/addresses.
[Interface]
PrivateKey = YOUR_CLIENT_PRIVATE_KEY
Address = 10.0.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = YOUR_SERVER_PUBLIC_KEY
Endpoint = your.vpn.server:51820
PersistentKeepalive = 25
# Networks to route via VPN — add/remove based on NetRoute Pro output.
AllowedIPs = 1.1.1.0/24, 8.8.8.0/24, 162.159.0.0/16
# To route everything via VPN, use: AllowedIPs = 0.0.0.0/0, ::/0
# Apply with: sudo wg-quick down wg0 && sudo wg-quick up wg0
Подсказка: Нужен конфиг без строк-комментариев? В настройках NetRoute Pro снимите галочку «Включать комментарии в экспортируемые файлы» — расширение выгрузит только команды маршрутизации. Полезно для роутеров, которые не принимают комментарии.
Все примеры конфигов на GitHub →
Официальная документация
- WireGuard Quick Start (en)
- wg-quick(8) man page (en)
- wg(8) — синтаксис конфига (en)
- Pro Custodibus: AllowedIPs Calculator (en)
Похожие инструкции
- Keenetic — маршруты из BAT-файла
- MikroTik — импорт
.rsc-скрипта в RouterOS - Linux —
ip routeчерез shell-скрипт - OpenVPN — директивы
routeв клиентском конфиге
Готовы попробовать?
NetRoute Pro — бесплатное расширение Chrome для генерации маршрутов из любого сайта.
Установить расширение