Тут уже ни раз всплывали похожие топики, но я либо не смог их найти, либо нашел но не нашел то что искал в них. Поэтому снова задам эти, очевидные местным хранителям знаний, вопросы.
Использую чистый sing-box на windows/linux/android. Баловался с настройками DNS и обнаружил поведение, которое не понимаю. Вопросы следующие:
В таком конфиге(см. контекст ниже), где фактически происходит резолвинг доменов?
На машине где запущен клиент sing-box или на VPS где запущен xray?
Если на машине с sing-box то какой DNS будет использован: из конфига sing-box или локальный?
Если с VPS то какой DNS будет использован: из конфига sing-box или локальный для VPS?
Как вообще рулить логикой того, где будет в итоге резолвиться домен? Через sniff/routeOnly/detour и прочее? Причем и в xray на сервере и в sing-box на клиенте?
Отвечая на свои же вопросы, я считал, что все домены будут резолвиться на VPS с использованием DNS сервера указанного в sing-box. НО!
Когда я пытаюсь завернуть весь трафик в прокси (указываю final для DNS и final для Route как remote) и strict_route: false → в dnsleak тесте вижу и cloudflare и google, причем в разных странах, и своего локального провайдера.
Когда указываю strict_route: true → локального провайдера больше не видно, но все еще гора левых DNS серверов, которые я нигде не указывал. Откуда они? Почему из разных стран? Это норма или нет? Если нет то как сделать так, чтобы был только тот dns сервер, который я указал в singbox?
Когда делаю split-tunnel (указываю final для DNS и final для Route как local + роутинг по доменам) + strict_route: true → dnsleak тест перестает работать вовсе Как это интерпретировать? Это норма?
Просто пара фактов. Если не ваш случай, ищите косяки в другом месте.
Если в браузере настроен зашифрованный днс сервер, то синг никак не сможет обработать днс запросы от него.
Если на сервере используется панелька типа 3X-UI, то не надо в ней включать сниффинг днс, иначе нешифрованные днс запросы, направленные в туннель, в итоге будут обработаны системным днс сервером vps или теми днс серверами, что указаны в панельке.
Знаю про эту тему с браузером и doh/dot. Но вот интересно, что в зависимости от VPS - dnsleak показывает (очевидно) разные наборы серваков, но у некоторых всего один - тот что я указал в sing-box. То есть нет такого что “кто-то”, типо браузера, всегда в обход ходит.
Никаких панелей упаси боже. Чистый xray, но в его конфиге есть
Без strict_route: true в клиенте на винде левые проскакивали. Так что на всех клиентах использую strict_route: true. Кроме роутера- там все маршруты и так под контролем, а strict_route: true только всё ломает. В итоге нигде никаких левых dns серверов, светятся только те, что в конфиге прописаны, в соответствии с правилами.
Вот у вас в клиентском конфиге указан гугловский днс. Какие ещё, кроме него, светятся в dnsleaktest? А если пустить его в direct, тоже левые проскакивают? И на каком устройстве клиент?
Помимо гугла еще светится Cloudflare, причем из разных стран Европы. Причем в зависимости от того через какой VPS я гоняю тест: у нескольких Cloudflare есть, а у одного VPS - нет, только гугл.
У тебя по факту dns в xray не работает вообще. В документации ясно сказано:
Будет ли выполняться резолвинг и разделение трафика, зависит от значения domainStrategy в конфигурации модуля маршрутизации. Встроенный DNS-сервер используется для запросов только при установке следующих двух значений: “IPIfNonMatch” или “IPOnDemand”.
Но у тебя стоит AsIs (ключевое как есть) и в модуле маршрутизации и на freedom (хоть там и ничего не написано, но по умолчанию применяется именно оно), поэтому все рулсы на основе geoip не обрабатываются dns модулем Xray вообще никак! А у тебя сейчас так:
Если прилетает домен, у тебя там написано “domain:ru” и если домен в этом листе матч, тогда он улетит в блок, но если прилетит сомнительный домен или готовый ip, который не матч, тогда работает системный резолвер уже по своей логике.
Для начала выключи dns вообще везде (на xray по факту уже выключен), но просто убери все правила оттуда и включи лог дебаг на обоих и смотри что происходит. В логах упоминания dns вообще не должно быть. Sing-Box должен отправлять все домены на сервер по умолчанию и вообще никак не участвовать в резолвинге. Ну и проверяй на сайтах детекторах какой там dns будет. Скорей всего серверный системный.
Теперь в domainStrategy укажи IPIfNonMatch - это включит dns модуль в xray. Ключевое - IP если не матч. Вот теперь все рулсы на основе geoip будут работать, если xray не обнаружит совпадения в geosite он будет уже резолвить в IP и дальше проверять по geoip матч или не матч.
Далее в настройках dns на Xray укажи https+local://dns.domain/dns-query etc… Можно несколько. Xray теперь больше не будет дёргать системный резолвер, для работы он будет юзать свой собственный dns модуль и при необходимости резолвить через outbound freedom по протоколу https, минуя модуль маршрутизации (потому что указано +local). Снова проверяй через лог дебаг что происходит. Там всё это очень понятно написано.
И вот только после всего этого, если всё устраивает, уже включай dns на Sing-Box и настраивай по своим предпочтениям.
P.S. И “type”: “field” убери вообще. Уже хрен знает с какой версии это писать необязательно. И без него всё прекрасно работает.
Пока я перевариваю все выше сказанное, добавлю: Днс exchange в логах действительно был только в sing-box. Но при этом на сервере с xray я видел в tcp dump запросы по https на dns.google каждый раз, когда открывал какой нибудь заблокированый сайт. Так что какие то днс запросы xray все таки делает, или прокидывает как раз насквозь запрос в 8.8.8.8 от sing-box
А кто сказал что мне нужен dns модуль в xray? Мне нужно чтобы запрос на резолв домена на sing-box улетел в тунель и вылетел наружу ASIS на VPS. Разве щас как раз не так работает?
Попробовал сейчас взять чистый ip-шник яндекса и курлануть его: прекрасно вижу как без всяких доменов в логах xray все определилось в block. Получается geoip то работает все таки)
sniffed domain: 77.88.44.55
taking detour [block] for [tcp:77.88.44.55:80]
Но dns на сервере с xray тут не причем, да. Он мне и не нужен. Мне нужно чтобы sing-box просто ходил не на прямую с моей машины.
UPD:
Все так и есть, если запрос по IP - роутится по правилам для IP, если в запросе есть SNI → роутится по правилам для доменов. При этом все(те которые попали под рулы в sing-box) DNS запросы пролетают через sing-box до VPS и улетают в direct на vps так же как и обычный трафик - вижу это в tcp дампе.
UPD2:
Вижу еще что летят запросы в 8.8.8.8, хотя я указал 1.1.1.1. Браузер скорее всего действительно чет мутит. Инвестигирую пока
Это routing по geoip, а не резолвинг. Он работает, потому что существует готовая запись с этим ip в geoip.dat, которая прекрасно матчится без всякого dns, потому что ты её прям так и прислал в “сыром” виде. Если (условно) удалить именно этот ip из geoip.dat, то ничего не сработает. В данном конкретном случае DNS вообще не причём и никак не задействован, xray выполняет сопоставление в routing по готовым спискам.
Это не так. То что я проксирую в сингбокс идёт на тот dns сервер который я указал, и идёт с VPS. Но лог о днс резолве в sing-box, что логично на самом деле - ведь это он тригерит резолвинг.
Призываются знатоки. На сколько я понимаю, первый DNS запрос от sing-box действительно в тот DNS сервер который я указал (1.1.1.1), но потом КТО-ТО делает еще один DNS запрос с этим же доменом. Я хз кто кроме xray это мог бы сделать, поэтому это никто иной как xray. На сколько я понимаю, в xray просходит dstOverride и xray по сути как бы сам делает запрос по этому домену, что приводит к системного резолвингу, но я не уверен.
Народ, помогайте) Как избавиться от этого двойного резолвинга? Отрезать dns резолв на sing-box и полностью на сервер полагаться?
Посмотрел конфиг sing-box- есть кое-что избыточное, есть и недостающее. Давайте полный конфиг, а не “упрощённый”. И выполнили бы хоть формат средствами sing-box, чтобы привести структуру в порядок, а то читать не удобно.
И что мешает на сервере тоже sing-box использовать? Нафига вот это извращение?
В прямом смысле. Не делать “detour”: “vps-proxy-selector”. Чисто чтобы посмотреть, будут ли лезть левые днс серверы в таком случае. И на основании полученного результата можно было бы сделать кое-какие выводы.
Это и есть полный конфиг, упрощенного в нем только удалённые секции с роутингом по доменам, которые к вопросу никакого отношения не имеют.
Что там вам неудобно читать? Оно и так буквально отформатировано.
Из всех утюгов уже годков так 4 стабильно вещают, что xray - база для сервера из-за своей производительности и удобства, но как клиент кал, а sing-box в свою очередь имеет обратную ситуацию. Ещё многоуважаемый ‘Deleted-user’ на хабре писал об этом в своих первых статьях по настройке, по которым многие впервые знакомились со всей этой темой. Я уверен, что это для вас не новости, поэтому не понимаю смысл вопроса. Может недавно что-то поменялось, извините, я не в курсе)
Кто вещает? Любители веб-панелей? Их под xray действительно больше. На этом сомнительные преимущества заканчиваются.
Не используйте разные ядра в связке клиент-сервер. Выберите что-то одно.
По теме топика, разве destOverride (без routeOnly) в xray не пытается подменить домены на IP где это возможно?
Ещё многоуважаемый ‘Deleted-user’ на хабре писал об этом в своих первых статьях по настройке, по которым многие впервые знакомились со всей этой темой. В чем, как говорится, он был не прав?
Раз этот вопрос так всех беспокоит, пруфы в студию. Я честно не углублялся в вопрос лично, а последовал в свое время советам на хабре.
А по теме: На сколько я вычитал в доке, он как раз таки в случае например получения одного ip, снифит домен и устанавливает соединение не по ip, а по домену, что приводит к этому резолву повторному. В моем случае приходят как раз ip - их зарезолвил sing-box. Кстати в случае перехода на sing-box в качестве сервера, там кардинально другая картина ожидает разве?
Не припомню чтоб в тех статьях делались какие-то оценки кода или производительности. Разницы в ядрах нет, если вы используете их в личных целях, там всегда все упирается в качество соединения. Используйте что-то одно из-за потенциальных проблем с совместимостью, которые сложно диагностировать (авторы ядер враждебны друг к другу). Именно поэтому вам дают такие советы. И кстати, бремя доказательства всегда лежит на утверждающей стороне.
Если xray что-то делает с доменами (для роутинга резолвит), то по умолчанию скорее всего используется встроенный DNS. Разве это не суть вашей проблемы? Явно укажите DNS в конфигурации xray. Левых серверов больше не будет.
В sing-box меньше опций с каким-то неявным странным поведением, унаследованным еще от v2ray. Разбираться было бы легче.
Согласен, что использовать разные софтины для сервера и клиента - странно, я всегда задавался этим вопросом, но натыкался на “просто берите xray для сервера - singbox для клиента, так хорошо“. Я как раз таки ничего не утверждаю, а рассказываю свой опыт и подчеркиваю, что не углублялся почему так. Но мне упорно утверждают, что никогда такого не было Поэтому и прошу пруфов, чтобы наконец ‘углубиться’.
Да, это суть изначальной проблемы, но теперь хотелось бы понять как избежать повторного резолвинга на сервере. Зачем эта двойная работа? Для роутинга по доменам есть sni, что на клиенте что на сервере, какой смысл 2 раза резолвить я хз.