Настройка sing-box. Как зароутить в прокси ipv6-only домены не сломав все остальное?

Это я заметил) Но не могу понять как коррелирует этот резолвинг и старые добрые dns rules

Если у вас в каком-то поле конфигурации встретится домен (например "server": "google.com" ), sing-box отрезолвит его через указанный DNS. К перехваченным системным запросам оно не имеет отношения.

Вот мой полный конфиг (только настройки серверов стёр). И у меня внизу правило, чтобы ntc шел через конкретный сервер, потому что другой не поддерживает ipv6. Писал его полностью сам по официальной документации, мог где-то ерунду сделать, но работает.

{
  "log": {
    "level": "warn",
    "timestamp": true
  },
  "dns": {
    "strategy": "ipv4_only",
    "reverse_mapping": true,
    "servers": [
      {
        "type": "https",
        "tag": "dns-secure",
        "server": "8.8.8.8",
        "tls": {
          "server_name": "dns.google"
        },
        "detour": "proxy-select"
      },
      {
        "type": "local",
        "tag": "dns-direct"
      }
    ],
    "rules": [
      {
        "domain_suffix": [
          "ntc.party"
        ],
        "server": "dns-secure",
        "strategy": "prefer_ipv4"
      },
      {
        "domain_suffix": [
          "blocked.ru"
        ],
        "server": "dns-secure"
      },
      {
        "domain_suffix": [
          ".ru"
        ],
        "server": "dns-direct"
      }
    ],
    "final": "dns-secure"
  },
  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-in",
      "address": [
        "172.19.0.1/30",
        "fdfe:dcba:9876::1/126"
      ],
      "auto_route": true,
      "stack": "system",
      "mtu": 1400
    }
  ],
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct"
    },
    {
      "type": "selector",
      "tag": "proxy-select",
      "outbounds": [
        "Proxy1",
        "Proxy2"
      ],
      "default": "Proxy1",
      "interrupt_exist_connections": true
    },
    {
      "type": "selector",
      "tag": "google-select",
      "outbounds": [
        "Proxy1",
        "Proxy2"
      ],
      "default": "Proxy2",
      "interrupt_exist_connections": true
    },
    {
      "type": "vless",
      "tag": "Proxy1"
    },
    {
      "type": "anytls",
      "tag": "Proxy2"
    }
  ],
  "route": {
    "final": "proxy-select",
    "auto_detect_interface": true,
    "override_android_vpn": true,
    "default_domain_resolver": {
      "server": "dns-secure"
    },
    "rule_set": [
      {
        "tag": "geosite-google",
        "type": "remote",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-google.srs"
      },
      {
        "tag": "geosite-youtube",
        "type": "remote",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-youtube.srs"
      }
    ],
    "rules": [
      {
        "inbound": "tun-in",
        "action": "resolve"
      },
      {
        "inbound": "tun-in",
        "action": "sniff",
        "sniffer": [
          "http",
          "tls",
          "dns",
          "quic"
        ],
        "timeout": "300ms"
      },
      {
        "protocol": "dns",
        "action": "hijack-dns"
      },
      {
        "rule_set": [
          "geosite-youtube",
          "geosite-google"
        ],
        "action": "route",
        "outbound": "google-select"
      },
      {
        "domain_suffix": [
          "ntc.party"
        ],
        "action": "route",
        "outbound": "Proxy1"
      },
      {
        "domain_suffix": [
          "blocked.ru"
        ],
        "action": "route",
        "outbound": "proxy-select"
      },
      {
        "domain_suffix": [
          ".ru",
          "reddit.com",
          "imgur.com"
        ],
        "action": "route",
        "outbound": "direct"
      }
    ]
  },
  "experimental": {
    "cache_file": {
      "enabled": true
    }
  }
}

Я использую sing-box в качестве клиента и сервера. Ядра должны быть одинаковыми, тогда с мультиплексированием и прочими частями все будет хорошо. И не нужно будет себя ограничивать небольшим совместимым подмножеством.
Ранее в другой теме об этом писал.

Параметр default_domain_resolver в первую очередь нужен для разрешения доменов из конфига. Но не только. Если внешнее приложение в том же socks5 укажет внутри домен подключения (вместо ip), а не само будет через socks5 слать dns запросы, то этот домен тоже будет разрешен через dns по умолчанию, а не по правилам dns. Чтобы этого избежать у меня добавлено правило resolve в rules (методом тыка добавил, заработало).

Спасибо! Теперь стало понятно :fire:

Дай бог вам здоровья :)) Все заработало! (проверил пока только на windows)

Я ходил вокруг да около, но все эти параметры вместе не пробовал видимо. Но помимо вашего конфига пришлось еще yandex DOH прикрутить - без него тупили ru/direct домены. Тут в треде парень писал про потенциальные проблемы с direct dns без doh/dot: может зациклиться. Возможно это я и поймал.

Всем спасибо!

Итоговый конфиг
{
  "log": {
    "level": "warn"
  },
  "dns": {
	"strategy": "ipv4_only",
	"reverse_mapping": true,
	"final": "dns-local",
    "servers": [
      {
        "type": "https",
        "tag": "dns-remote",
        "server": "8.8.8.8",
        "tls": {
          "server_name": "dns.google"
        },
        "detour": "vps-proxy-selector"
      },
	  {
        "type": "https",
        "tag": "dns-local",
        "server": "77.88.8.8",
        "tls": {
          "server_name": "common.dot.dns.yandex.net"
        }
      }
    ],
	"rules": [
      {
		"action": "predefined",
		"rcode": "REFUSED",
        "rule_set": [
          "geosite:category-ads-all"
        ]
      },
      {
		"action": "predefined",
		"rcode": "REFUSED",
        "domain_suffix": [
          "appcenter.ms",
          "firebase.io",
          "crashlytics.com"
        ]
      },
      {
        "domain_suffix": [
          "sagernet.org"
        ],
		"rule_set": [
          "geosite:youtube",
        ],
        "server": "dns-remote"
      },
      {
		"domain_suffix": [
          ".ru"
        ],
		"rule_set": [
          "geosite:category-ru"
        ],
        "server": "dns-local"
      },
      {
        "domain_suffix": [ 
          "ntc.party"
        ],
        "server": "dns-remote",
        "strategy": "prefer_ipv4"
      }
    ]
  },
  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-proxy",
      "interface_name": "tun-proxy",
      "address": [
		"172.19.0.1/24",
		"fdfe:dcba:9876::1/126"
	  ],
      "mtu": 1500,
      "auto_route": true,
      "stack": "mixed"
    }
  ],
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct"
    },
	{
      "type": "selector",
      "tag": "vps-proxy-selector",
      "outbounds": ["proxy1", "proxy2", "proxy3"],
      "default": "proxy2"
    },
	{
      "type": "vless",
      "tag": "proxy1",
      "server": "",
      "server_port": ,
      "uuid": "",
      "flow": "xtls-rprx-vision",
      "network": "tcp",
      "tls": {
        "enabled": true,
        "insecure": false,
        "server_name": "",
        "utls": {
          "enabled": true,
          "fingerprint": "chrome"
        },
        "reality": {
          "enabled": true,
          "public_key": "",
          "short_id": ""
        }
      }
    },
    {
      "type": "vless",
      "tag": "proxy2",
      "server": "",
      "server_port": ,
      "uuid": "",
      "flow": "xtls-rprx-vision",
      "network": "tcp",
      "tls": {
        "enabled": true,
        "insecure": false,
        "server_name": "",
        "utls": {
          "enabled": true,
          "fingerprint": "chrome"
        },
        "reality": {
          "enabled": true,
          "public_key": "",
          "short_id": ""
        }
      }
    },
    {
      "type": "shadowsocks",
      "tag": "proxy3",
      "server": "",
      "server_port": ,
      "method": "2022-blake3-aes-256-gcm",
      "password": ""
    }
  ],
  "route": {
	"final": "direct",
	"auto_detect_interface": true,
	"default_domain_resolver": {
      "server": "dns-remote"
    },
    "rules": [
	  {
		"action": "resolve",
        "inbound": "tun-proxy"
      },
      {
		"action": "sniff",
        "sniffer": [
          "http",
          "tls",
          "dns",
          "quic"
        ],
		"inbound": "tun-proxy",
      },
      {
		"action": "hijack-dns",
        "protocol": "dns"
      },
	  {
		"ip_is_private": true,
		"outbound": "direct"
	  },
      {
		"action": "reject",
        "network": "udp",
        "port": 443
      },
      {
		"action": "reject",
        "rule_set": [
          "geosite:category-ads-all"
        ]
      },
      {
        "protocol": "bittorrent",
		"outbound": "direct"
      },
      {
        "domain_suffix": [
          ".ru"
        ],
		"rule_set": [
          "geosite:category-ru"
        ],
        "rule_set": [
          "geoip:ru",
          "geoip:by"
        ],
        "outbound": "direct"
      },
      {
        "domain_suffix": [
          "sagernet.org"
        ],
		"rule_set": [
          "geosite:youtube"
        ],
        "ip_cidr": [
        ],
        "outbound": "vps-proxy-selector"
      }
    ],
    "rule_set": [
	  {
        "tag": "geoip:by",
        "type": "remote",
        "format": "binary",
        "url": "https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-by.srs",
        "download_detour": "vps-proxy-selector"
      },
	  ...
    ]
  },
  "experimental": {
      "cache_file": {
  	  "enabled": true
    }
  }
}

P.S. Если кто-то шарит как без яндекс DoH настроить direct DNS - подскажите, пожалуйста :slight_smile:

Указать адрес роутера, серверов провайдера или локального кэширующего резолвера?

Да, это рабочий вариант, но для каждой платформы нужно модифицировать этот локальный адрес (разные провайдеры, разные gateway и прочее). Хочется универсальный конфиг, хотя бы в плане dns.

При этом стандартный local dns вызывает дичайшие задержки, логи пока не курил

  {
    "type": "local",
    "tag": "dns-local"
  }

Странно, у меня нормально работает. Или я просто не замечаю задержку. И в логах ничего такого нет (в случае зацикливания вроде бы должна быть специальная ошибка про loopback). И я использую одинаковый конфиг что на android, что на windows.

Я как минимум видел в логах вот такое. Тут вон в логе даже 2 секунды видно.

DEBUG[0003] [3017990089 1.7s] dns: exchange ad.mail.ru. IN AAAA
DEBUG[0003] [3502562283 1.7s] dns: match[7] domain_suffix=[.ru .su .рф…] rule_set=geosite:category-ru => route(dns-local)
DEBUG[0003] [3502562283 1.7s] dns: strategy rejected

При этом если указать адрес роутера то все ок:

{
“type”: “udp”,
“tag”: “dns-local”,
“server”: “192.168.1.1”,
}

У меня еще dnsmasq в роутере прописан свой собственный, мб он аффектит, хз пока.

Но лаг только первый раз, потом видимо где-то кеш работает и проблем нет. 100% с dns косяк какой-то

Попробовал раздать с мобильного телефона интернет - на нем все ок. На время теста отключил ethernet кабель. Воткнул обратно, отключил мобильный интернет, - все заработало нормально :distorted_face:

А чем вы на android пользуетесь? Я просто на nekobox с 2023 года сидел :slight_smile:

От авторов sing-box есть родной клиент на android: sing-box for Android - sing-box

Самое простое - установить через F-Droid. Там по сути только кнопка включения и выключения, список профилей, редактирование текстового конфига, лог.

Не так уж оно и аскетично, как выглядит на первый взгляд). Стоит в конфиге прописать клэш-моды и прочие селекторы, и меню приложения заиграет новыми кнопочками-функциями).

Да, я пользуюсь активно, мне такой формат по душе ) Как раз после приложения на android не хватало чего-то такого же простого под Windows (с минимальной интеграцией в ОС). Поэтому сам для себя написал: Простое управление sing-box через значок в трее

А я пользуюсь вэб-панелькой https://github.com/MetaCubeX/metacubexd
Хотя на домашнем ПК давненько не запускал sing-box. Написал скрипт для роутеров Asus, и sing-box крутится на нём для нужных устройств дома. А в панельку лазию иногда посмотреть статистику.

Безымянный

Прикольно, поизучаем :fire:

А я просто ярлык себе сделал, который запускает sing-box)

Дешево и сердито: C:\Windows\System32\cmd.exe /c “D:\sing-box-1.12.12.exe run -c D:\config_1.12.12.json”

image

У меня по моему как раз ваш скрипт стоит к слову, но старой версии. Но речь не о скрипте, а о том что при 200 Мб/cек скорости cpu роутера под 100% :slight_smile: А у меня гигабитный канал, как то не очень получается. Поэтому на роутере чисто для телевизора стоит sing-box по сути.

Если у вас удалось через роутер с sing-box под 1 Gb/s гонять трафик - поделитесь, пожалуйста, знанием)

Я несколько ярлыков сделал, использующих PuTTY- для запуска, остановки и перезагрузки.

Безымянный

С версии 2.0 можно использовать TPROXY inbound. С ним такой катастрофической загрузки проца не наблюдается. У меня то дома канал всего 100 МБит, так что я и с TUN inbound серьёзной нагрузки на проц не наблюдал, но тут ещё от самого проца зависит, естественно. А так, перед релизом версии 2.0, тестировал её человек с таким же роутером, как у меня и с каналом в 600 МБит, и скорость при этом у него упёрлась не в проц, в тариф). Ещё есть способ использовать fakeip, если через прокси предполагается пускать только избранные домены, то скорость с tun будет резаться только к этим доменам, а к остальному трафику не будет. Ну и с tproxy тоже можно fakeip использовать.