Заворачивать в туннель весь трафик нужно не всегда. Банк может не любить вход из другой страны, локальный принтер перестаёт отвечать, а видео с ближайшего сервера незачем гонять через половину континента. Отсюда потребность разделить: часть трафика в туннель, часть — напрямую.

Способов три, и они работают на разных уровнях.

AllowedIPs — это не список разрешений

Главное недоразумение WireGuard начинается с названия параметра.

[Peer]
AllowedIPs = 0.0.0.0/0

Читается как «разрешённые адреса», а работает как таблица маршрутизации. У этого параметра две роли одновременно:

  • исходящий трафик: какие адреса отправлять в этот туннель. wg-quick создаёт для них системные маршруты;
  • входящий трафик: пакеты с каких адресов принимать от этого пира. Пришедшее с адреса вне списка отбрасывается.

Поэтому 0.0.0.0/0 означает не «разрешить всё», а «весь исходящий трафик направить сюда». Меняя это значение, вы правите маршруты, а не права доступа.

Разделение по адресам: самое простое

Если нужно завернуть только определённые подсети, они перечисляются напрямую:

AllowedIPs = 203.0.113.0/24, 198.51.100.0/24

Всё остальное пойдёт мимо туннеля. Работает без дополнительных средств, поддерживается везде, включая роутеры.

Обратная задача — «весь трафик, кроме одной подсети» — решается сложнее: исключений формат не поддерживает, и диапазон приходится разбивать на части, которые в сумме дают всё пространство минус исключаемое. Считать это руками неудобно, для чего существуют онлайн-калькуляторы AllowedIPs.

Разделение по приложениям

Хочется другого: браузер в туннель, торрент-клиент напрямую. По адресам это не выражается — адреса у них общие.

Решения зависят от системы:

  • Android — встроено. В клиенте WireGuard есть список приложений с выбором «включить только эти» или «исключить эти». Работает на уровне системы, надёжно.
  • Windows — штатного механизма нет, нужны сторонние средства, работающие на уровне драйвера.
  • Linux — через отдельный сетевой namespace: туннель поднимается внутри него, и туда помещаются только нужные процессы. Способ мощный, но требует запуска приложений особым образом.
  • macOS и iOS — только через профили управления устройством, обычному пользователю недоступно.

Разделение по доменам

Самый желанный вариант: «эти сайты через туннель, остальное напрямую». И самый хрупкий.

Проблема в том, что маршрутизация работает с адресами, а не с именами. Чтобы направить домен в туннель, надо сначала узнать его адрес — и этот адрес меняется. Крупные сервисы отвечают разными адресами в зависимости от нагрузки и географии, а сети доставки контента меняют их постоянно.

Реализации решают это двумя путями. Первый — периодически резолвить список доменов и обновлять маршруты; так делает пакет pbr в OpenWrt. Второй — перехватывать DNS-запросы и подменять ответ вымышленным адресом из служебного диапазона, а трафик к нему заворачивать в прокси. Так работают клиенты на основе Xray.

Второй способ точнее, но требует, чтобы весь DNS шёл через клиент. Приложения со своим встроенным резолвером — а таких всё больше — из этой схемы выпадают.

Цена разделения

Утечки становятся возможными по замыслу. Часть трафика намеренно идёт мимо туннеля, и отличить это от сбоя нельзя. Kill switch в такой схеме тоже не поможет: он не знает, что должно было идти напрямую.

DNS остаётся общим. Даже когда трафик разделён, имена обычно разрешаются одним резолвером. Если это резолвер провайдера, он видит все запросы, включая те, что относятся к «туннельной» части. Проверка на утечки здесь обязательна.

Приложения хитрее правил. Мессенджер, не нашедший прямого пути, пробует запасные — другие порты, другие адреса, встроенные прокси. Правило, написанное под один сценарий, обходится самим приложением без злого умысла.

Когда разделение оправдано

Оно полезно, когда цель — доступность конкретного ресурса или маршрут через другую сеть: тогда лишний трафик в туннеле только добавляет задержку.

Оно вредно, когда цель — скрыть активность от провайдера. В этом случае любое исключение — дыра, и честнее направить в туннель всё. Разница между этими задачами разобрана в отдельной статье про доступность, приватность и анонимность.

Для домашней сети разумный компромисс — разделение на роутере по устройствам: телевизор и приставка в туннель, рабочий ноутбук напрямую. Правила задаются один раз и не зависят от того, что происходит внутри каждого устройства.

Коротко

AllowedIPs управляет маршрутами, а не правами — от этого и путаница. Разделение по адресам работает везде и просто; по приложениям — надёжно только на Android и Linux; по доменам — удобнее всего и ломается чаще всего, потому что адреса за именами меняются. Любое разделение ослабляет приватность: часть трафика идёт мимо туннеля намеренно, и отличить это от сбоя невозможно.