server.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. "github.com/sagernet/sing/service"
  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"}, func(options dns.TransportOptions) (dns.Transport, error) {
  19. return NewTransport(options)
  20. })
  21. }
  22. type Transport struct {
  23. name string
  24. router adapter.Router
  25. store adapter.FakeIPStore
  26. logger logger.ContextLogger
  27. }
  28. func NewTransport(options dns.TransportOptions) (*Transport, error) {
  29. router := service.FromContext[adapter.Router](options.Context)
  30. if router == nil {
  31. return nil, E.New("missing router in context")
  32. }
  33. return &Transport{
  34. name: options.Name,
  35. router: router,
  36. logger: options.Logger,
  37. }, nil
  38. }
  39. func (s *Transport) Name() string {
  40. return s.name
  41. }
  42. func (s *Transport) Start() error {
  43. s.store = s.router.FakeIPStore()
  44. if s.store == nil {
  45. return E.New("fakeip not enabled")
  46. }
  47. return nil
  48. }
  49. func (s *Transport) Reset() {
  50. }
  51. func (s *Transport) Close() error {
  52. return nil
  53. }
  54. func (s *Transport) Raw() bool {
  55. return false
  56. }
  57. func (s *Transport) Exchange(ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, error) {
  58. return nil, os.ErrInvalid
  59. }
  60. func (s *Transport) Lookup(ctx context.Context, domain string, strategy dns.DomainStrategy) ([]netip.Addr, error) {
  61. var addresses []netip.Addr
  62. if strategy != dns.DomainStrategyUseIPv6 {
  63. inet4Address, err := s.store.Create(domain, false)
  64. if err != nil {
  65. return nil, err
  66. }
  67. addresses = append(addresses, inet4Address)
  68. }
  69. if strategy != dns.DomainStrategyUseIPv4 {
  70. inet6Address, err := s.store.Create(domain, true)
  71. if err != nil {
  72. return nil, err
  73. }
  74. addresses = append(addresses, inet6Address)
  75. }
  76. return addresses, nil
  77. }
  78. func (s *Transport) Store() adapter.FakeIPStore {
  79. return s.store
  80. }