fakednssniffer.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // +build !confonly
  2. package dispatcher
  3. import (
  4. "context"
  5. core "github.com/v2fly/v2ray-core/v4"
  6. "github.com/v2fly/v2ray-core/v4/common"
  7. "github.com/v2fly/v2ray-core/v4/common/net"
  8. "github.com/v2fly/v2ray-core/v4/common/session"
  9. "github.com/v2fly/v2ray-core/v4/features/dns"
  10. )
  11. // newFakeDNSSniffer Create a Fake DNS metadata sniffer
  12. func newFakeDNSSniffer(ctx context.Context) (protocolSnifferWithMetadata, error) {
  13. var fakeDNSEngine dns.FakeDNSEngine
  14. err := core.RequireFeatures(ctx, func(fdns dns.FakeDNSEngine) {
  15. fakeDNSEngine = fdns
  16. })
  17. if err != nil {
  18. return protocolSnifferWithMetadata{}, err
  19. }
  20. if fakeDNSEngine == nil {
  21. errNotInit := newError("FakeDNSEngine is not initialized, but such a sniffer is used").AtError()
  22. return protocolSnifferWithMetadata{}, errNotInit
  23. }
  24. return protocolSnifferWithMetadata{protocolSniffer: func(ctx context.Context, bytes []byte) (SniffResult, error) {
  25. Target := session.OutboundFromContext(ctx).Target
  26. if Target.Network == net.Network_TCP || Target.Network == net.Network_UDP {
  27. domainFromFakeDNS := fakeDNSEngine.GetDomainFromFakeDNS(Target.Address)
  28. if domainFromFakeDNS != "" {
  29. newError("fake dns got domain: ", domainFromFakeDNS, " for ip: ", Target.Address.String()).WriteToLog(session.ExportIDToError(ctx))
  30. return &fakeDNSSniffResult{domainName: domainFromFakeDNS}, nil
  31. }
  32. }
  33. if ipAddressInRangeValueI := ctx.Value(ipAddressInRange); ipAddressInRangeValueI != nil {
  34. ipAddressInRangeValue := ipAddressInRangeValueI.(*ipAddressInRangeOpt)
  35. if fkr0, ok := fakeDNSEngine.(dns.FakeDNSEngineRev0); ok {
  36. inPool := fkr0.IsIPInIPPool(Target.Address)
  37. ipAddressInRangeValue.addressInRange = &inPool
  38. }
  39. }
  40. return nil, common.ErrNoClue
  41. }, metadataSniffer: true}, nil
  42. }
  43. type fakeDNSSniffResult struct {
  44. domainName string
  45. }
  46. func (fakeDNSSniffResult) Protocol() string {
  47. return "fakedns"
  48. }
  49. func (f fakeDNSSniffResult) Domain() string {
  50. return f.domainName
  51. }
  52. type fakeDnsExtraOpts int
  53. const ipAddressInRange fakeDnsExtraOpts = 1
  54. type ipAddressInRangeOpt struct {
  55. addressInRange *bool
  56. }
  57. type DNSThenOthersSniffResult struct {
  58. domainName string
  59. }
  60. func (DNSThenOthersSniffResult) Protocol() string {
  61. return "fakedns+others"
  62. }
  63. func (f DNSThenOthersSniffResult) Domain() string {
  64. return f.domainName
  65. }
  66. func newFakeDNSThenOthers(ctx context.Context, fakeDNSSniffer protocolSnifferWithMetadata, others []protocolSnifferWithMetadata) (protocolSnifferWithMetadata, error) {
  67. return protocolSnifferWithMetadata{
  68. protocolSniffer: func(ctx context.Context, bytes []byte) (SniffResult, error) {
  69. ipAddressInRangeValue := &ipAddressInRangeOpt{}
  70. ctx = context.WithValue(ctx, ipAddressInRange, ipAddressInRangeValue)
  71. result, err := fakeDNSSniffer.protocolSniffer(ctx, bytes)
  72. if err == nil {
  73. return result, nil
  74. }
  75. if ipAddressInRangeValue.addressInRange != nil {
  76. if *ipAddressInRangeValue.addressInRange == true {
  77. for _, v := range others {
  78. if v.metadataSniffer || bytes != nil {
  79. if result, err := v.protocolSniffer(ctx, bytes); err == nil {
  80. return DNSThenOthersSniffResult{result.Domain()}, nil
  81. }
  82. }
  83. }
  84. return nil, common.ErrNoClue
  85. } else {
  86. newError("ip address not in fake dns range, return as is").AtDebug().WriteToLog()
  87. return nil, common.ErrNoClue
  88. }
  89. } else {
  90. newError("fake dns sniffer did not set address in range option, assume false.").AtWarning().WriteToLog()
  91. return nil, common.ErrNoClue
  92. }
  93. },
  94. metadataSniffer: true,
  95. }, nil
  96. }