Skip to content

Commit 2e30ca2

Browse files
committed
Add ECH support for NaiveProxy outbound and tls.ech.query_server_name option
- Enable ECH for NaiveProxy outbound with DNS resolver integration - Add query_server_name option to override domain for ECH HTTPS record queries - Update cronet-go dependency and remove windows_386 support
1 parent 49b1083 commit 2e30ca2

File tree

10 files changed

+167
-90
lines changed

10 files changed

+167
-90
lines changed

.github/CRONET_GO_VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
78951bf5e641fcb42bc82b73e70bd28d819e5e55
1+
4f12714a37cc546cbd171765e44988a348ba77fa

common/tls/ech.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ func parseECHClientConfig(ctx context.Context, clientConfig ECHCapableConfig, op
5151
return &ECHClientConfig{
5252
ECHCapableConfig: clientConfig,
5353
dnsRouter: service.FromContext[adapter.DNSRouter](ctx),
54+
queryServerName: options.ECH.QueryServerName,
5455
}, nil
5556
}
5657
}
@@ -108,10 +109,11 @@ func parseECHKeys(echKey []byte) ([]tls.EncryptedClientHelloKey, error) {
108109

109110
type ECHClientConfig struct {
110111
ECHCapableConfig
111-
access sync.Mutex
112-
dnsRouter adapter.DNSRouter
113-
lastTTL time.Duration
114-
lastUpdate time.Time
112+
access sync.Mutex
113+
dnsRouter adapter.DNSRouter
114+
queryServerName string
115+
lastTTL time.Duration
116+
lastUpdate time.Time
115117
}
116118

117119
func (s *ECHClientConfig) ClientHandshake(ctx context.Context, conn net.Conn) (aTLS.Conn, error) {
@@ -130,13 +132,17 @@ func (s *ECHClientConfig) fetchAndHandshake(ctx context.Context, conn net.Conn)
130132
s.access.Lock()
131133
defer s.access.Unlock()
132134
if len(s.ECHConfigList()) == 0 || s.lastTTL == 0 || time.Since(s.lastUpdate) > s.lastTTL {
135+
queryServerName := s.queryServerName
136+
if queryServerName == "" {
137+
queryServerName = s.ServerName()
138+
}
133139
message := &mDNS.Msg{
134140
MsgHdr: mDNS.MsgHdr{
135141
RecursionDesired: true,
136142
},
137143
Question: []mDNS.Question{
138144
{
139-
Name: mDNS.Fqdn(s.ServerName()),
145+
Name: mDNS.Fqdn(queryServerName),
140146
Qtype: mDNS.TypeHTTPS,
141147
Qclass: mDNS.ClassINET,
142148
},
@@ -175,7 +181,12 @@ func (s *ECHClientConfig) fetchAndHandshake(ctx context.Context, conn net.Conn)
175181
}
176182

177183
func (s *ECHClientConfig) Clone() Config {
178-
return &ECHClientConfig{ECHCapableConfig: s.ECHCapableConfig.Clone().(ECHCapableConfig), dnsRouter: s.dnsRouter, lastUpdate: s.lastUpdate}
184+
return &ECHClientConfig{
185+
ECHCapableConfig: s.ECHCapableConfig.Clone().(ECHCapableConfig),
186+
dnsRouter: s.dnsRouter,
187+
queryServerName: s.queryServerName,
188+
lastUpdate: s.lastUpdate,
189+
}
179190
}
180191

181192
func UnmarshalECHKeys(raw []byte) ([]tls.EncryptedClientHelloKey, error) {

docs/configuration/outbound/naive.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ See [UDP Over TCP](/configuration/shared/udp-over-tcp/) for details.
8686

8787
TLS configuration, see [TLS](/configuration/shared/tls/#outbound).
8888

89-
Only `server_name`, `certificate`, `certificate_path` and `certificate_public_key_sha256` are supported.
89+
Only `server_name`, `certificate`, `certificate_path`, `certificate_public_key_sha256` and `ech` are supported.
9090

9191
### Dial Fields
9292

docs/configuration/outbound/naive.zh.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ UDP over TCP 配置。
8686

8787
TLS 配置, 参阅 [TLS](/zh/configuration/shared/tls/#outbound)
8888

89-
只有 `server_name``certificate``certificate_path``certificate_public_key_sha256` 是被支持的。
89+
只有 `server_name``certificate``certificate_path``certificate_public_key_sha256``ech` 是被支持的。
9090

9191
### 拨号字段
9292

docs/configuration/shared/tls.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ icon: material/new-box
1414
:material-plus: [client_key_path](#client_key_path)
1515
:material-plus: [client_authentication](#client_authentication)
1616
:material-plus: [client_certificate_public_key_sha256](#client_certificate_public_key_sha256)
17+
:material-plus: [ech.query_server_name](#query_server_name)
1718

1819
!!! quote "Changes in sing-box 1.12.0"
1920

@@ -118,6 +119,7 @@ icon: material/new-box
118119
"enabled": false,
119120
"config": [],
120121
"config_path": "",
122+
"query_server_name": "",
121123

122124
// Deprecated
123125
"pq_signature_schemes_enabled": false,
@@ -505,6 +507,16 @@ The path to ECH configuration, in PEM format.
505507

506508
If empty, load from DNS will be attempted.
507509

510+
#### query_server_name
511+
512+
!!! question "Since sing-box 1.13.0"
513+
514+
==Client only==
515+
516+
Overrides the domain name used for ECH HTTPS record queries.
517+
518+
If empty, `server_name` is used for queries.
519+
508520
#### fragment
509521

510522
!!! question "Since sing-box 1.12.0"

docs/configuration/shared/tls.zh.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ icon: material/new-box
1414
:material-plus: [client_key_path](#client_key_path)
1515
:material-plus: [client_authentication](#client_authentication)
1616
:material-plus: [client_certificate_public_key_sha256](#client_certificate_public_key_sha256)
17+
:material-plus: [ech.query_server_name](#query_server_name)
1718

1819
!!! quote "sing-box 1.12.0 中的更改"
1920

@@ -118,6 +119,7 @@ icon: material/new-box
118119
"enabled": false,
119120
"config": [],
120121
"config_path": "",
122+
"query_server_name": "",
121123

122124
// 废弃的
123125
"pq_signature_schemes_enabled": false,
@@ -503,6 +505,16 @@ ECH 配置路径,PEM 格式。
503505

504506
如果为空,将尝试从 DNS 加载。
505507

508+
#### query_server_name
509+
510+
!!! question "自 sing-box 1.13.0 起"
511+
512+
==仅客户端==
513+
514+
覆盖用于 ECH HTTPS 记录查询的域名。
515+
516+
如果为空,使用 `server_name` 查询。
517+
506518
#### fragment
507519

508520
!!! question "自 sing-box 1.12.0 起"

go.mod

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ require (
2626
github.com/sagernet/asc-go v0.0.0-20241217030726-d563060fe4e1
2727
github.com/sagernet/bbolt v0.0.0-20231014093535-ea5cb2fe9f0a
2828
github.com/sagernet/cors v1.2.1
29-
github.com/sagernet/cronet-go v0.0.0-20251217073804-0aadbdd7485f
30-
github.com/sagernet/cronet-go/all v0.0.0-20251217073804-0aadbdd7485f
29+
github.com/sagernet/cronet-go v0.0.0-20251217133746-1955399f1585
30+
github.com/sagernet/cronet-go/all v0.0.0-20251217133746-1955399f1585
3131
github.com/sagernet/fswatch v0.1.1
3232
github.com/sagernet/gomobile v0.1.10
3333
github.com/sagernet/gvisor v0.0.0-20250811.0-sing-box-mod.1
@@ -108,29 +108,28 @@ require (
108108
github.com/prometheus-community/pro-bing v0.4.0 // indirect
109109
github.com/quic-go/qpack v0.6.0 // indirect
110110
github.com/safchain/ethtool v0.3.0 // indirect
111-
github.com/sagernet/cronet-go/lib/android_386 v0.0.0-20251217073321-98bf559282b1 // indirect
112-
github.com/sagernet/cronet-go/lib/android_amd64 v0.0.0-20251217073321-98bf559282b1 // indirect
113-
github.com/sagernet/cronet-go/lib/android_arm v0.0.0-20251217073321-98bf559282b1 // indirect
114-
github.com/sagernet/cronet-go/lib/android_arm64 v0.0.0-20251217073321-98bf559282b1 // indirect
115-
github.com/sagernet/cronet-go/lib/darwin_amd64 v0.0.0-20251217073321-98bf559282b1 // indirect
116-
github.com/sagernet/cronet-go/lib/darwin_arm64 v0.0.0-20251217073321-98bf559282b1 // indirect
117-
github.com/sagernet/cronet-go/lib/ios_amd64_simulator v0.0.0-20251217073321-98bf559282b1 // indirect
118-
github.com/sagernet/cronet-go/lib/ios_arm64 v0.0.0-20251217073321-98bf559282b1 // indirect
119-
github.com/sagernet/cronet-go/lib/ios_arm64_simulator v0.0.0-20251217073321-98bf559282b1 // indirect
120-
github.com/sagernet/cronet-go/lib/linux_386 v0.0.0-20251217073321-98bf559282b1 // indirect
121-
github.com/sagernet/cronet-go/lib/linux_386_musl v0.0.0-20251217073321-98bf559282b1 // indirect
122-
github.com/sagernet/cronet-go/lib/linux_amd64 v0.0.0-20251217073321-98bf559282b1 // indirect
123-
github.com/sagernet/cronet-go/lib/linux_amd64_musl v0.0.0-20251217073321-98bf559282b1 // indirect
124-
github.com/sagernet/cronet-go/lib/linux_arm v0.0.0-20251217073321-98bf559282b1 // indirect
125-
github.com/sagernet/cronet-go/lib/linux_arm64 v0.0.0-20251217073321-98bf559282b1 // indirect
126-
github.com/sagernet/cronet-go/lib/linux_arm64_musl v0.0.0-20251217073321-98bf559282b1 // indirect
127-
github.com/sagernet/cronet-go/lib/linux_arm_musl v0.0.0-20251217073321-98bf559282b1 // indirect
128-
github.com/sagernet/cronet-go/lib/tvos_amd64_simulator v0.0.0-20251217073321-98bf559282b1 // indirect
129-
github.com/sagernet/cronet-go/lib/tvos_arm64 v0.0.0-20251217073321-98bf559282b1 // indirect
130-
github.com/sagernet/cronet-go/lib/tvos_arm64_simulator v0.0.0-20251217073321-98bf559282b1 // indirect
131-
github.com/sagernet/cronet-go/lib/windows_386 v0.0.0-20251217073321-98bf559282b1 // indirect
132-
github.com/sagernet/cronet-go/lib/windows_amd64 v0.0.0-20251217073321-98bf559282b1 // indirect
133-
github.com/sagernet/cronet-go/lib/windows_arm64 v0.0.0-20251217073321-98bf559282b1 // indirect
111+
github.com/sagernet/cronet-go/lib/android_386 v0.0.0-20251217133247-ea405ec61e5f // indirect
112+
github.com/sagernet/cronet-go/lib/android_amd64 v0.0.0-20251217133247-ea405ec61e5f // indirect
113+
github.com/sagernet/cronet-go/lib/android_arm v0.0.0-20251217133247-ea405ec61e5f // indirect
114+
github.com/sagernet/cronet-go/lib/android_arm64 v0.0.0-20251217133247-ea405ec61e5f // indirect
115+
github.com/sagernet/cronet-go/lib/darwin_amd64 v0.0.0-20251217133247-ea405ec61e5f // indirect
116+
github.com/sagernet/cronet-go/lib/darwin_arm64 v0.0.0-20251217133247-ea405ec61e5f // indirect
117+
github.com/sagernet/cronet-go/lib/ios_amd64_simulator v0.0.0-20251217133247-ea405ec61e5f // indirect
118+
github.com/sagernet/cronet-go/lib/ios_arm64 v0.0.0-20251217133247-ea405ec61e5f // indirect
119+
github.com/sagernet/cronet-go/lib/ios_arm64_simulator v0.0.0-20251217133247-ea405ec61e5f // indirect
120+
github.com/sagernet/cronet-go/lib/linux_386 v0.0.0-20251217133247-ea405ec61e5f // indirect
121+
github.com/sagernet/cronet-go/lib/linux_386_musl v0.0.0-20251217133247-ea405ec61e5f // indirect
122+
github.com/sagernet/cronet-go/lib/linux_amd64 v0.0.0-20251217133247-ea405ec61e5f // indirect
123+
github.com/sagernet/cronet-go/lib/linux_amd64_musl v0.0.0-20251217133247-ea405ec61e5f // indirect
124+
github.com/sagernet/cronet-go/lib/linux_arm v0.0.0-20251217133247-ea405ec61e5f // indirect
125+
github.com/sagernet/cronet-go/lib/linux_arm64 v0.0.0-20251217133247-ea405ec61e5f // indirect
126+
github.com/sagernet/cronet-go/lib/linux_arm64_musl v0.0.0-20251217133247-ea405ec61e5f // indirect
127+
github.com/sagernet/cronet-go/lib/linux_arm_musl v0.0.0-20251217133247-ea405ec61e5f // indirect
128+
github.com/sagernet/cronet-go/lib/tvos_amd64_simulator v0.0.0-20251217133247-ea405ec61e5f // indirect
129+
github.com/sagernet/cronet-go/lib/tvos_arm64 v0.0.0-20251217133247-ea405ec61e5f // indirect
130+
github.com/sagernet/cronet-go/lib/tvos_arm64_simulator v0.0.0-20251217133247-ea405ec61e5f // indirect
131+
github.com/sagernet/cronet-go/lib/windows_amd64 v0.0.0-20251217133247-ea405ec61e5f // indirect
132+
github.com/sagernet/cronet-go/lib/windows_arm64 v0.0.0-20251217133247-ea405ec61e5f // indirect
134133
github.com/sagernet/netlink v0.0.0-20240612041022-b9a21c07ac6a // indirect
135134
github.com/sagernet/nftables v0.3.0-beta.4 // indirect
136135
github.com/spf13/pflag v1.0.6 // indirect

0 commit comments

Comments
 (0)