Настройка v2rayN
Ниже рабочая схема именно под вашу задачу:
- домены из списка → трафик через proxy / VLESS, DNS для них через Google DNS / DoH;
- все остальные домены → трафик напрямую, DNS через текущий системный DNS;
- в v2rayN это делается сочетанием Routing rules + DNS object. У v2rayN есть отдельные страницы для системной прокси/маршрутизации и для кастомных routing rules, а в примерах самого проекта есть DNS-конфиг с domains, skipFallback, localhost и https://dns.google/dns-query. (GitHub)
Сразу важный момент: для вашей логики лучше использовать не TUN-режим, а System proxy + Routing.
Причина простая: TUN перехватывает весь трафик системы и часто ломает идею “прочие домены — через системный DNS без туннеля”. А режим системной прокси в v2rayN как раз предназначен для того, чтобы отправлять в core только трафик приложений, которые используют системный proxy, после чего уже routing rules решают, что пустить через proxy, а что direct. Это соответствует описанию “system proxy” в wiki v2rayN. (GitHub)
Что получится в итоге¶
Пример логики:
- example.com
- openai.com
- chatgpt.com
будут:
- резолвиться через https://dns.google/dns-query;
- идти через ваш VLESS.
А всё остальное:
- будет резолвиться через localhost = системный DNS;
- идти direct.
В Xray DNS localhost означает использование локального системного DNS, а серверы DNS можно ограничивать по domains; skipFallback нужен, чтобы запросы для выбранных доменов не откатывались на другой DNS. (GitHub)
Пошаговая настройка в v2rayN 7.20.4¶
1) Отключите TUN, если он включен¶
В 7.20.4 есть отдельные настройки TUN, и в этом релизе они даже дорабатывались. Для вашей задачи TUN лучше не использовать. (GitHub) Сделайте так: 1. Откройте v2rayN. 2. Убедитесь, что Enable Tun внизу главного окна выключен. 3. Если был включён — выключите и перезапустите сервис.
2) Включите системный proxy¶
Нужно, чтобы браузер и обычные приложения отправляли трафик в v2rayN, а дальше уже core применял ваши правила. В wiki v2rayN это и есть обычный сценарий использования system proxy + routing. (GitHub) Сделайте так: 1. Внизу главного окна найдите поле System proxy. 2. Выберите Set system proxy. Не выбирайте PAC, если хотите, чтобы правила принимались самим core по доменам и DNS-логике, а не PAC-скриптом браузера. PAC — это отдельный механизм. Описание PAC и обычного system proxy различается в wiki. (GitHub)
3) Откройте Routing Setting¶
В новых v2rayN пункт Routing находится в меню Settings. Это видно и по интерфейсу ветки v7.x. Путь: 1. Settings 2. Routing Setting
4) Создайте профиль маршрутизации “список доменов через proxy, остальное direct”¶
В custom routing rules каждая запись — это правило, и у неё можно задавать domain, outboundTag, enabled, remarks. В wiki есть пример с outboundTag: "direct" и outboundTag: "proxy". (GitHub)
Сделайте 2 правила:
Правило 1. Домены из списка → proxy¶
Создайте правило примерно такого вида:
{
"domain": [
"domain:example.com",
"domain:openai.com",
"domain:chatgpt.com"
],
"outboundTag": "proxy",
"enabled": true,
"remarks": "domains via proxy"
}
domain:example.com в Xray означает сам домен и его поддомены, например www.example.com. (xtls.github.io)
Правило 2. Всё остальное → direct¶
Последним правилом добавьте:
{
"port": "0-65535",
"outboundTag": "direct",
"enabled": true,
"remarks": "final direct"
}
proxy. Вам нужен такой же финальный catch-all, но с direct. (GitHub)
Итоговый набор правил¶
[
{
"domain": [
"domain:example.com",
"domain:openai.com",
"domain:chatgpt.com"
],
"outboundTag": "proxy",
"enabled": true,
"remarks": "domains via proxy"
},
{
"port": "0-65535",
"outboundTag": "direct",
"enabled": true,
"remarks": "final direct"
}
]
¶
[
{
"domain": [
"domain:example.com",
"domain:openai.com",
"domain:chatgpt.com"
],
"outboundTag": "proxy",
"enabled": true,
"remarks": "domains via proxy"
},
{
"port": "0-65535",
"outboundTag": "direct",
"enabled": true,
"remarks": "final direct"
}
]
5) Поставьте Domain Strategy = AsIs¶
Для такого сценария лучше использовать AsIs:
- домены из вашего списка матчятся как домены;
- всё прочее сразу падает в direct;
- лишних DNS-резолвов для маршрутизации меньше.
В Xray встроенный DNS особенно задействуется при IPIfNonMatch и IPOnDemand; это прямо описано в документации DNS/routing. Для вашей схемы, где всё основано на доменных правилах, AsIs обычно самый предсказуемый вариант. (xtls.github.io)
6) Откройте DNS Settings¶
Теперь настраиваем DNS-логику:
- для доменов из списка → dns.google / DoH;
- для всего остального → localhost = системный DNS.
Путь:
1. Settings
2. DNS Settings
В v2rayN есть отдельная страница DNS settings; в проекте также есть sample-конфиг DNS object. (GitHub)
7) Вставьте DNS Object¶
Вместо простого списка DNS-серверов используйте DNS Object.
За основу берём логику из sample-конфига v2rayN: там используются hosts, servers, domains, skipFallback, localhost и https://dns.google/dns-query. (GitHub)
Вставьте такой вариант:
{
"hosts": {},
"servers": [
{
"address": "https://dns.google/dns-query",
"skipFallback": true,
"domains": [
"domain:example.com",
"domain:openai.com",
"domain:chatgpt.com"
]
},
"localhost"
]
}
example.com, openai.com, chatgpt.com и поддоменов будет использоваться Google DoH;
- skipFallback: true не даст этим доменам “скатиться” на другой DNS;
- все остальные домены будут резолвиться через system DNS, потому что localhost в Xray — это локальный DNS резолвер ОС. (GitHub)
8) Перезапустите сервис¶
- Нажмите OK / Confirm в Routing.
- Нажмите OK / Confirm в DNS.
- Нажмите Restart service. После изменения routing/DNS это обязательно. В v2rayN смена системной прокси и core-настроек привязана к перезапуску/перезагрузке сервиса. (GitHub)
Как проверить, что всё работает¶
Проверка 1. Домен из списка¶
Откройте, например:
- https://chatgpt.com
Ожидаемо:
- сайт открывается через VLESS;
- в логах v2rayN цель должна идти с proxy;
- DNS для него должен уходить на dns.google.
Проверка 2. Любой другой домен¶
Откройте домен, которого нет в списке.
Ожидаемо:
- соединение идёт direct;
- DNS берётся из системного DNS Windows, а не из туннеля.
Проверка 3. Через логи¶
Откройте Logs / журнал v2rayN и посмотрите, как маршрутизируются запросы.
Если домены из списка почему-то идут не по доменному правилу, значит приложение передаёт уже IP, а не доменное имя.
В этом случае обычно помогает включённый sniffing, чтобы core видел исходный домен. В интерфейсе v2rayN такой переключатель есть в базовых/core настройках. На скриншотах старых версий он называется Turn on Sniffing; названия в 7.x очень похожи, но расположение может чуть отличаться.
Если правило не сработало¶
Вариант 1. Добавляйте только domain:, не keyword:¶
Для точных списков доменов используйте именно:
"domain:example.com"
keyword:.domain: — рекомендованный способ для домена и его поддоменов. (xtls.github.io)
Вариант 2. Не ставьте финальное правило в proxy¶
Если последним стоит proxy, то всё остальное тоже уйдёт в туннель.
У вас последнее правило должно быть именно:
"outboundTag": "direct"
Вариант 3. Не используйте PAC для этой задачи¶
PAC решает маршрутизацию на уровне PAC-скрипта, а не через core DNS-object. Для вашей схемы лучше обычный system proxy + routing rules. Оба режима есть в v2rayN, но работают по-разному. (GitHub)
Вариант 4. Если включён TUN — выключите¶
Иначе DNS может перехватываться не так, как вы ожидаете.
Для вашей логики “часть доменов через DoH в туннеле, остальное через системный DNS” TUN обычно только мешает.
Готовый минимальный комплект¶
Routing rules¶
[
{
"domain": [
"domain:example.com",
"domain:openai.com",
"domain:chatgpt.com"
],
"outboundTag": "proxy",
"enabled": true,
"remarks": "domains via proxy"
},
{
"port": "0-65535",
"outboundTag": "direct",
"enabled": true,
"remarks": "final direct"
}
]
DNS object¶
{
"hosts": {},
"servers": [
{
"address": "https://dns.google/dns-query",
"skipFallback": true,
"domains": [
"domain:example.com",
"domain:openai.com",
"domain:chatgpt.com"
]
},
"localhost"
]
}
¶
{
"hosts": {},
"servers": [
{
"address": "https://dns.google/dns-query",
"skipFallback": true,
"domains": [
"domain:example.com",
"domain:openai.com",
"domain:chatgpt.com"
]
},
"localhost"
]
}