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