Skip to content

Commit b4bf110

Browse files
committed
new: fallback dns
1 parent e7a11f4 commit b4bf110

File tree

6 files changed

+349
-253
lines changed

6 files changed

+349
-253
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ require (
257257
gopkg.in/yaml.v3 v3.0.1
258258
)
259259

260-
replace github.com/sagernet/sing-box => github.com/hiddify/hiddify-sing-box v1.8.9-0.20260205234655-10c98cacea17
260+
replace github.com/sagernet/sing-box => github.com/hiddify/hiddify-sing-box v1.8.9-0.20260206122724-dbbfefeeff07
261261

262262
// replace github.com/sagernet/sing-box => ../../h-sing-box
263263

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -358,8 +358,8 @@ github.com/hdevalence/ed25519consensus v0.2.0 h1:37ICyZqdyj0lAZ8P4D1d1id3HqbbG1N
358358
github.com/hdevalence/ed25519consensus v0.2.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo=
359359
github.com/hectane/go-acl v0.0.0-20230122075934-ca0b05cb1adb h1:PGufWXXDq9yaev6xX1YQauaO1MV90e6Mpoq1I7Lz/VM=
360360
github.com/hectane/go-acl v0.0.0-20230122075934-ca0b05cb1adb/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E=
361-
github.com/hiddify/hiddify-sing-box v1.8.9-0.20260205234655-10c98cacea17 h1:b/ILnzORg1PhcNH2ZLYAjmmz26aC4G7SzLNa3A0ZQok=
362-
github.com/hiddify/hiddify-sing-box v1.8.9-0.20260205234655-10c98cacea17/go.mod h1:TnQH2qSPS9PUS5DaLgiw/5611WWGr+t2H/MjHk+3CJE=
361+
github.com/hiddify/hiddify-sing-box v1.8.9-0.20260206122724-dbbfefeeff07 h1:eE4RYzTmdGHy0U0UILu0HDckrY/QOmc8fEtvc4Vcm08=
362+
github.com/hiddify/hiddify-sing-box v1.8.9-0.20260206122724-dbbfefeeff07/go.mod h1:TnQH2qSPS9PUS5DaLgiw/5611WWGr+t2H/MjHk+3CJE=
363363
github.com/hiddify/psiphon-quic-go v0.0.0-20260205155832-2164d1653824 h1:a5HGC6a/s4SmRvfqsYWBGd6ump3iploFoddqKpIyO7M=
364364
github.com/hiddify/psiphon-quic-go v0.0.0-20260205155832-2164d1653824/go.mod h1:rONdWgPMbFjyyBai7gB1IBF4pT9r4l0GyiDst5XR1SY=
365365
github.com/hiddify/psiphon-tls v0.0.0-20260205181946-4af85c2fb9f2 h1:42YhXZ/qMbWOlH+AE6KZKpv96G60FXMaeQ+TYFUFwNU=

v2/config/builder.go

Lines changed: 71 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,18 @@ import (
1414

1515
C "github.com/sagernet/sing-box/constant"
1616
mdns "github.com/sagernet/sing-box/dns"
17-
"github.com/sagernet/sing-box/hiddify/ipinfo"
1817
"github.com/sagernet/sing-box/option"
1918
"github.com/sagernet/sing/common/json/badoption"
2019
"github.com/sagernet/wireguard-go/hiddify"
2120
)
2221

2322
const (
24-
DNSRemoteTag = "dns-remote"
25-
DNSLocalTag = "dns-local"
26-
DNSStaticTag = "dns-static"
27-
DNSDirectTag = "dns-direct"
28-
DNSRemoteNoWarpTag = "dns-remote-no-warp"
23+
DNSRemoteTag = "dns-remote"
24+
DNSRemoteTagFallback = "dns-remote-fallback"
25+
DNSLocalTag = "dns-local"
26+
DNSStaticTag = "dns-static"
27+
DNSDirectTag = "dns-direct"
28+
DNSRemoteNoWarpTag = "dns-remote-no-warp"
2929
// DNSBlockTag = "dns-block"
3030
DNSFakeTag = "dns-fake"
3131
DNSTricksDirectTag = "dns-trick-direct"
@@ -35,7 +35,7 @@ const (
3535
// OutboundBlockTag = "block §hide§"
3636
OutboundSelectTag = "select"
3737
OutboundURLTestTag = "lowest"
38-
OutboundRoundRobinTag = "parallel"
38+
OutboundRoundRobinTag = "balance"
3939
OutboundDNSTag = "dns-out §hide§"
4040
OutboundDirectFragmentTag = "direct-fragment §hide§"
4141

@@ -104,7 +104,11 @@ func getHostnameIfNotIP(inp string) (string, error) {
104104
return "", fmt.Errorf("empty hostname: %s", inp)
105105
}
106106
if net.ParseIP(strings.Trim(inp, "[]")) == nil {
107-
return inp, nil
107+
u, err := url.Parse(inp)
108+
if err != nil {
109+
return inp, err
110+
}
111+
return u.Host, nil
108112
}
109113
return "", fmt.Errorf("not a hostname: %s", inp)
110114
}
@@ -516,69 +520,24 @@ func setRoutingOptions(options *option.Options, hopt *HiddifyOptions) error {
516520
// // )
517521
// }
518522

519-
// dnsRules = append(dnsRules, option.DefaultDNSRule{
520-
// RawDefaultDNSRule: option.RawDefaultDNSRule{},
521-
// DNSRuleAction: option.DNSRuleAction{
522-
// Action: C.RuleActionTypeRoute,
523-
// RouteOptions: option.DNSRouteActionOptions{
524-
// Server: DNSStaticTag,
525-
// },
526-
// },
527-
// },
528-
// )
529-
forceDirectRules, err := addForceDirect(options, hopt)
530-
if err != nil {
531-
return err
532-
}
533-
534-
dnsRules = append(dnsRules, forceDirectRules...)
535-
536-
if len(hopt.ConnectionTestUrls) > 0 { //To avoid dns bug when using urltest
537-
domains := []string{}
538-
for _, url := range hopt.ConnectionTestUrls {
539-
if host, err := getHostnameIfNotIP(url); err == nil {
540-
domains = append(domains, host)
541-
}
542-
}
543-
if len(domains) > 0 {
544-
dnsRules = append(dnsRules, option.DefaultDNSRule{
545-
RawDefaultDNSRule: option.RawDefaultDNSRule{
546-
Domain: domains,
547-
},
548-
DNSRuleAction: option.DNSRuleAction{
549-
Action: C.RuleActionTypeRoute,
550-
RouteOptions: option.DNSRouteActionOptions{
551-
Server: DNSDirectTag,
552-
},
553-
},
554-
})
555-
}
556-
}
557523
dnsRules = append(dnsRules, option.DefaultDNSRule{
558-
RawDefaultDNSRule: option.RawDefaultDNSRule{
559-
Domain: []string{"api.cloudflareclient.com"},
560-
},
524+
RawDefaultDNSRule: option.RawDefaultDNSRule{},
561525
DNSRuleAction: option.DNSRuleAction{
562526
Action: C.RuleActionTypeRoute,
563527
RouteOptions: option.DNSRouteActionOptions{
564-
Server: DNSRemoteNoWarpTag,
528+
Server: DNSStaticTag,
529+
BypassIfFailed: true,
565530
},
566531
},
567-
})
568-
if ipinfoDomains := ipinfo.GetAllIPCheckerDomainsDomains(); len(ipinfoDomains) > 0 { //To avoid dns bug when using urltest
569-
dnsRules = append(dnsRules, option.DefaultDNSRule{
570-
RawDefaultDNSRule: option.RawDefaultDNSRule{
571-
Domain: ipinfoDomains,
572-
},
573-
DNSRuleAction: option.DNSRuleAction{
574-
Action: C.RuleActionTypeRoute,
575-
RouteOptions: option.DNSRouteActionOptions{
576-
Server: DNSDirectTag,
577-
},
578-
},
579-
})
532+
},
533+
)
534+
forceDirectRules, err := addForceDirect(options, hopt)
535+
if err != nil {
536+
return err
580537
}
581538

539+
dnsRules = append(dnsRules, forceDirectRules...)
540+
582541
routeRules = append(routeRules, option.Rule{
583542
Type: C.RuleTypeDefault,
584543
DefaultOptions: option.DefaultRule{
@@ -716,9 +675,10 @@ func setRoutingOptions(options *option.Options, hopt *HiddifyOptions) error {
716675
DNSRuleAction: option.DNSRuleAction{
717676
Action: C.RuleActionTypeRoute,
718677
RouteOptions: option.DNSRouteActionOptions{
719-
Server: DNSDirectTag,
720-
RewriteTTL: &dnsCPttl,
721-
DisableCache: false,
678+
Server: DNSDirectTag,
679+
RewriteTTL: &dnsCPttl,
680+
DisableCache: false,
681+
BypassIfFailed: true,
722682
},
723683
},
724684
})
@@ -839,7 +799,8 @@ func setRoutingOptions(options *option.Options, hopt *HiddifyOptions) error {
839799
DNSRuleAction: option.DNSRuleAction{
840800
Action: C.RuleActionTypeRoute,
841801
RouteOptions: option.DNSRouteActionOptions{
842-
Server: DNSDirectTag,
802+
Server: DNSDirectTag,
803+
BypassIfFailed: true,
843804
},
844805
},
845806
})
@@ -868,7 +829,8 @@ func setRoutingOptions(options *option.Options, hopt *HiddifyOptions) error {
868829
DNSRuleAction: option.DNSRuleAction{
869830
Action: C.RuleActionTypeRoute,
870831
RouteOptions: option.DNSRouteActionOptions{
871-
Server: DNSDirectTag,
832+
Server: DNSDirectTag,
833+
BypassIfFailed: true,
872834
},
873835
},
874836
})
@@ -952,8 +914,9 @@ func setRoutingOptions(options *option.Options, hopt *HiddifyOptions) error {
952914
DNSRuleAction: option.DNSRuleAction{
953915
Action: C.RuleActionTypeRoute,
954916
RouteOptions: option.DNSRouteActionOptions{
955-
Server: DNSFakeTag,
956-
DisableCache: true,
917+
Server: DNSFakeTag,
918+
DisableCache: true,
919+
BypassIfFailed: true,
957920
},
958921
},
959922
})
@@ -965,28 +928,8 @@ func setRoutingOptions(options *option.Options, hopt *HiddifyOptions) error {
965928
DNSRuleAction: option.DNSRuleAction{
966929
Action: C.RuleActionTypeRoute,
967930
RouteOptions: option.DNSRouteActionOptions{
968-
Server: DNSRemoteTag,
969-
},
970-
},
971-
},
972-
)
973-
dnsRules = append(dnsRules, option.DefaultDNSRule{
974-
975-
RawDefaultDNSRule: option.RawDefaultDNSRule{},
976-
DNSRuleAction: option.DNSRuleAction{
977-
Action: C.RuleActionTypeRoute,
978-
RouteOptions: option.DNSRouteActionOptions{
979-
Server: DNSTricksDirectTag,
980-
},
981-
},
982-
},
983-
)
984-
dnsRules = append(dnsRules, option.DefaultDNSRule{
985-
RawDefaultDNSRule: option.RawDefaultDNSRule{},
986-
DNSRuleAction: option.DNSRuleAction{
987-
Action: C.RuleActionTypeRoute,
988-
RouteOptions: option.DNSRouteActionOptions{
989-
Server: DNSDirectTag,
931+
Server: DNSRemoteTag,
932+
BypassIfFailed: true,
990933
},
991934
},
992935
},
@@ -996,11 +939,46 @@ func setRoutingOptions(options *option.Options, hopt *HiddifyOptions) error {
996939
DNSRuleAction: option.DNSRuleAction{
997940
Action: C.RuleActionTypeRoute,
998941
RouteOptions: option.DNSRouteActionOptions{
999-
Server: DNSLocalTag,
942+
Server: DNSRemoteTagFallback,
943+
BypassIfFailed: false,
1000944
},
1001945
},
1002946
},
1003947
)
948+
// dnsRules = append(dnsRules, option.DefaultDNSRule{
949+
950+
// RawDefaultDNSRule: option.RawDefaultDNSRule{},
951+
// DNSRuleAction: option.DNSRuleAction{
952+
// Action: C.RuleActionTypeRoute,
953+
// RouteOptions: option.DNSRouteActionOptions{
954+
// Server: DNSTricksDirectTag,
955+
// BypassIfFailed: true,
956+
// },
957+
// },
958+
// },
959+
// )
960+
// dnsRules = append(dnsRules, option.DefaultDNSRule{
961+
// RawDefaultDNSRule: option.RawDefaultDNSRule{},
962+
// DNSRuleAction: option.DNSRuleAction{
963+
// Action: C.RuleActionTypeRoute,
964+
// RouteOptions: option.DNSRouteActionOptions{
965+
// Server: DNSDirectTag,
966+
// BypassIfFailed: true,
967+
// },
968+
// },
969+
// },
970+
// )
971+
// dnsRules = append(dnsRules, option.DefaultDNSRule{
972+
// RawDefaultDNSRule: option.RawDefaultDNSRule{},
973+
// DNSRuleAction: option.DNSRuleAction{
974+
// Action: C.RuleActionTypeRoute,
975+
// RouteOptions: option.DNSRouteActionOptions{
976+
// Server: DNSLocalTag,
977+
// // BypassIfFailed: true,
978+
// },
979+
// },
980+
// },
981+
// )
1004982

1005983
for _, dnsRule := range dnsRules {
1006984
if dnsRule.IsValid() {

0 commit comments

Comments
 (0)