Безопасность в сети интернет с каждым днём становится всё более необходимой. Утечка личных данных может обойтись слишком дорого, поэтому заблаговременно позаботимся о своей информационной неприкосновенности и начнём, например, с защиты DNS-запросов. Для этого вы можете использовать существующие протоколы DNS-over-TLS, DNS-over-HTTPS, etc., а я предлагаю попробовать ещё один способ — направить DNS-запросы через xray-прокси, назовём этот способ DNS-over-VLESS). В интернете можно найти много инструкций по настройке xray-прокси, но заворачивание в него DNS-трафика описано недостаточно подробно, устраним данный недочёт.
Итак, первоначальное условие, у вас уже должен быть настроен и функционировать прокси 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
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "inbounds": [ { "port": 1080, "protocol": "socks", "settings": { "udp": true }, "tag": "socks" } ] } |
2 вариант TProxy:
inbounds.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
{ "inbounds": [ { "port": 1181, "protocol": "dokodemo-door", "settings": { "network": "tcp,udp", "followRedirect": true }, "sniffing": { "enabled": true, "routeOnly": true, "destOverride": ["http","tls"] }, "streamSettings": { "sockopt": {"tproxy": "tproxy"} }, "tag": "tproxy" } ] } |
Как мы уже условились, прокси работает по протоколу VLESS с XTLS Reality и первое, что мы сделаем для пересылки через него DNS-трафика, это добавим в файл outbounds.json секцию DNS-протокола, а в исходящие подключения vless и freedom параметр domainStrategy, без этого параметра встроенный в xray DNS-сервер использоваться не будет.
outbounds.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
{ "outbounds": [ { "protocol": "vless", "settings": { "vnext": [ { "address": "***.***.***.***", "port": 443, "users": [ { "id": "****************************", "encryption": "none", "flow": "xtls-rprx-vision", "level": 0 } ] } ] }, "streamSettings": { "network": "tcp", "security": "reality", "realitySettings": { "serverName": "*********", "fingerprint": "*********", "show": false, "publicKey": "****************************", "shortId": "********", "spiderX": "/" }, "sockopt": { "domainStrategy": "ForceIPv4" } }, "tag": "proxy" }, { "protocol": "freedom", "settings": { "domainStrategy": "ForceIPv4" }, "tag": "direct" }, { "protocol": "dns", "tag": "dns-out" } ] } |
Следующим шагом создадим файл 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "dns": { "tag": "dns-in", "servers": [ "8.8.8.8", { "address": "127.0.0.53", "port": 53, "domains": [ "browserleaks.com", "browserleaks.org", "browserleaks.net" ] } ], "queryStrategy": "UseIPv4" } } |
И, наконец, routing.json. Создадим в нём два правила, которые завернут DNS-запросы в прокси, третье правило, дублирующее секцию в dns.json с перечнем проксируемых доменов и четвертое правило для остального трафика. Если вам нужна иная маршрутизация, отредактируйте файл по своему усмотрению, важно только, чтобы оба правила перенаправления DNS-трафика были в самом начале routing.json. Так же в роутинге обязательно укажите параметр «domainStrategy» со значением «IPIfNonMatch» или «IPOnDemand», без этого встроенный в xray DNS-сервер использоваться не будет.
routing.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
{ "routing": { "domainStrategy": "IPIfNonMatch", "rules": [ { "inboundTag": ["dns-in"], "outboundTag": "proxy" }, { "port": 53, "outboundTag": "dns-out" }, { "domain": [ "browserleaks.com", "browserleaks.org", "browserleaks.net" ], "outboundTag": "proxy" }, { "network": "tcp,udp", "outboundTag": "direct" } ] } } |
Настройка закончена выполняем проверку.
Если ошибок не допущено, то проксируемый сайт browserleaks.com покажет DNS вашего VPS, а не проксируемый сайт dnsleaktest.com покажет публичный DNS указанный в dns.json
Результат получен, DNS-over-VLESS настроен и работает. Никто не прослушает ваши DNS-запросы к проксируемым сайтам и не подменит ответы по своему усмотрению, а для дополнительной защиты в интернете, обратите внимание на возможность отключения WebRTC и QUIC в браузере.