server.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package fakeip
  2. import (
  3. "context"
  4. "net/netip"
  5. "os"
  6. "github.com/sagernet/sing-box/adapter"
  7. "github.com/sagernet/sing-dns"
  8. E "github.com/sagernet/sing/common/exceptions"
  9. "github.com/sagernet/sing/common/logger"
  10. N "github.com/sagernet/sing/common/network"
  11. mDNS "github.com/miekg/dns"
  12. )
  13. var (
  14. _ dns.Transport = (*Transport)(nil)
  15. _ adapter.FakeIPTransport = (*Transport)(nil)
  16. )
  17. func init() {
  18. dns.RegisterTransport([]string{"fakeip"}, NewTransport)
  19. }
  20. type Transport struct {
  21. name string
  22. router adapter.Router
  23. store adapter.FakeIPStore
  24. logger logger.ContextLogger
  25. }
  26. func NewTransport(name string, ctx context.Context, logger logger.ContextLogger, dialer N.Dialer, link string) (dns.Transport, error) {
  27. router := adapter.RouterFromContext(ctx)
  28. if router == nil {
  29. return nil, E.New("missing router in context")
  30. }
  31. return &Transport{
  32. name: name,
  33. router: router,
  34. logger: logger,
  35. }, nil
  36. }
  37. func (s *Transport) Name() string {
  38. return s.name
  39. }
  40. func (s *Transport) Start() error {
  41. s.store = s.router.FakeIPStore()
  42. if s.store == nil {
  43. return E.New("fakeip not enabled")
  44. }
  45. return nil
  46. }
  47. func (s *Transport) Reset() {
  48. }
  49. func (s *Transport) Close() error {
  50. return nil
  51. }
  52. func (s *Transport) Raw() bool {
  53. return false
  54. }
  55. func (s *Transport) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, error) {
  56. return nil, os.ErrInvalid
  57. }
  58. func (s *Transport) Lookup(ctx context.Context, domain string, strategy dns.DomainStrategy) ([]netip.Addr, error) {
  59. var addresses []netip.Addr
  60. if strategy != dns.DomainStrategyUseIPv6 {
  61. inet4Address, err := s.store.Create(domain, false)
  62. if err != nil {
  63. return nil, err
  64. }
  65. addresses = append(addresses, inet4Address)
  66. }
  67. if strategy != dns.DomainStrategyUseIPv4 {
  68. inet6Address, err := s.store.Create(domain, true)
  69. if err != nil {
  70. return nil, err
  71. }
  72. addresses = append(addresses, inet6Address)
  73. }
  74. return addresses, nil
  75. }
  76. func (s *Transport) Store() adapter.FakeIPStore {
  77. return s.store
  78. }