Безопасность в сети интернет с каждым днём становится всё более необходимой. Утечка личных данных может обойтись слишком дорого, поэтому заблаговременно позаботимся о своей информационной неприкосновенности и начнём, например, с защиты DNS-запросов. Для этого вы можете использовать существующие протоколы DNS-over-TLS, DNS-over-HTTPS, etc., а я предлагаю попробовать ещё один способ — направить DNS-запросы через xray-прокси, назовём этот способ DNS-over-VLESS). В интернете можно найти много инструкций по настройке xray-прокси, но заворачивание в него DNS-трафика описано недостаточно подробно, устраним данный недочёт.

dns-over-vless

Итак, первоначальное условие, у вас уже должен быть настроен и функционировать прокси xray VLESS с XTLS Reality по одной из многочисленных инструкций. Все действия по его «прокачке» выполняем локально на компьютере или роутере, сервер xray не трогаем*.

* Замечание от пользователя:

Во многих конфигурациях серверов xray, которые можно найти на просторах интернета, есть секция для предотвращения проблем с локальной маршрутизацией, в ней блокируется «geoip:private», куда попадает дефолтный адрес DNS-резолвера — 127.0.0.53. Для нашей задачи данное правило с «geoip:private» необходимо удалить, либо направить 127.0.0.53 выше этого правила в директ

Разобьём единый файл настроек xray config.json на файлы по разделам: inbounds.json, outbounds.json, dns.json, routing.json. Этих четырёх файлов достаточно для нашей задачи. Для оптимизации подключения после настройки и проверки работоспособности, можете дополнительно добавить к ним log.json, politic.json. Впрочем, разбиение на разделы не обязательно, если вам удобней настраивать единый config.json, делайте так, как вам удобно. Для реализации задуманного необходимо использовать входящее подключение (inbounds), поддерживающее UDP-протокол (e.g. socks5, TProxy).

1 вариант socks5:

inbounds.json

2 вариант TProxy:

inbounds.json

Как мы уже условились, прокси работает по протоколу VLESS с XTLS Reality и первое, что мы сделаем для пересылки через него DNS-трафика, это добавим в файл outbounds.json секцию DNS-протокола, а в исходящие подключения vless и freedom параметр domainStrategy, без этого параметра встроенный в xray DNS-сервер использоваться не будет.

outbounds.json

Следующим шагом создадим файл dns.json и укажем в нём любой публичный DNS, можно даже DNS провайдера, этот адрес будет использоваться для не проксируемых подключений и для нужд роутера (обновление прошивки, синхронизация времени,..). Далее добавим секцию с локальным IP-адресом DNS резолвера вашего VPS-сервера и перечнем проксируемых сайтов, которые хотим через него резолвить (поддерживаются так же dat-файлы, синтаксис как в роутинге). В примере я указал 127.0.0.53, это дефолтный адрес systemd Ubuntu, если у вас другой дистрибутив или вы устанавливали на VPS сторонние DNS резолверы, уточните адрес прослушивания в их документации. Например, можете установить на VPS-сервер пакет AdGuardHome и повесить его на порт 5353, в этом случае параметр «address» будет 127.0.0.1, а параметр «port» 5353.

dns.json

И, наконец, routing.json. Создадим в нём два правила, которые завернут DNS-запросы в прокси, третье правило, дублирующее секцию в dns.json с перечнем проксируемых доменов и четвертое правило для остального трафика. Если вам нужна иная маршрутизация, отредактируйте файл по своему усмотрению, важно только, чтобы оба правила перенаправления DNS-трафика были в самом начале routing.json. Так же в роутинге обязательно укажите параметр «domainStrategy» со значением «IPIfNonMatch» или «IPOnDemand», без этого встроенный в xray DNS-сервер использоваться не будет.

routing.json

Настройка закончена выполняем проверку.

Если ошибок не допущено, то проксируемый сайт browserleaks.com покажет DNS вашего VPS, а не проксируемый сайт dnsleaktest.com покажет публичный DNS указанный в dns.json

Результат получен, DNS-over-VLESS настроен и работает. Никто не прослушает ваши DNS-запросы к проксируемым сайтам и не подменит ответы по своему усмотрению, а для дополнительной защиты в интернете, обратите внимание на возможность отключения WebRTC и QUIC в браузере.