Skip to content

Commit bfc17c3

Browse files
authored
feat(dns): support DoH, DoT, DoH3, DoQ (#649)
1 parent 0e1301b commit bfc17c3

File tree

4 files changed

+496
-126
lines changed

4 files changed

+496
-126
lines changed

component/dns/dns.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func New(dns *config.Dns, opt *NewOption) (s *Dns, err error) {
128128

129129
func (s *Dns) CheckUpstreamsFormat() error {
130130
for _, upstream := range s.upstream {
131-
_, _, _, err := ParseRawUpstream(upstream.Raw)
131+
_, _, _, _, err := ParseRawUpstream(upstream.Raw)
132132
if err != nil {
133133
return err
134134
}

component/dns/upstream.go

+33-8
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ const (
3030
UpstreamScheme_UDP UpstreamScheme = "udp"
3131
UpstreamScheme_TCP_UDP UpstreamScheme = "tcp+udp"
3232
upstreamScheme_TCP_UDP_Alias UpstreamScheme = "udp+tcp"
33+
UpstreamScheme_TLS UpstreamScheme = "tls"
34+
UpstreamScheme_QUIC UpstreamScheme = "quic"
35+
UpstreamScheme_HTTPS UpstreamScheme = "https"
36+
upstreamScheme_H3_Alias UpstreamScheme = "http3"
37+
UpstreamScheme_H3 UpstreamScheme = "h3"
3338
)
3439

3540
func (s UpstreamScheme) ContainsTcp() bool {
@@ -42,8 +47,9 @@ func (s UpstreamScheme) ContainsTcp() bool {
4247
}
4348
}
4449

45-
func ParseRawUpstream(raw *url.URL) (scheme UpstreamScheme, hostname string, port uint16, err error) {
50+
func ParseRawUpstream(raw *url.URL) (scheme UpstreamScheme, hostname string, port uint16, path string, err error) {
4651
var __port string
52+
var __path string
4753
switch scheme = UpstreamScheme(raw.Scheme); scheme {
4854
case upstreamScheme_TCP_UDP_Alias:
4955
scheme = UpstreamScheme_TCP_UDP
@@ -53,27 +59,45 @@ func ParseRawUpstream(raw *url.URL) (scheme UpstreamScheme, hostname string, por
5359
if __port == "" {
5460
__port = "53"
5561
}
62+
case upstreamScheme_H3_Alias:
63+
scheme = UpstreamScheme_H3
64+
fallthrough
65+
case UpstreamScheme_HTTPS, UpstreamScheme_H3:
66+
__port = raw.Port()
67+
if __port == "" {
68+
__port = "443"
69+
}
70+
__path = raw.Path
71+
if __path == "" {
72+
__path = "/dns-query"
73+
}
74+
case UpstreamScheme_QUIC, UpstreamScheme_TLS:
75+
__port = raw.Port()
76+
if __port == "" {
77+
__port = "853"
78+
}
5679
default:
57-
return "", "", 0, fmt.Errorf("unexpected scheme: %v", raw.Scheme)
80+
return "", "", 0, "", fmt.Errorf("unexpected scheme: %v", raw.Scheme)
5881
}
5982
_port, err := strconv.ParseUint(__port, 10, 16)
6083
if err != nil {
61-
return "", "", 0, fmt.Errorf("failed to parse dns_upstream port: %v", err)
84+
return "", "", 0, "", fmt.Errorf("failed to parse dns_upstream port: %v", err)
6285
}
6386
port = uint16(_port)
6487
hostname = raw.Hostname()
65-
return scheme, hostname, port, nil
88+
return scheme, hostname, port, __path, nil
6689
}
6790

6891
type Upstream struct {
6992
Scheme UpstreamScheme
7093
Hostname string
7194
Port uint16
95+
Path string
7296
*netutils.Ip46
7397
}
7498

7599
func NewUpstream(ctx context.Context, upstream *url.URL, resolverNetwork string) (up *Upstream, err error) {
76-
scheme, hostname, port, err := ParseRawUpstream(upstream)
100+
scheme, hostname, port, path, err := ParseRawUpstream(upstream)
77101
if err != nil {
78102
return nil, fmt.Errorf("%w: %v", ErrFormat, err)
79103
}
@@ -100,6 +124,7 @@ func NewUpstream(ctx context.Context, upstream *url.URL, resolverNetwork string)
100124
Scheme: scheme,
101125
Hostname: hostname,
102126
Port: port,
127+
Path: path,
103128
Ip46: ip46,
104129
}, nil
105130
}
@@ -115,9 +140,9 @@ func (u *Upstream) SupportedNetworks() (ipversions []consts.IpVersionStr, l4prot
115140
}
116141
}
117142
switch u.Scheme {
118-
case UpstreamScheme_TCP:
143+
case UpstreamScheme_TCP, UpstreamScheme_HTTPS, UpstreamScheme_TLS:
119144
l4protos = []consts.L4ProtoStr{consts.L4ProtoStr_TCP}
120-
case UpstreamScheme_UDP:
145+
case UpstreamScheme_UDP, UpstreamScheme_QUIC, UpstreamScheme_H3:
121146
l4protos = []consts.L4ProtoStr{consts.L4ProtoStr_UDP}
122147
case UpstreamScheme_TCP_UDP:
123148
// UDP first.
@@ -127,7 +152,7 @@ func (u *Upstream) SupportedNetworks() (ipversions []consts.IpVersionStr, l4prot
127152
}
128153

129154
func (u *Upstream) String() string {
130-
return string(u.Scheme) + "://" + net.JoinHostPort(u.Hostname, strconv.Itoa(int(u.Port)))
155+
return string(u.Scheme) + "://" + net.JoinHostPort(u.Hostname, strconv.Itoa(int(u.Port))) + u.Path
131156
}
132157

133158
type UpstreamResolver struct {

0 commit comments

Comments
 (0)