fakednssniffer.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package dispatcher
  2. import (
  3. "context"
  4. "github.com/xtls/xray-core/common"
  5. "github.com/xtls/xray-core/common/net"
  6. "github.com/xtls/xray-core/common/session"
  7. "github.com/xtls/xray-core/core"
  8. "github.com/xtls/xray-core/features/dns"
  9. )
  10. // newFakeDNSSniffer Create a Fake DNS metadata sniffer
  11. func newFakeDNSSniffer(ctx context.Context) (protocolSnifferWithMetadata, error) {
  12. var fakeDNSEngine dns.FakeDNSEngine
  13. err := core.RequireFeatures(ctx, func(fdns dns.FakeDNSEngine) {
  14. fakeDNSEngine = fdns
  15. })
  16. if err != nil {
  17. return protocolSnifferWithMetadata{}, err
  18. }
  19. if fakeDNSEngine == nil {
  20. errNotInit := newError("FakeDNSEngine is not initialized, but such a sniffer is used").AtError()
  21. return protocolSnifferWithMetadata{}, errNotInit
  22. }
  23. return protocolSnifferWithMetadata{protocolSniffer: func(ctx context.Context, bytes []byte) (SniffResult, error) {
  24. Target := session.OutboundFromContext(ctx).Target
  25. if Target.Network == net.Network_TCP || Target.Network == net.Network_UDP {
  26. domainFromFakeDNS := fakeDNSEngine.GetDomainFromFakeDNS(Target.Address)
  27. if domainFromFakeDNS != "" {
  28. newError("fake dns got domain: ", domainFromFakeDNS, " for ip: ", Target.Address.String()).WriteToLog(session.ExportIDToError(ctx))
  29. return &fakeDNSSniffResult{domainName: domainFromFakeDNS}, nil
  30. }
  31. }
  32. return nil, common.ErrNoClue
  33. }, metadataSniffer: true}, nil
  34. }
  35. type fakeDNSSniffResult struct {
  36. domainName string
  37. }
  38. func (fakeDNSSniffResult) Protocol() string {
  39. return "fakedns"
  40. }
  41. func (f fakeDNSSniffResult) Domain() string {
  42. return f.domainName
  43. }