RE:NODE

Сеть10 мин чтения

Раздельное туннелирование: правила VPN по приложениям и маршрутам

Как раздельное туннелирование решает, что идёт через VPN: списки приложений, IP-маршруты, правила по доменам, обход локальных адресов и утечки из-за неудачного правила.

0 прочтений

Раздельное туннелирование (split tunnelling) означает, что часть трафика идёт через VPN, а остальное - напрямую через ваше обычное подключение. Решающее правило может опираться на приложение (этот браузер через туннель, та игра напрямую), на адрес назначения (всё, кроме моей домашней сети, через туннель) или, в прокси-клиентах вроде семейства Xray, на доменное имя (местные банковские сайты напрямую, всё остальное через туннель). Самое частое применение, которое нужно почти всем, - и самое простое: не пускать адреса локальной сети в туннель, чтобы принтер, NAS и телевизор продолжали работать при включённом VPN. Всё, что сверх этого, - каждое добавленное правило - это намеренная дыра, и трафик, отправленный напрямую, виден ровно так же, как без всякого VPN.

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

Полный туннель, раздельный туннель и обратное разделение#

Полный туннель отправляет через VPN всё. На устройстве это маршрут для всего адресного пространства - 0.0.0.0/0 для IPv4 и ::/0 для IPv6, - указывающий на интерфейс VPN, плюс исключение для адреса самого VPN-сервера, чтобы пакеты туннеля могли до него дойти.

Раздельный туннель заменяет этот общий маршрут более узким набором. Сформулировать его можно двумя способами:

  • Список исключений: всё через туннель, кроме названных приложений, адресов или доменов. Это безопасный вариант по умолчанию: то, о чём вы забыли, идёт через туннель.
  • Список включений: ничего через туннель, кроме названных приложений, адресов или доменов. Это обратное разделение, полезное, когда вы хотите пустить через VPN только один браузер или один рабочий инструмент. То, о чём вы забыли, идёт напрямую.

Выбирайте форму с исключениями, если нет конкретной причины поступить иначе. Цена забытого исключения - более медленное соединение; цена забытого включения - утечка, которую вы не заметите.

совпало для туннелясовпало для прямогоВаши приложениябраузер, игра, почтаПравила маршрутовприложение, IP, доменТуннель VPNк вашему серверуНапрямуюлокальная сеть или ISPInternet
Раздельный туннель направляет каждое соединение одним из двух путей

Разделение по маршрутам#

Самая старая форма работает с таблицей маршрутизации. Адрес назначения каждого пакета сравнивается с маршрутами, и побеждает самый конкретный. VPN, который добавляет 10.20.0.0/16 через туннель и не трогает маршрут по умолчанию, отправляет через VPN только эту корпоративную сеть; тот, что добавляет 0.0.0.0/0, отправляет всё.

В WireGuard это AllowedIPs. На клиенте это означает сразу две вещи: какие адреса назначения направляются в туннель и какие адреса источника принимаются от пира.

Client: full tunnel
[Peer]AllowedIPs = 0.0.0.0/0, ::/0
Client: only the office network
[Peer]AllowedIPs = 10.20.0.0/16

Синтаксиса «всё, кроме» в WireGuard нет; чтобы исключить локальную сеть из полного туннеля, нужно перечислить дополнение к частным диапазонам, которое онлайн-калькуляторы выдают длинным списком префиксов. Параметр «Block untunneled traffic (kill-switch)» в официальном клиенте для Windows действует только тогда, когда список разрешённых адресов - полный общий маршрут; это стоит знать, прежде чем начинать его урезать.

OpenVPN делает то же самое с маршрутами, которые присылает сервер, а клиент может от них отказаться и заменить своими:

client.ovpn (excerpt)
route-nopullroute 10.20.0.0 255.255.0.0route 192.168.1.0 255.255.255.0 net_gateway

route-nopull игнорирует маршруты, присланные сервером, следующая строка отправляет одну сеть через туннель, а net_gateway отправляет сеть через ваш обычный шлюз.

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

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

Правила по приложениям выбирают трафик по тому, какая программа его отправила. Android поддерживает это напрямую: VPN-приложение может передать системе список разрешённых или запрещённых приложений, и операционная система его соблюдает. Поэтому почти каждый VPN-клиент для Android, включая v2rayNG и Hiddify, предлагает экран прокси или VPN для отдельных приложений, где вы отмечаете, какие включить или исключить.

В Windows и macOS аналогичной системной функции нет, поэтому клиенты реализуют правила по приложениям сами - с помощью драйверов сетевой фильтрации или сопоставляя имена процессов в собственном движке маршрутизации. Качество бывает разным. iOS позволяет VPN под корпоративным управлением работать по приложениям; обычные потребительские VPN-приложения, как правило, этого не могут и разделяют трафик по адресу назначения.

Разделение по приложениям - самая интуитивная форма («банковское приложение напрямую, всё остальное через туннель»), но у неё есть слепое пятно: системные службы, фоновые обновлятели и всё, что работает внутри общего процесса, трудно классифицировать. Приложение, которое передаёт сетевую работу системному компоненту, может оказаться не по ту сторону правила.

Разделение по доменам и правилам в клиентах Xray#

Прокси-клиенты семейства Xray и sing-box видят больше, чем адреса: они видят имя хоста каждого соединения - либо из самого запроса, либо «вынюхивая» (sniffing) его из TLS-рукопожатия. Это позволяет задавать правила по доменам, а также по готовым спискам доменов и диапазонов IP, сгруппированным по странам или категориям.

Внутри раздел маршрутизации Xray выглядит так:

Xray routing (client side)
{  "routing": {    "domainStrategy": "IPIfNonMatch",    "rules": [      { "type": "field", "ip": ["geoip:private"], "outboundTag": "direct" },      { "type": "field", "domain": ["domain:mybank.example"], "outboundTag": "direct" },      { "type": "field", "network": "tcp,udp", "outboundTag": "proxy" }    ]  }}

Правила читаются по порядку, и побеждает первое совпадение. geoip:private - встроенный список частных и локальных диапазонов. domain: совпадает с доменом и всеми его поддоменами. domainStrategy определяет, будет ли домен, не совпавший ни с одним доменным правилом, разрешён в адрес, чтобы можно было проверить IP-правила: AsIs никогда не разрешает, IPIfNonMatch разрешает, только если ни одно доменное правило не совпало, IPOnDemand разрешает, как только дело доходит до IP-правила.

Этот JSON редко пишут вручную. В v2rayNG есть настройки маршрутизации, где домены и IP добавляются в списки direct, proxy или block, Hiddify предлагает правила, отправляющие сайты выбранной страны напрямую, а в Shadowrocket есть режим правил со строками вроде DOMAIN-SUFFIX,mybank.example,DIRECT и общим правилом FINAL,PROXY. Идеи везде одинаковые: список совпадений, действие для каждого и правило по умолчанию в конце.

Локальные адреса, которые стоит пускать в обход#

Что бы вы ни делали ещё, эти диапазоны не должны идти через VPN на сервер в другой стране. На дальней стороне им никто не ответит, а отправка туда ломает локальные устройства.

ДиапазонЧто это
10.0.0.0/8Частная сеть (RFC 1918)
172.16.0.0/12Частная сеть (RFC 1918)
192.168.0.0/16Частная сеть, большинство домашних роутеров
169.254.0.0/16Link-local, устройства без DHCP
100.64.0.0/10Общее пространство CGNAT операторов
224.0.0.0/4Multicast, используется для обнаружения устройств
fc00::/7Уникальные локальные адреса IPv6
fe80::/10Link-local IPv6

Именно исключение этих диапазонов позволяет Chromecast, AirPlay, сетевым принтерам, NAS и странице администрирования роутера работать при включённом VPN. У большинства клиентов для этого есть один параметр, а список Xray geoip:private это покрывает. Диапазон CGNAT - вопрос суждения: некоторые мобильные сети и провайдеры используют его для внутренних сервисов, а некоторые оверлейные сети, например Tailscale, - для собственных адресов.

Когда разделение имеет смысл#

  • Местные сайты, отвергающие иностранные адреса. Банки, государственные порталы и некоторые стриминговые сервисы блокируют вход с зарубежных адресов дата-центров или требуют дополнительную проверку. Если отправлять эти домены напрямую, они продолжат работать.
  • Крупные локальные передачи. Backup на NAS, загрузка игр с ближайшего CDN, видеозвонки с людьми в том же городе. Объезд через сервер в другой стране стоит времени и пропускной способности без всякой пользы.
  • Игры. До игрового сервера рядом с вами обычно быстрее всего добраться напрямую; когда туннель помогает, а когда вредит, разобрано в статье снижает ли VPN пинг в играх.
  • Рабочие инструменты. Корпоративный VPN, который должен уживаться с личным, - классический случай для правил по маршрутам, а не по приложениям.

А когда не имеет: во враждебной сети, такой как wifi в отеле или кафе, каждое прямое правило - это трафик, который сеть видит. Что это раскрывает, объясняет статья VPN в публичном wifi. Если вы используете VPN из-за сети, которая фильтрует или следит, правильная настройка - полный туннель, из которого исключены только локальные адреса.

Ошибки, превращающие разделение в утечку#

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

Доменные правила без правил DNS. Соединение идёт через туннель; а запрос перед этим ушёл к резолверу отеля.

WebRTC и UDP в режимах только с прокси. Браузер, направленный через системный прокси, всё равно может отправлять трафик WebRTC напрямую, потому что это UDP, и прокси он игнорирует.

Забытый IPv6. Правила, написанные для диапазонов IPv4, оставляют трафик IPv6 на системном маршруте по умолчанию, а он может быть прямым.

Неверные списки по странам. Базы соответствия IP странам приблизительны; сайт на глобальном CDN может считаться местным или иностранным в зависимости от узла, на который вы попали. Для всего важного доменные правила предсказуемее правил по странам.

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

Как проверить, куда идёт трафик#

Раздельный туннель хорош ровно настолько, насколько хорошо вы знаете, куда на самом деле попадает каждый вид трафика. Три проверки это покрывают.

Из приложения по каждую сторону. Откройте страницу «what is my IP» в браузере, который должен идти через туннель, и в том, который не должен (или из исключённого приложения со встроенным браузером). Одна должна показать адрес VPN-сервера, другая - ваш собственный.

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

code
Windows:  Find-NetRoute -RemoteIPAddress 10.20.1.5Linux:    ip route get 10.20.1.5macOS:    route -n get 10.20.1.5

В выводе указаны интерфейс и шлюз. Адрес назначения, который вы собирались туннелировать, должен показывать интерфейс VPN; локальный принтер - ваш обычный адаптер.

По логу клиента. Клиенты семейства Xray умеют записывать в лог каждое соединение вместе с правилом, с которым оно совпало, и использованным outbound - proxy, direct или block. Повысить уровень логирования на несколько минут, пока вы открываете нужные сайты, - самый быстрый способ найти правило, которое срабатывает не так, как вы думали, особенно с доменными правилами, где клиент может видеть IP-адрес, а не имя.

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

Раздельное туннелирование с приватным сервером#

На RE:NODE линейка приватных VPN работает на Xray с VLESS и Reality, а описанные выше правила маршрутизации живут в вашем клиенте, а не на сервере. Сервер просто несёт то, что отправляет ему клиент: свой адрес и ключ, больше никого на нём нет, ограничения трафика нет. На Android настройки по приложениям и маршрутизации дают v2rayNG и Hiddify; на iPhone самый гибкий - режим правил Shadowrocket; на Windows приложение Renode VPN подключается по ссылке, которую выдаёт сервер, для работы с полным туннелем, а если нужны подробные правила, с той же ссылкой можно использовать клиент общего назначения, например Hiddify. Поскольку сервер находится в Германии, отправка ближнего местного трафика напрямую часто заметно влияет на скорость. В некоторых странах использование VPN ограничено, поэтому узнайте закон там, где вы находитесь, а шаги по импорту ссылки в каждое приложение есть в руководстве по настройке клиентов.

FAQ#

Раздельное туннелирование менее безопасно, чем полный туннель?

Трафик, который вы отправляете напрямую, вообще не защищён VPN, так что да - ровно на эту величину. Важно ли это, зависит от сети. Дома отправка принтера и местного банка напрямую почти ничего не стоит; в публичном wifi каждое прямое правило видно сети.

Почему при включённом VPN перестаёт работать принтер?

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

Можно ли пустить через VPN только одно приложение?

На Android да - у каждого крупного клиента есть настройка по приложениям, и её можно переключить так, чтобы включались только выбранные вами приложения. На десктопе это зависит от клиента. В списке включений легко ошибиться, поэтому проверьте адрес из этого приложения и из какого-нибудь не из списка.

Замедляют ли правила маршрутизации соединение?

Не заметно. Сопоставить соединение с несколькими сотнями правил - пустяк. Большие списки стран немного увеличивают расход памяти клиентом. Замедляет соединение путь, а разделение обычно ускоряет работу, оставляя локальный трафик локальным.

Пускать игры через VPN или напрямую?

Обычно напрямую, если только ваш провайдер не маршрутизирует плохо до серверов игры или не блокирует её. Объезд через сервер в другой стране добавляет расстояние, а VPN, работающие поверх TCP, добавляют подвисания на каналах с потерями.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000