DNS: безопасный dns в Clash-подписке (kit-sub), DoH в Xray JSON (kit net dns), AmneziaWG вне автовыбора; проверено клиентами Mihomo и Xray

This commit is contained in:
maxdmitrov
2026-10-05 16:00:59 +03:00
parent eb152b201f
commit 21c3ac18c2
6 changed files with 79 additions and 5 deletions
+1 -1
View File
@@ -6,7 +6,7 @@
* `kit` без аргументов открывает меню, как у x-ui: нажали цифру – готово. Всё про сеть собрано в `kit net`: порты, протоколы, сайт маскировки, отпечаток. Команды остались для скриптов, команд стало меньше, а умеет `kit` больше.
* Установка теперь по шагам, а все ссылки разложены по полочкам: основные и запасные. Раньше они сыпались потоком, как лента новостей.
* Сайт-прикрытие подбирается среди соседей по подсети, а не «у всех один». Свой домен по-прежнему лучший вариант. REALITY теперь с `xtls-rprx-vision`, Hysteria2 отвечает на чужой запрос страницей сайта.
* `kit check --deep` подключается к серверу настоящим клиентом, `--fix` лечит безопасное. Общий лимит трафика считается по всем подключениям пользователя, а в подписке Clash есть «Авто»: клиент сам выбирает быстрейший протокол.
* `kit check --deep` подключается к серверу настоящим клиентом, `--fix` лечит безопасное. Общий лимит трафика считается по всем подключениям пользователя, а в подписке Clash есть «Авто»: клиент сам выбирает быстрейший протокол. DNS в подписках теперь по DoH через прокси, чтобы имена сайтов не бегали к провайдеру на экскурсию.
* Вернулся `--restore`: чистый сервер поднимается из `kit backup`, как из резервной копии настроек телефона. Ссылки `kit user link --amnezia` и `--telegram` для AmneziaVPN и Telegram теперь одной командой, а исправление времени на Debian 13 прислал [xlok1e](https://github.com/xlok1e), спасибо.
Сервер обновится сам этой ночью, нетерпеливым – `kit update`.
+11
View File
@@ -104,6 +104,7 @@ kit net port имя порт # сменить
kit net off имя / kit net on имя # выключить и включить протокол; kit net on reality2 – второй REALITY
kit net fp firefox # сменить отпечаток клиента у всех подключений
kit net masq on # Hysteria2 отвечает на чужой запрос страницей сайта
kit net dns on # DNS в подписке по DoH через прокси (ставится при установке)
kit check [--deep] [--fix] # проверить сервер; --deep – ещё и подключиться клиентом, --fix – исправить безопасное
kit update [--panel] # обновить сейчас; --panel – панель 3X-UI до проверенной версии
@@ -266,6 +267,16 @@ sh -c "$(curl -sSL https://raw.githubusercontent.com/jameszeroX/XKeen/main/insta
| Keenetic (XKeen) | Mihomo | `config.yaml` с автовыбором сервера, подпиской, Hysteria2, AmneziaWG и веб-панелью | [Открыть →](https://itsnotkubrick.github.io/3X-UI_KIT/tools/?core=mihomo) |
| OpenWrt (Nikki), бета | Mihomo | профиль для Nikki и команда, которая его включит | [Открыть →](https://itsnotkubrick.github.io/3X-UI_KIT/tools/?router=openwrt) |
## Утечки DNS
Подписка отдаёт приложению безопасный DNS: в Clash/Mihomo – `fake-ip` и DoH, который идёт по правилам (то есть через
прокси), в Xray JSON – DoH вместо обычного UDP. Проверено на сервере: при подключении через REALITY, XHTTP, Shadowsocks
и по JSON-подписке запросы имён наружу обычным DNS не уходят. Но многое решает само приложение, поэтому:
1. Включите режим **TUN** (весь трафик устройства) и **удалённый DNS**, отключите «локальный DNS» и IPv6, если он не нужен.
2. WireGuard и AmneziaWG приложение разрешает по обычному UDP внутри туннеля, поэтому в «Авто» они не входят (выбираются вручную).
3. Проверьте на [dnsleaktest.com](https://dnsleaktest.com) или [ipleak.net](https://ipleak.net): DNS вашего провайдера там появляться не должен.
## Если связь пропала
1. `kit check --deep` – проверит сервер и подключится к нему клиентом: так видно, виноват сервер или сеть.
+1
View File
@@ -668,6 +668,7 @@ main() {
/usr/local/bin/kit update --auto >/dev/null 2>&1 || later "Автообновление не включилось – включите позже: kit update --auto"
# Общий лимит трафика: у пользователя несколько записей (AmneziaWG считается отдельно), раз в 5 минут их трафик складывается.
/usr/local/bin/kit __limit-timer on >/dev/null 2>&1 || later "Проверка общего лимита трафика не включилась – включите позже: kit fix"
/usr/local/bin/kit net dns on >/dev/null 2>&1 || later "DNS в подписке не настроился – включите позже: kit net dns on"
# --- файрвол ---
if [[ $UFW == yes ]]; then
Binary file not shown.
+35 -3
View File
@@ -145,12 +145,16 @@ def add_auto(clash_yaml):
cfg = yaml.safe_load(clash_yaml)
if not isinstance(cfg, dict):
return clash_yaml
names = [p["name"] for p in cfg.get("proxies") or [] if isinstance(p, dict) and p.get("name")]
allp = [p for p in cfg.get("proxies") or [] if isinstance(p, dict) and p.get("name")]
names = [p["name"] for p in allp]
# WireGuard и AmneziaWG разрешают имена сайтов на самом клиенте (по обычному UDP внутри туннеля), поэтому в автовыбор
# не входят: по умолчанию клиент идёт протоколами, где имя уходит на сервер. Вручную их выбрать по-прежнему можно.
auto_names = [p["name"] for p in allp if p.get("type") != "wireguard" and "amnezia-wg-option" not in p]
groups = cfg.get("proxy-groups")
if len(names) < 2 or not isinstance(groups, list) or any(g.get("name") == AUTO_GROUP for g in groups if isinstance(g, dict)):
if len(auto_names) < 2 or not isinstance(groups, list) or any(g.get("name") == AUTO_GROUP for g in groups if isinstance(g, dict)):
return clash_yaml
groups.insert(0, {"name": AUTO_GROUP, "type": "url-test", "url": "http://www.gstatic.com/generate_204",
"interval": 300, "tolerance": 100, "lazy": True, "proxies": names})
"interval": 300, "tolerance": 100, "lazy": True, "proxies": auto_names})
for g in groups[1:]:
lst = g.get("proxies") if isinstance(g, dict) else None
if g.get("type") == "select" and isinstance(lst, list) and any(x in names for x in lst):
@@ -159,6 +163,32 @@ def add_auto(clash_yaml):
return yaml.safe_dump(cfg, allow_unicode=True, sort_keys=False).encode()
# DNS в Clash-подписке: 3X-UI профиль без раздела dns не присылает, и как клиент будет разрешать имена, зависит от
# самого приложения (системный DNS, возможны утечки). Добавляем безопасный вариант, если своего dns в профиле нет:
# fake-ip, запросы идут как обычный трафик по правилам (то есть через прокси) и по DoH, без запасного локального DNS.
# Адреса серверов имён – числовые, чтобы не нужен был ещё один запрос для их поиска.
DNS_BLOCK = {
"enable": True,
"ipv6": False,
"enhanced-mode": "fake-ip",
"fake-ip-range": "198.18.0.1/16",
"fake-ip-filter": ["*.lan", "+.local"],
"respect-rules": True,
"default-nameserver": ["1.1.1.1", "8.8.8.8"],
"nameserver": ["https://1.1.1.1/dns-query", "https://8.8.8.8/dns-query"],
# Имена самих серверов (если сервер задан доменом) разрешаются напрямую, но по DoH.
"proxy-server-nameserver": ["https://1.1.1.1/dns-query", "https://8.8.8.8/dns-query"],
}
def add_dns(clash_yaml):
cfg = yaml.safe_load(clash_yaml)
if not isinstance(cfg, dict) or "dns" in cfg:
return clash_yaml
cfg["dns"] = dict(DNS_BLOCK)
return yaml.safe_dump(cfg, allow_unicode=True, sort_keys=False).encode()
class Handler(http.server.BaseHTTPRequestHandler):
server_version = "nginx"
sys_version = ""
@@ -233,6 +263,8 @@ class Handler(http.server.BaseHTTPRequestHandler):
body = strip_links(body)
if code == 200 and clash and CONF.get("auto", True):
body = add_auto(body)
if code == 200 and clash and CONF.get("dns", True):
body = add_dns(body)
except (yaml.YAMLError, UnicodeError) as e:
log(f"не удалось обработать подписку: {e}")
+31 -1
View File
@@ -841,6 +841,9 @@ check_stealth() {
if jq -e 'any(.[]; .protocol == "hysteria" and .enable == true)' <<<"$list" >/dev/null && [[ -z $(hy_masq_state) ]]; then
c_warn "Hysteria2 на чужой HTTP/3-запрос отвечает не как сайт. Включить: kit net masq on"
fi
if [[ -z $(jq -r '.subJsonDns // ""' <<<"$(api POST setting/all '{}' 2>/dev/null)" 2>/dev/null) ]]; then
c_warn "DNS в подписке Xray JSON обычный (UDP 8.8.8.8). Включить DoH через прокси: kit net dns on"
fi
names=$(jq -r '[.[] | select(.enable == true and .listen != "127.0.0.1" and (.remark == "VLESS-WS" or .remark == "Trojan-gRPC" or .remark == "VMess-WS")) | .remark] | join(", ")' <<<"$list")
[[ -z $names ]] || c_warn "$names открыты на своих портах и на чужой заход отвечают пустой страницей. Не нужны? kit net off имя (режим «всё на 443» их прячет за сайтом)"
}
@@ -1642,6 +1645,32 @@ hy_masq() { # on|off
fi
}
# ---------- DNS в подписках ----------
# Clash/Mihomo: безопасный dns добавляет kit-sub. Xray JSON: dns берётся из настройки панели subJsonDns (по умолчанию – обычный
# UDP на 8.8.8.8), ставим DoH. Запросы идут по правилам клиента, то есть через прокси.
DNS_XRAY='{"servers":[{"address":"https://1.1.1.1/dns-query","skipFallback":false},{"address":"https://8.8.8.8/dns-query","skipFallback":true}],"queryStrategy":"UseIP","tag":"dns_out"}'
net_dns() { # [on|off]
local act=${1:-} all cur
all=$(api POST setting/all '{}')
cur=$(jq -r '.subJsonDns // ""' <<<"$all")
case $act in
"")
if [[ -n $cur ]]; then echo "DNS в подписках: DoH через прокси (Clash – от kit-sub, Xray JSON – настройка панели). Выключить: kit net dns off"
else echo "DNS в подписке Xray JSON: обычный UDP 8.8.8.8 (по умолчанию панели). Включить DoH: kit net dns on"; fi ;;
on)
[[ -z $cur ]] || { say "DNS уже настроен (DoH)."; return 0; }
api POST setting/update "$(jq -c --arg d "$DNS_XRAY" '.subJsonDns = $d' <<<"$all")" >/dev/null || die "Панель не приняла настройку."
systemctl restart x-ui; panel_healthy || warn "Панель не ответила после перезапуска: проверьте kit check."
say "DNS в подписках: DoH через прокси. Клиенты подхватят при обновлении подписки." ;;
off)
api POST setting/update "$(jq -c '.subJsonDns = ""' <<<"$all")" >/dev/null || die "Панель не приняла настройку."
systemctl restart x-ui; panel_healthy || true
say "Вернул DNS панели по умолчанию." ;;
*) die "kit net dns [on|off]" ;;
esac
}
# ---------- kit net: протоколы, порты, сайт маскировки, отпечаток ----------
net_main_name() { case $1 in REALITY | XHTTP | Hysteria2) return 0 ;; *) return 1 ;; esac; }
@@ -1761,8 +1790,9 @@ cmd_net() {
off | on) net_toggle "${sub,,}" "$@" ;;
fp) net_fp "$@" ;;
masq) hy_masq "$@" ;;
dns) net_dns "$@" ;;
vision) case ${1:-} in on) cmd_vision --all ;; off) cmd_vision --all off ;; *) die "kit net vision on|off" ;; esac ;;
*) die "kit net [site | port имя порт | off имя | on имя | fp отпечаток | masq on|off | vision on|off]" ;;
*) die "kit net [site | port имя порт | off имя | on имя | fp отпечаток | masq on|off | dns on|off | vision on|off]" ;;
esac
}