dns.go 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package adapter
  2. import (
  3. "context"
  4. "net/netip"
  5. "time"
  6. C "github.com/sagernet/sing-box/constant"
  7. "github.com/sagernet/sing-box/log"
  8. "github.com/sagernet/sing-box/option"
  9. E "github.com/sagernet/sing/common/exceptions"
  10. "github.com/sagernet/sing/common/logger"
  11. "github.com/sagernet/sing/service"
  12. "github.com/miekg/dns"
  13. )
  14. type DNSRouter interface {
  15. Lifecycle
  16. Exchange(ctx context.Context, message *dns.Msg, options DNSQueryOptions) (*dns.Msg, error)
  17. Lookup(ctx context.Context, domain string, options DNSQueryOptions) ([]netip.Addr, error)
  18. ClearCache()
  19. LookupReverseMapping(ip netip.Addr) (string, bool)
  20. ResetNetwork()
  21. }
  22. type DNSClient interface {
  23. Start()
  24. Exchange(ctx context.Context, transport DNSTransport, message *dns.Msg, options DNSQueryOptions, responseChecker func(response *dns.Msg) bool) (*dns.Msg, error)
  25. Lookup(ctx context.Context, transport DNSTransport, domain string, options DNSQueryOptions, responseChecker func(response *dns.Msg) bool) ([]netip.Addr, error)
  26. ClearCache()
  27. }
  28. type DNSQueryOptions struct {
  29. Transport DNSTransport
  30. Strategy C.DomainStrategy
  31. LookupStrategy C.DomainStrategy
  32. DisableCache bool
  33. DisableOptimisticCache bool
  34. RewriteTTL *uint32
  35. ClientSubnet netip.Prefix
  36. }
  37. func DNSQueryOptionsFrom(ctx context.Context, options *option.DomainResolveOptions) (*DNSQueryOptions, error) {
  38. if options == nil {
  39. return &DNSQueryOptions{}, nil
  40. }
  41. transportManager := service.FromContext[DNSTransportManager](ctx)
  42. transport, loaded := transportManager.Transport(options.Server)
  43. if !loaded {
  44. return nil, E.New("domain resolver not found: " + options.Server)
  45. }
  46. return &DNSQueryOptions{
  47. Transport: transport,
  48. Strategy: C.DomainStrategy(options.Strategy),
  49. DisableCache: options.DisableCache,
  50. DisableOptimisticCache: options.DisableOptimisticCache,
  51. RewriteTTL: options.RewriteTTL,
  52. ClientSubnet: options.ClientSubnet.Build(netip.Prefix{}),
  53. }, nil
  54. }
  55. type RDRCStore interface {
  56. LoadRDRC(transportName string, qName string, qType uint16) (rejected bool)
  57. SaveRDRC(transportName string, qName string, qType uint16) error
  58. SaveRDRCAsync(transportName string, qName string, qType uint16, logger logger.Logger)
  59. }
  60. type DNSCacheStore interface {
  61. LoadDNSCache(transportName string, qName string, qType uint16) (rawMessage []byte, expireAt time.Time, loaded bool)
  62. SaveDNSCache(transportName string, qName string, qType uint16, rawMessage []byte, expireAt time.Time) error
  63. SaveDNSCacheAsync(transportName string, qName string, qType uint16, rawMessage []byte, expireAt time.Time, logger logger.Logger)
  64. ClearDNSCache() error
  65. }
  66. type DNSTransport interface {
  67. Lifecycle
  68. Type() string
  69. Tag() string
  70. Dependencies() []string
  71. Reset()
  72. Exchange(ctx context.Context, message *dns.Msg) (*dns.Msg, error)
  73. }
  74. type DNSTransportRegistry interface {
  75. option.DNSTransportOptionsRegistry
  76. CreateDNSTransport(ctx context.Context, logger log.ContextLogger, tag string, transportType string, options any) (DNSTransport, error)
  77. }
  78. type DNSTransportManager interface {
  79. Lifecycle
  80. Transports() []DNSTransport
  81. Transport(tag string) (DNSTransport, bool)
  82. Default() DNSTransport
  83. FakeIP() FakeIPTransport
  84. Remove(tag string) error
  85. Create(ctx context.Context, logger log.ContextLogger, tag string, outboundType string, options any) error
  86. }