Skip to content

Commit 6c5590c

Browse files
committed
add new regex dns resolver, better dns routing
2 parents 00edb51 + 170bff4 commit 6c5590c

File tree

5 files changed

+45
-50
lines changed

5 files changed

+45
-50
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ require (
151151
lukechampine.com/blake3 v1.4.0 // indirect
152152
)
153153

154-
replace github.com/sagernet/sing-box => github.com/hiddify/hiddify-sing-box v1.8.9-0.20250427171527-75d1f520c1d0
154+
replace github.com/sagernet/sing-box => github.com/hiddify/hiddify-sing-box v1.8.9-0.20250622203549-c2a41a8cc8dd
155155

156156
// replace github.com/sagernet/sing-box => ../../hiddify-sing-box
157157

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,8 @@ github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8
243243
github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns=
244244
github.com/hectane/go-acl v0.0.0-20230122075934-ca0b05cb1adb h1:PGufWXXDq9yaev6xX1YQauaO1MV90e6Mpoq1I7Lz/VM=
245245
github.com/hectane/go-acl v0.0.0-20230122075934-ca0b05cb1adb/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E=
246-
github.com/hiddify/hiddify-sing-box v1.8.9-0.20250427171527-75d1f520c1d0 h1:Venb6aqoM7+R8kK3BOPDMtxoTQQqcjJFwlKEzGbJwr4=
247-
github.com/hiddify/hiddify-sing-box v1.8.9-0.20250427171527-75d1f520c1d0/go.mod h1:P2Jl+D3230kPWANXuUpITOUacVTlx4YXCFBXSdzBOsk=
246+
github.com/hiddify/hiddify-sing-box v1.8.9-0.20250622203549-c2a41a8cc8dd h1:NOBVy6sqaE36kmcIx0qCO3ad1lYE+/vEYJx2MqUmX8A=
247+
github.com/hiddify/hiddify-sing-box v1.8.9-0.20250622203549-c2a41a8cc8dd/go.mod h1:P2Jl+D3230kPWANXuUpITOUacVTlx4YXCFBXSdzBOsk=
248248
github.com/hiddify/ray2sing v0.0.0-20250421090415-3f7c0fc24042 h1:rR7v56h185wZ5yQf8n8HgK0YFpdTYFE0/E/Fjc2DPhY=
249249
github.com/hiddify/ray2sing v0.0.0-20250421090415-3f7c0fc24042/go.mod h1:jBi91UH2/k3c8vpcGRS8Flhodi+uJZADZeWafkLfRQs=
250250
github.com/hiddify/warp-plus v0.0.0-20240717223357-4f3122e0d11d h1:vRGKh9ou+/vQGfVYa8MczhbIVjHxlP52OWwrDWO77RA=

v2/config/config.go

Lines changed: 34 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ func BuildConfig(opt HiddifyOptions, input option.Options) (*option.Options, err
8686
setNTP(&options)
8787
setRoutingOptions(&options, &opt)
8888
err := setOutbounds(&options, &input, &opt)
89+
8990
if err != nil {
9091
return nil, err
9192
}
@@ -154,7 +155,7 @@ func setOutbounds(options *option.Options, input *option.Options, opt *HiddifyOp
154155
if contains(PredefinedOutboundTags, out.Tag) {
155156
continue
156157
}
157-
outbound, err := patchOutbound(out, *opt, options.DNS.StaticIPs)
158+
outbound, err := patchOutbound(out, *opt, options.DNS)
158159
if err != nil {
159160
return err
160161
}
@@ -434,37 +435,19 @@ func setDns(options *option.Options, opt *HiddifyOptions) {
434435
},
435436
},
436437
}
437-
domains := map[string][]string{
438-
"time.apple.com": {"time.g.aaplimg.com", "time.apple.com"},
439-
"ipinfo.io": {"ipinfo.io"},
440-
"dns.cloudflare.com": {"www.speedtest.net", "cloudflare.com"},
441-
"ipwho.is": {"ipwho.is"},
442-
"api.my-ip.io": {"api.my-ip.io"},
443-
"myip.expert": {"myip.expert"},
444-
"ip-api.com": {"ip-api.com"},
445-
}
446-
var wg sync.WaitGroup
447-
var mu sync.Mutex
448-
for key, domainList := range domains {
449-
wg.Add(1)
450-
go func(k string, dList []string) {
451-
defer wg.Done()
452-
ips := getIPs(dList...)
453-
if len(ips) > 0 {
454-
mu.Lock()
455-
options.DNS.StaticIPs[k] = ips
456-
mu.Unlock()
457-
}
458-
}(key, domainList)
459-
}
460438

461-
wg.Wait()
462-
if dnsstr := options.DNS.StaticIPs["dns.cloudflare.com"]; dnsstr != nil {
463-
options.DNS.StaticIPs["api.ip.sb"] = dnsstr
464-
options.DNS.StaticIPs["ipapi.co"] = dnsstr
465-
options.DNS.StaticIPs["reallyfreegeoip.org"] = dnsstr
466-
options.DNS.StaticIPs["freeipapi.com"] = dnsstr
467-
}
439+
options.DNS.StaticIPs["time.apple.com"] = []string{"time.g.aaplimg.com", "time.apple.com"}
440+
options.DNS.StaticIPs["ipinfo.io"] = []string{"ipinfo.io"}
441+
options.DNS.StaticIPs["dns.cloudflare.com"] = []string{"www.speedtest.net", "cloudflare.com"}
442+
options.DNS.StaticIPs["ipwho.is"] = []string{"ipwho.is"}
443+
options.DNS.StaticIPs["api.my-ip.io"] = []string{"api.my-ip.io"}
444+
options.DNS.StaticIPs["myip.expert"] = []string{"myip.expert"}
445+
options.DNS.StaticIPs["ip-api.com"] = []string{"ip-api.com"}
446+
options.DNS.StaticIPs["freeipapi.com"] = []string{"www.speedtest.net", "cloudflare.com"}
447+
options.DNS.StaticIPs["reallyfreegeoip.org"] = []string{"www.speedtest.net", "cloudflare.com"}
448+
options.DNS.StaticIPs["ipapi.co"] = []string{"www.speedtest.net", "cloudflare.com"}
449+
options.DNS.StaticIPs["api.ip.sb"] = []string{"www.speedtest.net", "cloudflare.com"}
450+
468451
}
469452

470453
func addForceDirect(options *option.Options, opt *HiddifyOptions) {
@@ -491,43 +474,47 @@ func addForceDirect(options *option.Options, opt *HiddifyOptions) {
491474
}
492475
}
493476
}
477+
494478
if len(dnsMap) > 0 {
495479
unique_dns_detours := make(map[string]bool)
496480
for _, detour := range dnsMap {
497481
unique_dns_detours[detour] = true
498482
}
499483

500484
for detour := range unique_dns_detours {
501-
if detour == OutboundDirectTag {
502-
detour = "direct"
503-
} else {
485+
dns_detour := "dns-direct"
486+
if detour != OutboundDirectTag {
487+
dns_detour = "dns-" + detour
504488
options.DNS.Servers = append(options.DNS.Servers, option.DNSServerOptions{
505-
Tag: "dns-" + detour,
489+
Tag: dns_detour,
506490
Address: opt.RemoteDnsAddress,
507491
AddressResolver: DNSDirectTag,
508492
Strategy: opt.RemoteDnsDomainStrategy,
509493
Detour: detour,
510494
})
511495
}
496+
512497
domains := []string{}
513498
for domain, d := range dnsMap {
514499
if d == detour {
515500
domains = append(domains, domain)
516501
}
517502
}
503+
518504
if len(domains) == 0 {
519505
continue
520506
}
521507
options.DNS.Rules = append(options.DNS.Rules, option.DNSRule{
522508
Type: C.RuleTypeDefault,
523509
DefaultOptions: option.DefaultDNSRule{
524-
Server: "dns-" + detour,
510+
Server: dns_detour,
525511
Domain: domains,
526512
},
527513
})
528514
}
529515

530516
}
517+
531518
}
532519

533520
func setFakeDns(options *option.Options, opt *HiddifyOptions) {
@@ -836,6 +823,16 @@ func setRoutingOptions(options *option.Options, opt *HiddifyOptions) {
836823
},
837824
})
838825
}
826+
if opt.RouteOptions.BlockQuic {
827+
routeRules = append(routeRules, option.Rule{
828+
Type: C.RuleTypeDefault,
829+
DefaultOptions: option.DefaultRule{
830+
Port: []uint16{443},
831+
Network: []string{"udp"},
832+
Outbound: OutboundBlockTag,
833+
},
834+
})
835+
}
839836
options.Route = &option.RouteOptions{
840837
Rules: routeRules,
841838
Final: OutboundMainProxyTag,
@@ -862,14 +859,7 @@ func setRoutingOptions(options *option.Options, opt *HiddifyOptions) {
862859
}
863860
}
864861
}
865-
routeRules = append(routeRules, option.Rule{
866-
Type: C.RuleTypeDefault,
867-
DefaultOptions: option.DefaultRule{
868-
Port: []uint16{443},
869-
Network: []string{"udp"},
870-
Outbound: OutboundBlockTag,
871-
},
872-
})
862+
873863
}
874864

875865
func patchHiddifyWarpFromConfig(out option.Outbound, opt HiddifyOptions) option.Outbound {

v2/config/hiddify_option.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ type HiddifyOptions struct {
2727
Warp2 WarpOptions `json:"warp2,omitempty"`
2828
Mux MuxOptions `json:"mux,omitempty" overridable:"true"`
2929
TLSTricks TLSTricks `json:"tls-tricks,omitempty"`
30+
EnableNTP bool `json:"enable-ntp,omitempty"`
31+
3032
DNSOptions
3133
InboundOptions
3234
URLTestOptions
@@ -66,6 +68,7 @@ type RouteOptions struct {
6668
IPv6Mode option.DomainStrategy `json:"ipv6-mode,omitempty"`
6769
BypassLAN bool `json:"bypass-lan,omitempty"`
6870
AllowConnectionFromLAN bool `json:"allow-connection-from-lan,omitempty"`
71+
BlockQuic bool `json:"block-quic,omitempty"`
6972
}
7073

7174
type TLSTricks struct {
@@ -101,6 +104,7 @@ type WarpOptions struct {
101104

102105
func DefaultHiddifyOptions() *HiddifyOptions {
103106
return &HiddifyOptions{
107+
EnableNTP: true,
104108
DNSOptions: DNSOptions{
105109
RemoteDnsAddress: "1.1.1.1",
106110
RemoteDnsDomainStrategy: option.DomainStrategy(dns.DomainStrategyAsIS),
@@ -136,6 +140,7 @@ func DefaultHiddifyOptions() *HiddifyOptions {
136140
LogFile: "data/box.log",
137141
Region: "other",
138142
EnableClashApi: true,
143+
139144
ClashApiPort: 16756,
140145
ClashApiSecret: "",
141146
// GeoIPPath: "geoip.db",

v2/config/outbound.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,11 @@ func isOutboundReality(base option.Outbound) bool {
116116
return base.VLESSOptions.OutboundTLSOptionsContainer.TLS.Reality.Enabled
117117
}
118118

119-
func patchOutbound(base option.Outbound, configOpt HiddifyOptions, staticIpsDns map[string][]string) (*option.Outbound, error) {
119+
func patchOutbound(base option.Outbound, configOpt HiddifyOptions, dns *option.DNSOptions) (*option.Outbound, error) {
120120
formatErr := func(err error) error {
121121
return fmt.Errorf("error patching outbound[%s][%s]: %w", base.Tag, base.Type, err)
122122
}
123-
err := patchWarp(&base, &configOpt, true, staticIpsDns)
123+
err := patchWarp(&base, &configOpt, true, dns.StaticIPs)
124124
if err != nil {
125125
return nil, formatErr(err)
126126
}
@@ -143,7 +143,7 @@ func patchOutbound(base option.Outbound, configOpt HiddifyOptions, staticIpsDns
143143
case C.TypeVMess, C.TypeVLESS, C.TypeTrojan, C.TypeShadowsocks:
144144
obj = patchOutboundMux(base, configOpt, obj)
145145
}
146-
obj = patchOutboundXray(base, configOpt, obj, staticIpsDns)
146+
obj = patchOutboundXray(base, configOpt, obj, dns.StaticIPs)
147147
modifiedJson, err := json.Marshal(obj)
148148
if err != nil {
149149
return nil, formatErr(err)

0 commit comments

Comments
 (0)