From f9e20769763bf5ee5449215b0543dc19bfa890b1 Mon Sep 17 00:00:00 2001 From: Zhang Zengbo Date: Wed, 5 Aug 2026 11:21:49 +0800 Subject: [PATCH] =?UTF-8?q?Feat:=20=E5=A2=9E=E5=8A=A0=E5=B1=80=E5=9F=9F?= =?UTF-8?q?=E7=BD=91=E5=86=85=E9=83=A8=E5=9F=9F=E5=90=8D=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/dns_direct_domains.list | 13 +++++ scripts/lang/chs/dns.lang | 18 ++++++ scripts/lang/en/dns.lang | 18 ++++++ scripts/menus/dns.sh | 99 ++++++++++++++++++++++++++++++++ scripts/starts/clash_modify.sh | 19 +++++- scripts/starts/singbox_modify.sh | 21 +++++++ 6 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 public/dns_direct_domains.list diff --git a/public/dns_direct_domains.list b/public/dns_direct_domains.list new file mode 100644 index 000000000..5bce6e3a4 --- /dev/null +++ b/public/dns_direct_domains.list @@ -0,0 +1,13 @@ +#LAN域名 - 局域网常见域名后缀 +*.lan +*.local +*.localdomain +*.home +*.internal +*.home.arpa +*.localnet + +#私有网络域名示例 +router.lan +nas.lan +*.home.lan \ No newline at end of file diff --git a/scripts/lang/chs/dns.lang b/scripts/lang/chs/dns.lang index 2ab7aa99d..6ff0bf099 100644 --- a/scripts/lang/chs/dns.lang +++ b/scripts/lang/chs/dns.lang @@ -65,3 +65,21 @@ DNS_ADD_FAIL="添加失败" DNS_NOW="当前DNS:" DNS_INPUT_NEW="请直接输入新的DNS地址" DNS_INPUT_RESET="或输入 r 重置DNS地址" + +#=====直连域名===== +DNS_DIRECT_MENU="管理直连域名列表" +DNS_DIRECT_DESC="用于在 mix/route 模式下指定特定域名使用直连 DNS 解析" +DNS_DIRECT_TIP="适用于局域网域名、内网服务域名等需要本地 DNS 解析的场景" +DNS_DIRECT_EXAMPLE="示例格式:\n*.lan\n*.local\nnas.home" +DNS_DIRECT_EXIST="已添加的直连域名:" +DNS_DIRECT_EMPTY="当前尚未添加任何自定义直连域名" +DNS_DIRECT_EDIT="输入序号删除,输入 a 添加域名,输入 r 加载预设,输入 t 测试域名" +DNS_DIRECT_ADD_LAN="添加局域网域名" +DNS_DIRECT_LOAD_PRESET="加载预设局域网域名列表" +DNS_DIRECT_LOAD_OK="已加载预设局域网域名列表" +DNS_DIRECT_INPUT_HINT="请输入需要直连解析的域名(支持通配符 *.lan)" +DNS_DIRECT_TEST="测试域名解析" +DNS_DIRECT_TEST_INPUT="请输入要测试的域名" +DNS_DIRECT_TEST_RESULT="解析结果:" +DNS_DIRECT_TEST_IN_LIST="✓ 该域名已配置为直连解析" +DNS_DIRECT_TEST_NOT_IN_LIST="✗ 该域名未在直连列表中" diff --git a/scripts/lang/en/dns.lang b/scripts/lang/en/dns.lang index 4793b4e5b..4e4ea6ac3 100644 --- a/scripts/lang/en/dns.lang +++ b/scripts/lang/en/dns.lang @@ -67,3 +67,21 @@ DNS_ADD_FAIL="Add failed" DNS_NOW="Current DNS: " DNS_INPUT_NEW="Please input a new DNS address" DNS_INPUT_RESET="or input r to reset the DNS address" + +#===== Direct DNS Domains ===== +DNS_DIRECT_MENU="Manage Direct DNS Domains" +DNS_DIRECT_DESC="Specify domains to use direct DNS resolution in mix/route mode" +DNS_DIRECT_TIP="Useful for LAN domains, intranet services, etc." +DNS_DIRECT_EXAMPLE="Examples:\n*.lan\n*.local\nnas.home" +DNS_DIRECT_EXIST="Added direct DNS domains:" +DNS_DIRECT_EMPTY="No custom direct DNS domains added" +DNS_DIRECT_EDIT="Enter number to delete, 'a' to add, 'r' to load preset, 't' to test" +DNS_DIRECT_ADD_LAN="Add LAN Domain" +DNS_DIRECT_LOAD_PRESET="Load Preset LAN Domains" +DNS_DIRECT_LOAD_OK="Preset LAN domains loaded successfully" +DNS_DIRECT_INPUT_HINT="Enter domain for direct DNS resolution (supports wildcards like *.lan)" +DNS_DIRECT_TEST="Test DNS Resolution" +DNS_DIRECT_TEST_INPUT="Enter domain to test" +DNS_DIRECT_TEST_RESULT="Resolution result:" +DNS_DIRECT_TEST_IN_LIST="✓ This domain is configured for direct DNS resolution" +DNS_DIRECT_TEST_NOT_IN_LIST="✗ This domain is not in the direct DNS list" diff --git a/scripts/menus/dns.sh b/scripts/menus/dns.sh index 72b0491ae..b2464d44a 100644 --- a/scripts/menus/dns.sh +++ b/scripts/menus/dns.sh @@ -25,6 +25,8 @@ set_dns_mod() { [ "$dns_mod" = "mix" ] && content_line "8) \033[33m$DNS_FAKEIP_MENU\033[0m" content_line "9) \033[36m$DNS_ADV_MENU\033[0m" + [ "$dns_mod" = "mix" ] || [ "$dns_mod" = "route" ] && + content_line "a) \033[32m$DNS_DIRECT_MENU\033[0m" content_line "" content_line "0) $COMMON_BACK" separator_line "=" @@ -116,6 +118,13 @@ set_dns_mod() { 9) set_dns_adv ;; + a) + if [ "$dns_mod" = "mix" ] || [ "$dns_mod" = "route" ]; then + dns_direct_domains + else + msg_alert "\033[33m直连域名功能仅在 mix/route 模式下可用!\033[0m" + fi + ;; *) errornum ;; @@ -172,6 +181,96 @@ fake_ip_filter() { done } +# 直连域名管理 +dns_direct_domains() { + while true; do + comp_box "\033[32m$DNS_DIRECT_DESC\033[0m" \ + "\033[36m$DNS_DIRECT_TIP\033[0m" \ + "$DNS_DIRECT_EXAMPLE" + if [ -s "$CRASHDIR/configs/dns_direct_domains" ]; then + content_line "\033[33m$DNS_DIRECT_EXIST\033[0m" + content_line "" + awk '{print NR") "$1}' "$CRASHDIR/configs/dns_direct_domains" | + while IFS= read -r line; do + content_line "$line" + done + else + content_line "\033[33m$DNS_DIRECT_EMPTY\033[0m" + fi + btm_box "" \ + "a) $DNS_DIRECT_ADD_LAN" \ + "r) $DNS_DIRECT_LOAD_PRESET" \ + "t) $DNS_DIRECT_TEST" \ + "0) $COMMON_BACK" + read -r -p "$DNS_DIRECT_EDIT> " input + case "$input" in + "" | 0) + break + ;; + a) + comp_box "$DNS_DIRECT_INPUT_HINT" + btm_box "1) $DNS_CONFIRM_OK" \ + "0) $COMMON_BACK" + read -r -p "$DNS_INPUT> " domain + case "$domain" in + 0) + continue + ;; + *) + if echo "$domain" >>"$CRASHDIR/configs/dns_direct_domains"; then + msg_alert "\033[32m$DNS_ADD_OK\033[0m" + else + msg_alert "\033[31m$DNS_ADD_FAIL\033[0m" + fi + ;; + esac + ;; + r) + if [ -s "$CRASHDIR/public/dns_direct_domains.list" ]; then + cat "$CRASHDIR/public/dns_direct_domains.list" >>"$CRASHDIR/configs/dns_direct_domains" + msg_alert "\033[32m$DNS_DIRECT_LOAD_OK\033[0m" + else + msg_alert "\033[31m预设文件不存在!\033[0m" + fi + ;; + t) + comp_box "$DNS_DIRECT_TEST_INPUT" + btm_box "1) $DNS_CONFIRM_OK" \ + "0) $COMMON_BACK" + read -r -p "$DNS_INPUT> " test_domain + case "$test_domain" in + 0) + continue + ;; + *) + # 使用本地 DNS 解析 + result=$(nslookup "$test_domain" 127.0.0.1:$dns_port 2>&1 || echo "解析失败") + comp_box "$DNS_DIRECT_TEST_RESULT" \ + "$result" + # 判断是否在直连列表中 + if [ -f "$CRASHDIR/configs/dns_direct_domains" ] && grep -qF "$test_domain" "$CRASHDIR/configs/dns_direct_domains"; then + content_line "\033[32m$DNS_DIRECT_TEST_IN_LIST\033[0m" + else + content_line "\033[33m$DNS_DIRECT_TEST_NOT_IN_LIST\033[0m" + fi + btm_box "0) $COMMON_BACK" + read -r -p "$COMMON_INPUT> " res + ;; + esac + ;; + *) + if [ "$input" -ge 1 ] 2>/dev/null; then + if sed -i "${input}d" "$CRASHDIR/configs/dns_direct_domains"; then + msg_alert "\033[32m$DNS_REMOVE_OK\033[0m" + else + msg_alert "\033[31m$DNS_REMOVE_FAIL\033[0m" + fi + fi + ;; + esac + done +} + # DNS详细设置 set_dns_adv() { while true; do diff --git a/scripts/starts/clash_modify.sh b/scripts/starts/clash_modify.sh index 493c0e200..b67a03305 100644 --- a/scripts/starts/clash_modify.sh +++ b/scripts/starts/clash_modify.sh @@ -48,12 +48,27 @@ EOF fi #mix模式fakeip绕过cn [ "$dns_mod" = "mix" ] && echo ' - "rule-set:cn"' >>"$TMPDIR"/dns.yaml + #mix和route模式插入用户自定义直连域名 + if [ "$dns_mod" = "mix" ] || [ "$dns_mod" = "route" ]; then + if [ -s "$CRASHDIR/configs/dns_direct_domains" ]; then + cat "$CRASHDIR/configs/dns_direct_domains" | grep -v '^#' | sed "s/^/ - '/" | sed "s/$/'/" >>"$TMPDIR"/dns.yaml + fi + fi #mix模式和route模式插入分流设置 if [ "$dns_mod" = "mix" ] || [ "$dns_mod" = "route" ]; then [ "$dns_protect" != "OFF" ] && dns_final="$dns_fallback" || dns_final="$dns_nameserver" + # 构建nameserver-policy + echo " respect-rules: true" >>"$TMPDIR"/dns.yaml + echo " nameserver-policy:" >>"$TMPDIR"/dns.yaml + # 添加用户自定义直连域名 + if [ -s "$CRASHDIR/configs/dns_direct_domains" ]; then + cat "$CRASHDIR/configs/dns_direct_domains" | grep -v '^#' | while read domain; do + [ -n "$domain" ] && echo " '$domain': [ $dns_nameserver ]" >>"$TMPDIR"/dns.yaml + done + fi + # 添加CN规则集 + echo " 'rule-set:cn': [ $dns_nameserver ]" >>"$TMPDIR"/dns.yaml cat >>"$TMPDIR"/dns.yaml <