fakedns.go 3.3 KB

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