chore: better dns log
This commit is contained in:
parent
2cf66f41cb
commit
e52d599326
6 changed files with 43 additions and 4 deletions
|
@ -25,6 +25,26 @@ type client struct {
|
||||||
host string
|
host string
|
||||||
iface *atomic.String
|
iface *atomic.String
|
||||||
proxyAdapter string
|
proxyAdapter string
|
||||||
|
addr string
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ dnsClient = (*client)(nil)
|
||||||
|
|
||||||
|
// Address implements dnsClient
|
||||||
|
func (c *client) Address() string {
|
||||||
|
if len(c.addr) != 0 {
|
||||||
|
return c.addr
|
||||||
|
}
|
||||||
|
schema := "udp"
|
||||||
|
if strings.HasPrefix(c.Client.Net, "tcp") {
|
||||||
|
schema = "tcp"
|
||||||
|
if strings.HasSuffix(c.Client.Net, "tls") {
|
||||||
|
schema = "tls"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.addr = fmt.Sprintf("%s//:%s", schema, net.JoinHostPort(c.host, c.port))
|
||||||
|
return c.addr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *client) Exchange(m *D.Msg) (*D.Msg, error) {
|
func (c *client) Exchange(m *D.Msg) (*D.Msg, error) {
|
||||||
|
|
15
dns/dhcp.go
15
dns/dhcp.go
|
@ -2,12 +2,14 @@ package dns
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"go.uber.org/atomic"
|
|
||||||
"net"
|
"net"
|
||||||
"net/netip"
|
"net/netip"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"go.uber.org/atomic"
|
||||||
|
|
||||||
"github.com/Dreamacro/clash/component/dhcp"
|
"github.com/Dreamacro/clash/component/dhcp"
|
||||||
"github.com/Dreamacro/clash/component/iface"
|
"github.com/Dreamacro/clash/component/iface"
|
||||||
"github.com/Dreamacro/clash/component/resolver"
|
"github.com/Dreamacro/clash/component/resolver"
|
||||||
|
@ -34,6 +36,17 @@ type dhcpClient struct {
|
||||||
err error
|
err error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var _ dnsClient = (*dhcpClient)(nil)
|
||||||
|
|
||||||
|
// Address implements dnsClient
|
||||||
|
func (d *dhcpClient) Address() string {
|
||||||
|
addrs := make([]string, 0)
|
||||||
|
for _, c := range d.clients {
|
||||||
|
addrs = append(addrs, c.Address())
|
||||||
|
}
|
||||||
|
return strings.Join(addrs, ",")
|
||||||
|
}
|
||||||
|
|
||||||
func (d *dhcpClient) Exchange(m *D.Msg) (msg *D.Msg, err error) {
|
func (d *dhcpClient) Exchange(m *D.Msg) (msg *D.Msg, err error) {
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), resolver.DefaultDNSTimeout)
|
ctx, cancel := context.WithTimeout(context.Background(), resolver.DefaultDNSTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
|
@ -64,6 +64,7 @@ type dnsOverHTTPS struct {
|
||||||
r *Resolver
|
r *Resolver
|
||||||
httpVersions []C.HTTPVersion
|
httpVersions []C.HTTPVersion
|
||||||
proxyAdapter string
|
proxyAdapter string
|
||||||
|
addr string
|
||||||
}
|
}
|
||||||
|
|
||||||
// type check
|
// type check
|
||||||
|
@ -83,6 +84,7 @@ func newDoHClient(urlString string, r *Resolver, preferH3 bool, params map[strin
|
||||||
|
|
||||||
doh := &dnsOverHTTPS{
|
doh := &dnsOverHTTPS{
|
||||||
url: u,
|
url: u,
|
||||||
|
addr: u.String(),
|
||||||
r: r,
|
r: r,
|
||||||
proxyAdapter: proxyAdapter,
|
proxyAdapter: proxyAdapter,
|
||||||
quicConfig: &quic.Config{
|
quicConfig: &quic.Config{
|
||||||
|
@ -98,7 +100,9 @@ func newDoHClient(urlString string, r *Resolver, preferH3 bool, params map[strin
|
||||||
}
|
}
|
||||||
|
|
||||||
// Address implements the Upstream interface for *dnsOverHTTPS.
|
// Address implements the Upstream interface for *dnsOverHTTPS.
|
||||||
func (doh *dnsOverHTTPS) Address() string { return doh.url.String() }
|
func (doh *dnsOverHTTPS) Address() string {
|
||||||
|
return doh.addr
|
||||||
|
}
|
||||||
func (doh *dnsOverHTTPS) ExchangeContext(ctx context.Context, m *D.Msg) (msg *D.Msg, err error) {
|
func (doh *dnsOverHTTPS) ExchangeContext(ctx context.Context, m *D.Msg) (msg *D.Msg, err error) {
|
||||||
// Quote from https://www.rfc-editor.org/rfc/rfc8484.html:
|
// Quote from https://www.rfc-editor.org/rfc/rfc8484.html:
|
||||||
// In order to maximize HTTP cache friendliness, DoH clients using media
|
// In order to maximize HTTP cache friendliness, DoH clients using media
|
||||||
|
|
|
@ -164,7 +164,6 @@ func withResolver(resolver *Resolver) handler {
|
||||||
msg.SetRcode(r, msg.Rcode)
|
msg.SetRcode(r, msg.Rcode)
|
||||||
msg.Authoritative = true
|
msg.Authoritative = true
|
||||||
|
|
||||||
log.Debugln("[DNS] %s --> %s", msgToDomain(r), msgToIP(msg))
|
|
||||||
return msg, nil
|
return msg, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ import (
|
||||||
type dnsClient interface {
|
type dnsClient interface {
|
||||||
Exchange(m *D.Msg) (msg *D.Msg, err error)
|
Exchange(m *D.Msg) (msg *D.Msg, err error)
|
||||||
ExchangeContext(ctx context.Context, m *D.Msg) (msg *D.Msg, err error)
|
ExchangeContext(ctx context.Context, m *D.Msg) (msg *D.Msg, err error)
|
||||||
|
Address() string
|
||||||
}
|
}
|
||||||
|
|
||||||
type result struct {
|
type result struct {
|
||||||
|
|
|
@ -235,15 +235,18 @@ func listenPacket(ctx context.Context, proxyAdapter string, network string, addr
|
||||||
|
|
||||||
func batchExchange(ctx context.Context, clients []dnsClient, m *D.Msg) (msg *D.Msg, err error) {
|
func batchExchange(ctx context.Context, clients []dnsClient, m *D.Msg) (msg *D.Msg, err error) {
|
||||||
fast, ctx := picker.WithTimeout[*D.Msg](ctx, resolver.DefaultDNSTimeout)
|
fast, ctx := picker.WithTimeout[*D.Msg](ctx, resolver.DefaultDNSTimeout)
|
||||||
|
domain := msgToDomain(m)
|
||||||
for _, client := range clients {
|
for _, client := range clients {
|
||||||
r := client
|
r := client
|
||||||
fast.Go(func() (*D.Msg, error) {
|
fast.Go(func() (*D.Msg, error) {
|
||||||
|
log.Debugln("[DNS] resolve %s from %s", domain, r.Address())
|
||||||
m, err := r.ExchangeContext(ctx, m)
|
m, err := r.ExchangeContext(ctx, m)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
} else if m.Rcode == D.RcodeServerFailure || m.Rcode == D.RcodeRefused {
|
} else if m.Rcode == D.RcodeServerFailure || m.Rcode == D.RcodeRefused {
|
||||||
return nil, errors.New("server failure")
|
return nil, errors.New("server failure")
|
||||||
}
|
}
|
||||||
|
log.Debugln("[DNS] %s --> %s, from %s", domain, msgToIP(m), r.Address())
|
||||||
return m, nil
|
return m, nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -256,7 +259,6 @@ func batchExchange(ctx context.Context, clients []dnsClient, m *D.Msg) (msg *D.M
|
||||||
}
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
msg = elm
|
msg = elm
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue