Если не ошибаюсь, в сингбокс можно прописать detour не только в outbounds, но и в inbounds
Посмотрел – действительно, однако это только для перенаправления на другой inbound по tag в том же процессе.
If set, connections will be forwarded to the specified inbound.
Requires target inbound support, see Injectable.
Видимо только endpoint сработает
An endpoint is a protocol with inbound and outbound behavior.
Либо если у конечного устройства WAN – белый IP – просто inbound.
Пример готового конфига сервера и клиента, где всё это настроено, не можете показать?
Вот, ловите:
Сервер
{
"log": {
"level": "info"
},
"dns": {
"servers": [
{
"type": "tls",
"tag": "google",
"server": "8.8.8.8",
"tls": {
"enabled": true,
"server_name": "dns.google"
}
},
{
"tag": "local",
"type": "udp",
"server": "77.88.8.8"
}
],
"rules": [
{
"rule_set": [
"geosite-category-ru"
],
"server": "local"
},
{
"rule_set": [
"geosite-category-ads-all"
],
"action": "predefined",
"rcode": "NXDOMAIN"
},
{
"query_type": [
"A",
"AAAA"
],
"server": "google"
}
],
"reverse_mapping": true
},
"endpoints": [
{
"type": "wireguard",
"tag": "warp-ep",
"system": false,
"name": "wg0",
"mtu": 1280,
"address": [
"<CIDR_REDACTED>",
"<CIDR_REDACTED>"
],
"private_key": "<REDACTED>",
"domain_resolver": "google",
"peers": [
{
"address": "engage.cloudflareclient.com",
"port": 2408,
"public_key": "<REDACTED>",
"allowed_ips": [
"0.0.0.0/0",
"::/0"
]
}
]
}
],
"inbounds": [
{
"type": "vless",
"tag": "reality-in",
"listen": "<IP_REDACTED>",
"listen_port": 443,
"users": [
{
"name": "clearnet",
"uuid": "<REDACTED>"
},
{
"name": "i2p",
"uuid": "<REDACTED>"
}
],
"tls": {
"enabled": true,
"server_name": "<SNI_REDACTED>",
"reality": {
"enabled": true,
"handshake": {
"server": "<SNI_REDACTED>",
"server_port": 443
},
"private_key": "<REDACTED>",
"short_id": [
"<REDACTED>"
],
"max_time_difference": "1m"
}
},
"transport": {
"type": "grpc",
"service_name": "TunService",
"idle_timeout": "15s",
"ping_timeout": "15s",
"permit_without_stream": false
}
}
],
"outbounds": [
{
"type": "direct",
"tag": "direct",
"inet4_bind_address": "<IP_REDACTED>"
},
{
"type": "socks",
"tag": "i2p-socks",
"server": "127.0.0.1",
"server_port": 4447,
"inet4_bind_address": "<IP_REDACTED>"
},
{
"type": "socks",
"tag": "tor-socks",
"server": "127.0.0.1",
"server_port": 9050,
"inet4_bind_address": "<IP_REDACTED>"
}
],
"route": {
"rules": [
{
"action": "sniff"
},
{
"type": "logical",
"mode": "or",
"rules": [
{
"protocol": "dns"
},
{
"port": 53
}
],
"action": "hijack-dns"
},
{
"protocol": "bittorrent",
"action": "reject"
},
{
"rule_set": [
"geosite-category-ru"
],
"action": "resolve",
"server": "local"
},
{
"rule_set": [
"geosite-category-ads-all"
],
"action": "resolve"
},
{
"rule_set": [
"geoip-tor"
],
"action": "route",
"outbound": "direct"
},
{
"ip_cidr": [
"17.0.0.0/8"
],
"action": "route",
"outbound": "direct"
},
{
"rule_set": [
"geoip-telegram"
],
"action": "route",
"outbound": "direct"
},
{
"domain": [
"4pda.to"
],
"domain_suffix": [
"openh264.org"
],
"action": "route",
"outbound": "tor-socks"
},
{
"rule_set": [
"geosite-openai",
"geosite-tiktok",
"geosite-bytedance",
"geosite-jetbrains",
"geosite-jetbrains-ai",
"geosite-google-deepmind",
"geosite-habr",
"geosite-rutracker",
"geosite-spotify"
],
"action": "route",
"outbound": "tor-socks"
},
{
"rule_set": [
"geosite-category-ads-all"
],
"action": "reject"
},
{
"auth_user": [
"i2p"
],
"action": "route",
"outbound": "i2p-socks"
},
{
"auth_user": [
"clearnet"
],
"action": "route",
"outbound": "warp-ep"
}
],
"rule_set": [
{
"tag": "geosite-category-ru",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/release/sing-box/rule-set-geosite/geosite-category-ru.srs"
},
{
"tag": "geoip-tor",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/release/sing-box/rule-set-geoip/geoip-tor.srs"
},
{
"tag": "geoip-telegram",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/release/sing-box/rule-set-geoip/geoip-telegram.srs"
},
{
"tag": "geosite-openai",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/release/sing-box/rule-set-geosite/geosite-openai.srs"
},
{
"tag": "geosite-tiktok",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/release/sing-box/rule-set-geosite/geosite-tiktok.srs"
},
{
"tag": "geosite-bytedance",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/release/sing-box/rule-set-geosite/geosite-bytedance.srs"
},
{
"tag": "geosite-jetbrains",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/release/sing-box/rule-set-geosite/geosite-jetbrains.srs"
},
{
"tag": "geosite-habr",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/release/sing-box/rule-set-geosite/geosite-habr.srs"
},
{
"tag": "geosite-jetbrains-ai",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/release/sing-box/rule-set-geosite/geosite-jetbrains-ai.srs"
},
{
"tag": "geosite-google-deepmind",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/release/sing-box/rule-set-geosite/geosite-google-deepmind.srs"
},
{
"tag": "geosite-rutracker",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/release/sing-box/rule-set-geosite/geosite-rutracker.srs"
},
{
"tag": "geosite-spotify",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/release/sing-box/rule-set-geosite/geosite-spotify.srs"
},
{
"tag": "geosite-category-ads-all",
"type": "remote",
"format": "binary",
"url": "https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/release/sing-box/rule-set-geosite/geosite-category-ads-all.srs"
}
],
"default_domain_resolver": "google",
"final": "direct",
"auto_detect_interface": true
},
"experimental": {
"cache_file": {
"enabled": true,
"store_rdrc": true
}
}
}
Клиент
{
"log": {
"disabled": false,
"level": "warn",
"timestamp": true
},
"dns": {
"servers": [
{
"tag": "google",
"type": "tls",
"server": "8.8.8.8",
"tls": {
"enabled": true,
"server_name": "dns.google"
}
},
{
"tag": "remote",
"type": "fakeip",
"inet4_range": "198.18.0.0/15",
"inet6_range": "fc00::/18"
}
],
"rules": [
{
"query_type": [
"A",
"AAAA"
],
"server": "remote"
}
],
"strategy": "ipv4_only"
},
"inbounds": [
{
"type": "mixed",
"tag": "mixed-in",
"listen": "127.0.0.1",
"listen_port": 1080
},
{
"type": "socks",
"tag": "i2p-local",
"listen": "127.0.0.1",
"listen_port": 4447
},
{
"type": "tun",
"tag": "tun-in",
"interface_name": "singtun0",
"address": [
"172.19.16.1/30",
"fdfe:dcba:9876::1/126"
],
"stack": "gvisor",
"auto_route": true,
"auto_redirect": true,
"strict_route": true
}
],
"outbounds": [
{
"type": "vless",
"tag": "vless-alt",
"server": "<IP_REDACTED>",
"server_port": 443,
"uuid": "<REDACTED>",
"flow": "xtls-rprx-vision",
"network": "tcp",
"packet_encoding": "xudp",
"tls": {
"enabled": true,
"server_name": "<SNI_REDACTED>",
"utls": {
"enabled": true,
"fingerprint": "firefox"
},
"reality": {
"enabled": true,
"public_key": "<REDACTED>",
"short_id": "<EMPTY>"
}
}
},
{
"type": "vless",
"tag": "reality-out",
"server": "<IP_REDACTED>",
"server_port": 443,
"uuid": "<REDACTED>",
"packet_encoding": "xudp",
"tls": {
"enabled": true,
"server_name": "<SNI_REDACTED>",
"utls": {
"enabled": true,
"fingerprint": "chrome"
},
"reality": {
"enabled": true,
"public_key": "<REDACTED>",
"short_id": "<REDACTED>"
}
},
"transport": {
"type": "grpc",
"service_name": "TunService",
"idle_timeout": "15s",
"ping_timeout": "15s",
"permit_without_stream": false
}
},
{
"type": "vless",
"tag": "reality-i2p-out",
"server": "<IP_REDACTED>",
"server_port": 443,
"uuid": "<REDACTED>",
"packet_encoding": "xudp",
"tls": {
"enabled": true,
"server_name": "<SNI_REDACTED>",
"utls": {
"enabled": true,
"fingerprint": "chrome"
},
"reality": {
"enabled": true,
"public_key": "<REDACTED>",
"short_id": "<REDACTED>"
}
},
"transport": {
"type": "grpc",
"service_name": "TunService",
"idle_timeout": "15s",
"ping_timeout": "15s",
"permit_without_stream": false
}
},
{
"type": "direct",
"tag": "direct"
}
],
"route": {
"rules": [
{
"action": "sniff"
},
{
"protocol": "bittorrent",
"outbound": "direct"
},
{
"type": "logical",
"mode": "or",
"rules": [
{
"protocol": "dns"
},
{
"port": 53
}
],
"action": "hijack-dns"
},
{
"type": "logical",
"mode": "or",
"rules": [
{
"port": 853
},
{
"network": "udp",
"port": 443
},
{
"protocol": "stun"
}
],
"action": "reject"
},
{
"ip_is_private": true,
"action": "route",
"outbound": "direct"
},
{
"inbound": [
"i2p-local"
],
"action": "route",
"outbound": "reality-i2p-out"
},
{
"inbound": [
"mixed-in"
],
"action": "route",
"outbound": "vless-alt"
}
],
"default_domain_resolver": "google",
"final": "reality-out",
"auto_detect_interface": true
},
"experimental": {
"cache_file": {
"enabled": true,
"store_rdrc": true
}
}
}
Часть route.rules я убрал, часть rule_set тоже, т.к это специфично для меня было.
Меняйте под себя, добавляйте свои списки.
Вот здесь в поиске по файлам ищите списки и на сервере в конце добавляйте.
Спасибо, буду разбираться.
Уязвимость с Reality -- уже не актуально, пока уязвимость лишь в IP чекерах
Обнаружена уязвимость в предложенной схеме, благодарю пользователя @sa05 за бдительность.
Больше нельзя пускать в DIRECT с сервера по geosite, только CIDR сервисов, на которых нельзя размещать свои сервера (с шпионскими Reality).
Например, убрать geosite:youtube. На серверах Google Cloud можно расположить фейк SNI YouTube Reality сервер.
Вместо geosite:telegram → geoip:telegram
Вместо geosite:apple → 17.0.0.0/8 (ip_cidr)
А можно поподробнее для понимания? Тоесть все сервисы, где можно арендовать сервер, мы пускаем не в direct, а, допустим, в warp? Непонятно зачем т.к. ссылки на уязвимость нет
Ты сам-то пробовал эту “уязвимость”? Если трафик проходит через sing-box с включенным сниффингом, трафик не пойдет на их фейк сервер, он пойдет на оригинальный youtube. Можешь сам попробовать, настрой синг-бокс на роутере, затем включи реалити на телефоне на любой левый домен и посмотри что будет.
Вот тут детально разжевано:
Аналогичный вопрос, только не понимаю зачем вообще пускать что-то в директ на сервере, если задумка минимизировать вероятность слива IP + с купленным вторым (без варпов) скорость будет одинаковая.
Подскажите пожалуйста, как проверить можно ли из Knox Secure Folder постучатся в tun0 , и выйти в интернет. Я вроде настроил так что в обычном пользователе в tun0 могут постучатся только избранные приложения ( а в proxy вообще никто ). Теперь сомнения насчет secure folder… Termux внутри не заводится
использовал это ( только в посте небольшая дизинфа, и мне пришлось закинуть все приложения насильно в bypass )
Обращаемся к своему IP с каким-то SNI, который поддерживает сервер.
То есть при обращении к своему IP (не резолвя ничего), sing-box сервер сделает IP override?
То есть я правильно понимаю, что sing-box всегда разрывает уже установленное соединение к конкретному IP с каким-то SNI, каждый раз делая новый DNS резолвинг и открывая новое соединение к другому IP (фактически MITM) для каждого соединения с SNI?
У меня вопрос: а непроще использовать тот же warp или warp+ на сервере зарубежом?
Ставим tcp/udp outbound warp. Что шпион увидит? IP адрес cloudflare в условной Британии.
Единственное что беспокоит - может спалить домашний/мобильный ip адрес: оправит запрос на какой-нибуть чекер, когда впн включен - ip Британии. Через несколько часов опять запрос на российский чекер - ip домашнего инетрнета. Значит человек с ip такого-то подключается к ip такому-то. И если на мобильный ip адрес в целом пофиг, он постоянно меняется. Обидно слить домашний, особенно если он белый.
В качестве второго хопа к каким-то сервисам – пойдет. Но для большинства просто Tor работает. Иностранный сервер не обязательно, можно любой прокси/VPN использовать как detour к WARP, настроенному на своем ру-VPS хабе.
В предложенной схеме я явно говорю о том, что сливать домашний IP нельзя. Не делайте DIRECT (КРОМЕ белых списков из доверенных ресурсов / bittorrent) с того же IP с которого подключаетесь к туннелю, это чревато.
ну директ тут не причем, выключите впн и шпион сразу спалит мой домашний ip.
Мне пока видится такая схема:
Клиент –> RU VPS –> EU VPS –> Warp –> Весь интернет
|
РУ Интернет
Насколько я помню, в обоих ядрах поведение всегда разрывать или держать уже открытые пока возможно настраивается отдельным параметром, но его надо искать.
Нет, но я понимаю, что всегда гарантировать IP override обычно не выходит. Обычно такое можно контролировать на уровне клиента ещё до установления соединения, но не все реализации клиентов не на всех устройствах гарантируют это.
То есть данный тезис не исчезает полностью. sing-box не гарантирует вам IP override.
Выключать не нужно. Туннель должен идти 24/7. Если клиент этого не гарантирует – перенесите контроль на OpenWRT роутер.
В общем, второй хоп выбирается исходя из политик сервисов. Четырехэтажные схемы я бы не делал.
С ру-впс можно почти куда угодно попасть, правильно выбрав апстрим с него.
Ну я потестил с дефолтным xray-core и sing-box на роутере в режиме прозрачного прокси, а также с shadowrocket на iOS и v2rayng на андроиде, везде это работало одинаково. тест очень простой - curl -vvv https://youtube.com --resolve youtube.com:443:test_ip Трафик НЕ должен идти на test_ip
Вы имели ввиду на роутер ставить прокси?
Что ж, если я правильно понимаю, работает так:
- TLS SNI – есть.
- Sniffing – есть.
- Маршрутизация – на сервере.
- DST_IP (шпиона) – не используется – сервер использует свой DNS и сам открывает соединение.
В таком случае да, вы правы. Уязвимости с Reality на самом деле нет.
Теперь вообще нельзя в DIRECT сливать к сервисам, особенно если вы не сделали обязательное разделение входного/выходного IP. Потенциально любой сервис может его вернуть в своем API.
Только с сервисам, без web стека. Какие-то низкоуровневые (TCP/UDP) подключения только, но это всё равно опасно.
Уже не требуется. Но да, это имел ввиду, OpenWRT роутер.
а что тогда? воркэраунд нашли?