From 850fe63f08ffc7597f9cd5e340b7e6ffd6c999a5 Mon Sep 17 00:00:00 2001 From: Denis Kudelin <15978569+denis-kudelin@users.noreply.github.com> Date: Mon, 25 Aug 2025 12:04:15 +0300 Subject: [PATCH 1/4] Support dns-server in Clash proxy export --- src/generator/config/subexport.cpp | 2 ++ src/parser/subparser.cpp | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/generator/config/subexport.cpp b/src/generator/config/subexport.cpp index c7c5a55b4..9678bbdd0 100644 --- a/src/generator/config/subexport.cpp +++ b/src/generator/config/subexport.cpp @@ -1174,6 +1174,8 @@ std::string proxyToSurge(std::vector &nodes, const std::string &base_conf continue; } + if(!x.DnsServers.empty()) + proxy += ", dns-server=" + join(x.DnsServers, ","); if(!ext.tfo.is_undef()) proxy += ", tfo=" + ext.tfo.get_str(); diff --git a/src/parser/subparser.cpp b/src/parser/subparser.cpp index 5b19ccd0b..96ee7aa9c 100644 --- a/src/parser/subparser.cpp +++ b/src/parser/subparser.cpp @@ -1144,12 +1144,14 @@ void explodeClash(Node yamlnode, std::vector &nodes) for(uint32_t i = 0; i < yamlnode[section].size(); i++) { Proxy node; + dns_server.clear(); singleproxy = yamlnode[section][i]; singleproxy["type"] >>= proxytype; singleproxy["name"] >>= ps; singleproxy["server"] >>= server; singleproxy["port"] >>= port; singleproxy["interface-name"] >>= interface; + singleproxy["dns-server"] >>= dns_server; singleproxy["underlying-proxy"] >>= underlying_proxy; if((port.empty() || port == "0") && proxytype != "direct") continue; @@ -1438,6 +1440,7 @@ void explodeClash(Node yamlnode, std::vector &nodes) node.Id = index; node.Interface = interface; + node.DnsServers = dns_server; nodes.emplace_back(std::move(node)); index++; } From 1273ef6ed5db88c16fd595f8bcf55205dc7da5f1 Mon Sep 17 00:00:00 2001 From: Denis Kudelin <15978569+denis-kudelin@users.noreply.github.com> Date: Mon, 25 Aug 2025 15:21:49 +0300 Subject: [PATCH 2/4] Handle dns-server arrays and scalars --- src/parser/subparser.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/parser/subparser.cpp b/src/parser/subparser.cpp index 96ee7aa9c..2c05bf916 100644 --- a/src/parser/subparser.cpp +++ b/src/parser/subparser.cpp @@ -1151,7 +1151,16 @@ void explodeClash(Node yamlnode, std::vector &nodes) singleproxy["server"] >>= server; singleproxy["port"] >>= port; singleproxy["interface-name"] >>= interface; - singleproxy["dns-server"] >>= dns_server; + auto dnsnode = singleproxy["dns-server"]; + if(dnsnode.IsSequence()) + dnsnode >>= dns_server; + else + { + std::string dns; + dnsnode >>= dns; + if(!dns.empty()) + dns_server.emplace_back(dns); + } singleproxy["underlying-proxy"] >>= underlying_proxy; if((port.empty() || port == "0") && proxytype != "direct") continue; From b5771cfd01af2fb7b458256f33d8326cec599303 Mon Sep 17 00:00:00 2001 From: Denis Kudelin <15978569+denis-kudelin@users.noreply.github.com> Date: Mon, 25 Aug 2025 15:25:47 +0300 Subject: [PATCH 3/4] Preserve dns-server in WireGuard Clash proxies --- src/parser/subparser.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/parser/subparser.cpp b/src/parser/subparser.cpp index 2c05bf916..99acfb980 100644 --- a/src/parser/subparser.cpp +++ b/src/parser/subparser.cpp @@ -1363,7 +1363,17 @@ void explodeClash(Node yamlnode, std::vector &nodes) group = WG_DEFAULT_GROUP; singleproxy["public-key"] >>= public_key; singleproxy["private-key"] >>= private_key; - singleproxy["dns"] >>= dns_server; + auto dnsnode2 = singleproxy["dns"]; + if(dnsnode2.IsSequence()){ + string_array extra_dns; + dnsnode2 >>= extra_dns; + dns_server.insert(dns_server.end(), extra_dns.begin(), extra_dns.end()); + } else { + std::string dns; + dnsnode2 >>= dns; + if(!dns.empty()) + dns_server.emplace_back(dns); + } singleproxy["mtu"] >>= mtu; singleproxy["preshared-key"] >>= password; singleproxy["ip"] >>= ip; From 36acfad0b36f6e6bfede2c84c070c5e16b29a2ab Mon Sep 17 00:00:00 2001 From: Denis Kudelin <15978569+denis-kudelin@users.noreply.github.com> Date: Mon, 25 Aug 2025 15:30:40 +0300 Subject: [PATCH 4/4] Fix dns parsing switch fallthrough --- src/parser/subparser.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/parser/subparser.cpp b/src/parser/subparser.cpp index 99acfb980..558992bce 100644 --- a/src/parser/subparser.cpp +++ b/src/parser/subparser.cpp @@ -1359,7 +1359,7 @@ void explodeClash(Node yamlnode, std::vector &nodes) snellConstruct(node, group, ps, server, port, password, obfs, host, to_int(aid, 0), udp, tfo, scv, underlying_proxy); break; - case "wireguard"_hash: + case "wireguard"_hash: { group = WG_DEFAULT_GROUP; singleproxy["public-key"] >>= public_key; singleproxy["private-key"] >>= private_key; @@ -1381,6 +1381,7 @@ void explodeClash(Node yamlnode, std::vector &nodes) wireguardConstruct(node, group, ps, server, port, ip, ipv6, private_key, public_key, password, dns_server, mtu, "0", "", "", udp, underlying_proxy); break; + } case "hysteria"_hash: group = HYSTERIA_DEFAULT_GROUP; singleproxy["ports"] >>= ports; @@ -1452,7 +1453,6 @@ void explodeClash(Node yamlnode, std::vector &nodes) node.AllowInsecure = scv; node.UnderlyingProxy = underlying_proxy; break; - break; default: continue; }