Socks5 DNS sing-box

Приветствую, друзья! Есть такая задача: нужно резолвить DNS имена на стороне socks5 прокси. Например, если в браузере Firefox поставить галочку на пункте “отправлять DNS запросы через socks5”, то браузер не будет резолвить DNS локально, а сразу будет отправлять запрос на подключение не с IP, а с именем хоста. Как реализовать такую же функциональность, но чтобы направить в socks5 трафик всех приложений? Думал, что sing-box fakeip как раз для этого используется. Но когда настроил, оказалось, что да, он на DNS запрос отвечает фейковым IP (например из диапазона 198.18.0.0/15), но при запросе к этому адресу, все равно лезет его разрезолвливать. Да, можно резолвить через TCP 1.1.1.1 и запросы направить через прокси. Но нужно, чтобы использовались именно нативные DNS, как в случае с Firefox. Также пробовал выставить в конфиге sing-box в inbound (type: tun) параметр “sniff_override_destination”: true, но безуспешно. Подскажите, можно ли эту задачу в принципе решить с помощью sing-box? Или посоветуйте другой аналогичный софт, в котором это возможно реализовать. Спасибо!

Не совсем понял, что вы хотите, но что-то похожее есть в Proxifier:

Да, нужна именно эта функциональность, как в Proxifier. Но чтобы софт был открытый и его можно было запустить, например, на OpenWRT роутере, как sing-box.

Convert TUN/TAP to Socks5/HTTP proxy
Так и не понял, что вы хотите сделать, прозрачный прокси, или SOCKS5 прокси который будет резолвить имена не локально, а через исходящий прокси? За OpenWRT ничего не знаю, так что умываю руки.

тоже ничего не понял. автор, перефразируй

Спасибо за ответы! Хочу направить весь трафик всех приложений через прокси. Но плюс ещё и чтобы ДНС тоже резолвились через этот же прокси. Причем не через публичные днс (1.1.1.1, 8.8.8.8), а через те, что используются на стороне прокси. Предполагается, что заворачивание трафика будет происходить на маршрутизаторе, в качестве которого будет выступать роутер OpenWRT или PC с Linux.

Это возможно сделать, не подскажу как, но имейте ввиду, что часть приложений не будет работать (VoIP, UDP hole punching, ICMP tunnel).

Да, это понятно, что чтобы работал UDP это нужна поддержка на стороне прокси. Но в данный момент интересует именно нативный резолвинг ДНС, как вы показали в Proxifier.

вы никак не сделаете чтобы приложения сами отказались от системного днс и начали резолвить через сокс, нужно перехватывать днс на уровне системы и направлять куда нужно (например через sing-box проксировать 127.0.0.1:53 на x.x.x.x:53 в proxy outbound)

Перехватить и направить DNS - не проблема. Уже сделано так, что приложения используют DNS от sing-box с опцией fakeip. Т.е. каждое имя резолвится в IP из диапазона 198.18.0.0/15. А запросы к этим IP идут в sing-box. Проблема именно в том, что sing-box сам резолвит DNS имена и вместо фейковых IP подставляет настоящие. Вот мой вопрос в том, можно ли как-то настроить sing-box так, чтобы он в подключение по socks5 подставлял имена хостов вместо IP адресов?

Если даже такой опции нет, то возможность пропатчить есть, думаю. Взяв доменое имя из таблицы сопоставления имя ↔ фейковый IP.

Там можно настроить прокси.

Спасибо, посмотрю.

В общем, удалось решить задачу. Надо в качестве inbound использовать tproxy (вероятно, redirect тоже будет работать). В режиме tun почему-то не захотела работать опция sniff_override_destination. А с tproxy всё нормально: ДНС выдаются нативные, те, что использует socks5 прокси. Всем спасибо за советы!

1 Like

Уважаемый rexby
Мне нужно решить аналогичную задачу, но к сожалению я первый день пока только изучаю sing box и являюсь абсолютным новичком

Мог бы я просить вас показать ваш шаблон кода для профиля Синг бокс, которые решает задачу раздачу socks с родным днc прoкcu провайдера ?

Совсем пока тяжело с этим языком, гуглил каждое слово в вашем сообщение про тпрокси и прочее

            {
                "inbound": "mixed-in",
				"action": "resolve"
            }

Огромное спасибо за ваш ответ!!!
К сожалению, при импорте конфигурации в сингбокс ругается, что “missing outbound field”

Извиняюсь, что полный нуб

прочитай лс

Актуально решить задачу под sing box iOS с днсом прокси
Если кто знает, направьте пжлст

Здравствуйте! Прикрепил свой конфиг к ответу.
Я решал такую задачу: на маршрутизаторе с OpenWRT (также подойдет любой ПК с Линукс), через который клинские машины выходят в интернет, настроить заворачивание всего трафика в прокси. Причем, так, чтобы ДНС запросы шли через тот же ДНС-сервер, который использует сам прокси. Проблема в следующем: в отличии от браузера, который умеет работать через прокси и отправляет туда сразу запросы с именем хоста, клиентские приложения ничего не знают про прокси (в этом и суть задачи, чтобы приложения ни о чем не “догадывались” и не делать никакие дополнительные настройки на клиентах, а только на роутере). Так вот, приложения, запущенные на клиентских машинах, сначала резолвять ДНС имена, а потом уже отправляют трафик на полученный адрес. Поэтому, если вы будете использовать ДНС вашего провайдера, то будет утечка ДНС. Если взять какой-то публичный ДНС, то, во-первых, не все прокси поддерживают UDP (но с помощью sing-box ДНС можно резолвить и по TCP) , а во-вторых вы все равно не будете выглядеть, как обычный пользователь (например, если у вас резидентский или мобильный прокси, но при этом ДНС не этого же провайдера). Поэтому нужно настроить в sing-box режим fakeip, чтобы он отдавал на ДНС запросы адреса из некоторого диапазона (например, 198.18.0.0/15), а потом маршрутизировал запросы к этим адресам через прокси, подставляя вместо этих адресов имена хостов (см. в конфиге опцию sniff_override_destination в inbound).
Поэтому:

  1. Если вы настраиваете это на Виндовс, то там, на сколько я знаю, нет никакого tproxy (transparent proxy), а если в качестве inbound в конфиге sing-box’a поставить tun, то у меня так ничего и не заработало.
  2. Если вам не нужен именно “родной” ДНС прокси, а надо просто ДНС запросы пускать через прокси, то вы можете выставить в настройках какой-либо публичный ДНС, например, 1.1.1.1. Тогда, если весь ваш трафик идет в прокси, то туда пойдут и ДНС запросы.
  3. Если всё же нужен “родной” ДНС, то можно попробовать обойтись без fakeip так. Попробовать в качестве ДНС сервера в настройках sing-box указать что-то типа:
    “dns”: { “servers”: [
    {“tag”: “remotedns”,
    “address”: “127.0.0.1:53”,
    “detour”: “socks-out” }]}
    Для некоторых прокси это сработает, т.к. у них есть служба ДНС на локальном хосте на порту 53 (также можно протестировать порт 5353 и адрес 127.0.0.53). Но этот способ не подойдет для всех прокси.
  4. Вообще не плохо бы проверить, какой ДНС используется на прокси (DNS Leak Test - BrowserLeaks). Если там и так используется публичный ДНС, то все эти манипуляции теряют смысл, просто ставьте этот ДНС себе в настройки (см. п. 2).
  5. Если всё же нужно именно так, чтобы вне зависимости от того, какой прокси вы используете, все запросы ходили через его “родной” ДНС, то смотрите конфиг в прикрепленном файле. Но имейте ввиду, что там запустается fakeip на 5353 порту. А направлять туда клиентские запросы нужно уже самому через iptables/nftables.
    sing-box-native-dns.json (2,5 КБ)