Перейти к содержанию

Настройка 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"
}
В wiki v2rayN есть пример “финального” правила на весь диапазон портов; там показан тот же принцип, только в примере финальный выход — 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"
  }
]

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) Перезапустите сервис

  1. Нажмите OK / Confirm в Routing.
  2. Нажмите OK / Confirm в DNS.
  3. Нажмите 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"
Это ключевой момент. (GitHub)

Вариант 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"
  ]
}