fakedns.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package conf
  2. import (
  3. "context"
  4. "encoding/json"
  5. "strings"
  6. "github.com/xtls/xray-core/app/dns/fakedns"
  7. "github.com/xtls/xray-core/common/errors"
  8. "github.com/xtls/xray-core/features/dns"
  9. )
  10. type FakeDNSPoolElementConfig struct {
  11. IPPool string `json:"ipPool"`
  12. LRUSize int64 `json:"poolSize"`
  13. }
  14. type FakeDNSConfig struct {
  15. pool *FakeDNSPoolElementConfig
  16. pools []*FakeDNSPoolElementConfig
  17. }
  18. // UnmarshalJSON implements encoding/json.Unmarshaler.UnmarshalJSON
  19. func (f *FakeDNSConfig) UnmarshalJSON(data []byte) error {
  20. var pool FakeDNSPoolElementConfig
  21. var pools []*FakeDNSPoolElementConfig
  22. switch {
  23. case json.Unmarshal(data, &pool) == nil:
  24. f.pool = &pool
  25. case json.Unmarshal(data, &pools) == nil:
  26. f.pools = pools
  27. default:
  28. return errors.New("invalid fakedns config")
  29. }
  30. return nil
  31. }
  32. func (f *FakeDNSConfig) Build() (*fakedns.FakeDnsPoolMulti, error) {
  33. fakeDNSPool := fakedns.FakeDnsPoolMulti{}
  34. if f.pool != nil {
  35. fakeDNSPool.Pools = append(fakeDNSPool.Pools, &fakedns.FakeDnsPool{
  36. IpPool: f.pool.IPPool,
  37. LruSize: f.pool.LRUSize,
  38. })
  39. return &fakeDNSPool, nil
  40. }
  41. if f.pools != nil {
  42. for _, v := range f.pools {
  43. fakeDNSPool.Pools = append(fakeDNSPool.Pools, &fakedns.FakeDnsPool{IpPool: v.IPPool, LruSize: v.LRUSize})
  44. }
  45. return &fakeDNSPool, nil
  46. }
  47. return nil, errors.New("no valid FakeDNS config")
  48. }
  49. type FakeDNSPostProcessingStage struct{}
  50. func (FakeDNSPostProcessingStage) Process(config *Config) error {
  51. fakeDNSInUse := false
  52. isIPv4Enable, isIPv6Enable := true, true
  53. if config.DNSConfig != nil {
  54. for _, v := range config.DNSConfig.Servers {
  55. if v.Address.Family().IsDomain() && strings.EqualFold(v.Address.Domain(), "fakedns") {
  56. fakeDNSInUse = true
  57. }
  58. }
  59. switch strings.ToLower(config.DNSConfig.QueryStrategy) {
  60. case "useip4", "useipv4", "use_ip4", "use_ipv4", "use_ip_v4", "use-ip4", "use-ipv4", "use-ip-v4":
  61. isIPv4Enable, isIPv6Enable = true, false
  62. case "useip6", "useipv6", "use_ip6", "use_ipv6", "use_ip_v6", "use-ip6", "use-ipv6", "use-ip-v6":
  63. isIPv4Enable, isIPv6Enable = false, true
  64. }
  65. }
  66. if fakeDNSInUse {
  67. // Add a Fake DNS Config if there is none
  68. if config.FakeDNS == nil {
  69. config.FakeDNS = &FakeDNSConfig{}
  70. switch {
  71. case isIPv4Enable && isIPv6Enable:
  72. config.FakeDNS.pools = []*FakeDNSPoolElementConfig{
  73. {
  74. IPPool: dns.FakeIPv4Pool,
  75. LRUSize: 32768,
  76. },
  77. {
  78. IPPool: dns.FakeIPv6Pool,
  79. LRUSize: 32768,
  80. },
  81. }
  82. case !isIPv4Enable && isIPv6Enable:
  83. config.FakeDNS.pool = &FakeDNSPoolElementConfig{
  84. IPPool: dns.FakeIPv6Pool,
  85. LRUSize: 65535,
  86. }
  87. case isIPv4Enable && !isIPv6Enable:
  88. config.FakeDNS.pool = &FakeDNSPoolElementConfig{
  89. IPPool: dns.FakeIPv4Pool,
  90. LRUSize: 65535,
  91. }
  92. }
  93. }
  94. found := false
  95. // Check if there is a Outbound with necessary sniffer on
  96. var inbounds []InboundDetourConfig
  97. if len(config.InboundConfigs) > 0 {
  98. inbounds = append(inbounds, config.InboundConfigs...)
  99. }
  100. for _, v := range inbounds {
  101. if v.SniffingConfig != nil && v.SniffingConfig.Enabled && v.SniffingConfig.DestOverride != nil {
  102. for _, dov := range *v.SniffingConfig.DestOverride {
  103. if strings.EqualFold(dov, "fakedns") || strings.EqualFold(dov, "fakedns+others") {
  104. found = true
  105. break
  106. }
  107. }
  108. }
  109. }
  110. if !found {
  111. errors.LogWarning(context.Background(), "Defined FakeDNS but haven't enabled FakeDNS destOverride at any inbound.")
  112. }
  113. }
  114. return nil
  115. }