From d96a7aa06e505324083c88a89257e82476a964ca Mon Sep 17 00:00:00 2001 From: actions Date: Tue, 6 Aug 2024 20:30:06 +0800 Subject: [PATCH] luci-app-passwall: sync upstream last commit: https://github.com/xiaorouji/openwrt-passwall/commit/c9dfa283f19fb767cfc7d0fd60cd724d31103bc8 --- .../luasrc/passwall/util_sing-box.lua | 24 +++++++-- .../root/usr/share/passwall/app.sh | 50 ++++++++++++++----- 2 files changed, 58 insertions(+), 16 deletions(-) diff --git a/luci-app-passwall/luasrc/passwall/util_sing-box.lua b/luci-app-passwall/luasrc/passwall/util_sing-box.lua index 9d02b21c7..61e7a23f2 100644 --- a/luci-app-passwall/luasrc/passwall/util_sing-box.lua +++ b/luci-app-passwall/luasrc/passwall/util_sing-box.lua @@ -754,6 +754,8 @@ function gen_config(var) local dns_listen_port = var["-dns_listen_port"] local direct_dns_port = var["-direct_dns_port"] local direct_dns_udp_server = var["-direct_dns_udp_server"] + local direct_dns_tcp_server = var["-direct_dns_tcp_server"] + local direct_dns_dot_server = var["-direct_dns_dot_server"] local direct_dns_query_strategy = var["-direct_dns_query_strategy"] local remote_dns_port = var["-remote_dns_port"] local remote_dns_udp_server = var["-remote_dns_udp_server"] @@ -1316,7 +1318,7 @@ function gen_config(var) } end - if direct_dns_udp_server then + if direct_dns_udp_server or direct_dns_tcp_server or direct_dns_dot_server then local domain = {} local nodes_domain_text = sys.exec('uci show passwall | grep ".address=" | cut -d "\'" -f 2 | grep "[a-zA-Z]$" | sort -u') string.gsub(nodes_domain_text, '[^' .. "\r\n" .. ']+', function(w) @@ -1335,12 +1337,26 @@ function gen_config(var) elseif direct_dns_query_strategy == "UseIPv6" then direct_strategy = "ipv6_only" end - - local port = tonumber(direct_dns_port) or 53 + + local direct_dns_server, port + if direct_dns_udp_server then + port = tonumber(direct_dns_port) or 53 + direct_dns_server = "udp://" .. direct_dns_udp_server .. ":" .. port + elseif direct_dns_tcp_server then + port = tonumber(direct_dns_port) or 53 + direct_dns_server = "tcp://" .. direct_dns_tcp_server .. ":" .. port + elseif direct_dns_dot_server then + port = tonumber(direct_dns_port) or 853 + if direct_dns_dot_server:find(":") == nil then + direct_dns_server = "tls://" .. direct_dns_dot_server .. ":" .. port + else + direct_dns_server = "tls://[" .. direct_dns_dot_server .. "]:" .. port + end + end table.insert(dns.servers, { tag = "direct", - address = "udp://" .. direct_dns_udp_server .. ":" .. port, + address = direct_dns_server, address_strategy = "prefer_ipv6", strategy = direct_strategy, detour = "direct", diff --git a/luci-app-passwall/root/usr/share/passwall/app.sh b/luci-app-passwall/root/usr/share/passwall/app.sh index 55aacd9d2..c7b3e35e4 100755 --- a/luci-app-passwall/root/usr/share/passwall/app.sh +++ b/luci-app-passwall/root/usr/share/passwall/app.sh @@ -354,7 +354,7 @@ run_ipt2socks() { run_singbox() { local flag type node tcp_redir_port udp_redir_port socks_address socks_port socks_username socks_password http_address http_port http_username http_password - local dns_listen_port direct_dns_port direct_dns_udp_server direct_dns_tcp_server remote_dns_protocol remote_dns_udp_server remote_dns_tcp_server remote_dns_doh remote_fakedns remote_dns_query_strategy dns_cache dns_socks_address dns_socks_port + local dns_listen_port direct_dns_port direct_dns_udp_server direct_dns_tcp_server direct_dns_dot_server remote_dns_protocol remote_dns_udp_server remote_dns_tcp_server remote_dns_doh remote_fakedns remote_dns_query_strategy dns_cache dns_socks_address dns_socks_port local loglevel log_file config_file server_host server_port local _extra_param="" eval_set_val $@ @@ -395,17 +395,21 @@ run_singbox() { [ -n "$dns_listen_port" ] && _extra_param="${_extra_param} -dns_listen_port ${dns_listen_port}" [ -n "$dns_cache" ] && _extra_param="${_extra_param} -dns_cache ${dns_cache}" - [ -n "$direct_dns_udp_server" ] && direct_dns_port=$(echo ${direct_dns_udp_server} | awk -F '#' '{print $2}') - [ -n "$direct_dns_tcp_server" ] && direct_dns_port=$(echo ${direct_dns_tcp_server} | awk -F '#' '{print $2}') - [ -z "$direct_dns_udp_server" ] && [ -z "$direct_dns_tcp_server" ] && { + if [ -n "$direct_dns_udp_server" ]; then + direct_dns_port=$(echo ${direct_dns_udp_server} | awk -F '#' '{print $2}') + _extra_param="${_extra_param} -direct_dns_udp_server $(echo ${direct_dns_udp_server} | awk -F '#' '{print $1}')" + elif [ -n "$direct_dns_tcp_server" ]; then + direct_dns_port=$(echo ${direct_dns_tcp_server} | awk -F '#' '{print $2}') + _extra_param="${_extra_param} -direct_dns_tcp_server $(echo ${direct_dns_tcp_server} | awk -F '#' '{print $1}')" + elif [ -n "$direct_dns_dot_server" ]; then + direct_dns_port=$(echo ${direct_dns_dot_server} | awk -F '#' '{print $2}') + _extra_param="${_extra_param} -direct_dns_dot_server $(echo ${direct_dns_dot_server} | awk -F '#' '{print $1}')" + else local local_dns=$(echo -n $(echo "${LOCAL_DNS}" | sed "s/,/\n/g" | head -n1) | tr " " ",") - direct_dns_udp_server=$(echo ${local_dns} | awk -F '#' '{print $1}') + _extra_param="${_extra_param} -direct_dns_udp_server $(echo ${local_dns} | awk -F '#' '{print $1}')" direct_dns_port=$(echo ${local_dns} | awk -F '#' '{print $2}') - } - [ -z "$direct_dns_port" ] && direct_dns_port=53 - [ -n "$direct_dns_udp_server" ] && _extra_param="${_extra_param} -direct_dns_udp_server ${direct_dns_udp_server}" - [ -n "$direct_dns_tcp_server" ] && _extra_param="${_extra_param} -direct_dns_tcp_server ${direct_dns_tcp_server}" - [ -n "$direct_dns_port" ] && _extra_param="${_extra_param} -direct_dns_port ${direct_dns_port}" + fi + _extra_param="${_extra_param} -direct_dns_port ${direct_dns_port:-53}" _extra_param="${_extra_param} -direct_dns_query_strategy UseIP" [ -n "$remote_dns_query_strategy" ] && _extra_param="${_extra_param} -remote_dns_query_strategy ${remote_dns_query_strategy}" @@ -944,8 +948,22 @@ run_redir() { [ "${DNS_CACHE}" == "0" ] && _args="${_args} dns_cache=0" resolve_dns_port=${dns_listen_port} _args="${_args} dns_listen_port=${resolve_dns_port}" - local local_dns=$(echo "${LOCAL_DNS}" | sed "s/,/\n/g" | head -n1) - _args="${_args} direct_dns_udp_server=${local_dns}" + + case "$(config_t_get global direct_dns_mode "auto")" in + udp) + _args="${_args} direct_dns_udp_server=$(config_t_get global direct_dns_udp 223.5.5.5 | sed 's/:/#/g') + ;; + tcp) + _args="${_args} direct_dns_tcp_server=$(config_t_get global direct_dns_tcp 223.5.5.5 | sed 's/:/#/g') + ;; + dot) + local tmp_dot_dns=$(config_t_get global direct_dns_dot "tls://dot.pub@1.12.12.12") + local tmp_dot_ip=$(echo "$tmp_dot_dns" | sed -n 's/.*:\/\/\([^@#]*@\)*\([^@#]*\).*/\2/p') + local tmp_dot_port=$(echo "$tmp_dot_dns" | sed -n 's/.*#\([0-9]\+\).*/\1/p') + _args="${_args} direct_dns_dot_server=$tmp_dot_ip#${tmp_dot_port:-853}" + ;; + esac + _args="${_args} remote_dns_protocol=${v2ray_dns_mode}" case "$v2ray_dns_mode" in tcp) @@ -1339,17 +1357,20 @@ start_dns() { echolog "DNS域名解析:" local china_ng_local_dns=${LOCAL_DNS} + local sing_box_local_dns= local direct_dns_mode=$(config_t_get global direct_dns_mode "auto") case "$direct_dns_mode" in udp) LOCAL_DNS=$(config_t_get global direct_dns_udp 223.5.5.5 | sed 's/:/#/g') china_ng_local_dns=${LOCAL_DNS} + sing_box_local_dns="direct_dns_udp_server=${LOCAL_DNS}" ;; tcp) LOCAL_DNS="127.0.0.1#${dns_listen_port}" dns_listen_port=$(expr $dns_listen_port + 1) local DIRECT_DNS=$(config_t_get global direct_dns_tcp 223.5.5.5 | sed 's/:/#/g') china_ng_local_dns="tcp://${DIRECT_DNS}" + sing_box_local_dns="direct_dns_tcp_server=${DIRECT_DNS}" ln_run "$(first_type dns2tcp)" dns2tcp "/dev/null" -L "${LOCAL_DNS}" -R "$(get_first_dns DIRECT_DNS 53)" -v echolog " - dns2tcp(${LOCAL_DNS}) -> tcp://$(get_first_dns DIRECT_DNS 53 | sed 's/#/:/g')" echolog " * 请确保上游直连 DNS 支持 TCP 查询。" @@ -1364,6 +1385,10 @@ start_dns() { ln_run "$(first_type chinadns-ng)" chinadns-ng "/dev/null" -b 127.0.0.1 -l ${cdns_listen_port} -c ${DIRECT_DNS} -d chn echolog " - ChinaDNS-NG(${LOCAL_DNS}) -> ${DIRECT_DNS}" echolog " * 请确保上游直连 DNS 支持 DoT 查询。" + + local tmp_dot_ip=$(echo "$DIRECT_DNS" | sed -n 's/.*:\/\/\([^@#]*@\)*\([^@#]*\).*/\2/p') + local tmp_dot_port=$(echo "$DIRECT_DNS" | sed -n 's/.*#\([0-9]\+\).*/\1/p') + sing_box_local_dns="direct_dns_dot_server=$tmp_dot_ip#${tmp_dot_port:-853}" else echolog " - 你的ChinaDNS-NG版本不支持DoT,直连DNS将使用默认地址。" fi @@ -1420,6 +1445,7 @@ start_dns() { ;; esac _args="${_args} dns_socks_address=127.0.0.1 dns_socks_port=${tcp_node_socks_port}" + [ -n "${sing_box_local_dns}" ] && _args="${_args} ${sing_box_local_dns}" run_singbox ${_args} } ;;