fakednssniffer.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  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. return nil, common.ErrNoClue
  34. }, metadataSniffer: true}, nil
  35. }
  36. type fakeDNSSniffResult struct {
  37. domainName string
  38. }
  39. func (fakeDNSSniffResult) Protocol() string {
  40. return "fakedns"
  41. }
  42. func (f fakeDNSSniffResult) Domain() string {
  43. return f.domainName
  44. }