mirror of
https://github.com/daeuniverse/dae.git
synced 2025-07-31 23:30:28 +07:00
feat(dns): support DoH, DoT, DoH3, DoQ (#649)
This commit is contained in:
@ -128,7 +128,7 @@ func New(dns *config.Dns, opt *NewOption) (s *Dns, err error) {
|
||||
|
||||
func (s *Dns) CheckUpstreamsFormat() error {
|
||||
for _, upstream := range s.upstream {
|
||||
_, _, _, err := ParseRawUpstream(upstream.Raw)
|
||||
_, _, _, _, err := ParseRawUpstream(upstream.Raw)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -30,6 +30,11 @@ const (
|
||||
UpstreamScheme_UDP UpstreamScheme = "udp"
|
||||
UpstreamScheme_TCP_UDP UpstreamScheme = "tcp+udp"
|
||||
upstreamScheme_TCP_UDP_Alias UpstreamScheme = "udp+tcp"
|
||||
UpstreamScheme_TLS UpstreamScheme = "tls"
|
||||
UpstreamScheme_QUIC UpstreamScheme = "quic"
|
||||
UpstreamScheme_HTTPS UpstreamScheme = "https"
|
||||
upstreamScheme_H3_Alias UpstreamScheme = "http3"
|
||||
UpstreamScheme_H3 UpstreamScheme = "h3"
|
||||
)
|
||||
|
||||
func (s UpstreamScheme) ContainsTcp() bool {
|
||||
@ -42,8 +47,9 @@ func (s UpstreamScheme) ContainsTcp() bool {
|
||||
}
|
||||
}
|
||||
|
||||
func ParseRawUpstream(raw *url.URL) (scheme UpstreamScheme, hostname string, port uint16, err error) {
|
||||
func ParseRawUpstream(raw *url.URL) (scheme UpstreamScheme, hostname string, port uint16, path string, err error) {
|
||||
var __port string
|
||||
var __path string
|
||||
switch scheme = UpstreamScheme(raw.Scheme); scheme {
|
||||
case upstreamScheme_TCP_UDP_Alias:
|
||||
scheme = UpstreamScheme_TCP_UDP
|
||||
@ -53,27 +59,45 @@ func ParseRawUpstream(raw *url.URL) (scheme UpstreamScheme, hostname string, por
|
||||
if __port == "" {
|
||||
__port = "53"
|
||||
}
|
||||
case upstreamScheme_H3_Alias:
|
||||
scheme = UpstreamScheme_H3
|
||||
fallthrough
|
||||
case UpstreamScheme_HTTPS, UpstreamScheme_H3:
|
||||
__port = raw.Port()
|
||||
if __port == "" {
|
||||
__port = "443"
|
||||
}
|
||||
__path = raw.Path
|
||||
if __path == "" {
|
||||
__path = "/dns-query"
|
||||
}
|
||||
case UpstreamScheme_QUIC, UpstreamScheme_TLS:
|
||||
__port = raw.Port()
|
||||
if __port == "" {
|
||||
__port = "853"
|
||||
}
|
||||
default:
|
||||
return "", "", 0, fmt.Errorf("unexpected scheme: %v", raw.Scheme)
|
||||
return "", "", 0, "", fmt.Errorf("unexpected scheme: %v", raw.Scheme)
|
||||
}
|
||||
_port, err := strconv.ParseUint(__port, 10, 16)
|
||||
if err != nil {
|
||||
return "", "", 0, fmt.Errorf("failed to parse dns_upstream port: %v", err)
|
||||
return "", "", 0, "", fmt.Errorf("failed to parse dns_upstream port: %v", err)
|
||||
}
|
||||
port = uint16(_port)
|
||||
hostname = raw.Hostname()
|
||||
return scheme, hostname, port, nil
|
||||
return scheme, hostname, port, __path, nil
|
||||
}
|
||||
|
||||
type Upstream struct {
|
||||
Scheme UpstreamScheme
|
||||
Hostname string
|
||||
Port uint16
|
||||
Path string
|
||||
*netutils.Ip46
|
||||
}
|
||||
|
||||
func NewUpstream(ctx context.Context, upstream *url.URL, resolverNetwork string) (up *Upstream, err error) {
|
||||
scheme, hostname, port, err := ParseRawUpstream(upstream)
|
||||
scheme, hostname, port, path, err := ParseRawUpstream(upstream)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: %v", ErrFormat, err)
|
||||
}
|
||||
@ -100,6 +124,7 @@ func NewUpstream(ctx context.Context, upstream *url.URL, resolverNetwork string)
|
||||
Scheme: scheme,
|
||||
Hostname: hostname,
|
||||
Port: port,
|
||||
Path: path,
|
||||
Ip46: ip46,
|
||||
}, nil
|
||||
}
|
||||
@ -115,9 +140,9 @@ func (u *Upstream) SupportedNetworks() (ipversions []consts.IpVersionStr, l4prot
|
||||
}
|
||||
}
|
||||
switch u.Scheme {
|
||||
case UpstreamScheme_TCP:
|
||||
case UpstreamScheme_TCP, UpstreamScheme_HTTPS, UpstreamScheme_TLS:
|
||||
l4protos = []consts.L4ProtoStr{consts.L4ProtoStr_TCP}
|
||||
case UpstreamScheme_UDP:
|
||||
case UpstreamScheme_UDP, UpstreamScheme_QUIC, UpstreamScheme_H3:
|
||||
l4protos = []consts.L4ProtoStr{consts.L4ProtoStr_UDP}
|
||||
case UpstreamScheme_TCP_UDP:
|
||||
// UDP first.
|
||||
@ -127,7 +152,7 @@ func (u *Upstream) SupportedNetworks() (ipversions []consts.IpVersionStr, l4prot
|
||||
}
|
||||
|
||||
func (u *Upstream) String() string {
|
||||
return string(u.Scheme) + "://" + net.JoinHostPort(u.Hostname, strconv.Itoa(int(u.Port)))
|
||||
return string(u.Scheme) + "://" + net.JoinHostPort(u.Hostname, strconv.Itoa(int(u.Port))) + u.Path
|
||||
}
|
||||
|
||||
type UpstreamResolver struct {
|
||||
|
Reference in New Issue
Block a user