fakedns.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package conf
  2. import (
  3. "github.com/golang/protobuf/proto"
  4. "github.com/v2fly/v2ray-core/v4/app/dns/fakedns"
  5. )
  6. type FakeDNSPoolElementConfig struct {
  7. IPPool string `json:"ipPool"`
  8. LruSize int64 `json:"poolSize"`
  9. }
  10. type FakeDNSConfig struct {
  11. IPPool string `json:"ipPool"`
  12. LruSize int64 `json:"poolSize"`
  13. Pools *[]FakeDNSPoolElementConfig `json:"pools,omitempty"`
  14. }
  15. func (f FakeDNSConfig) Build() (proto.Message, error) {
  16. if f.Pools != nil {
  17. fakeDNSPool := &fakedns.FakeDnsPoolMulti{}
  18. for _, v := range *f.Pools {
  19. fakeDNSPool.Pools = append(fakeDNSPool.Pools, &fakedns.FakeDnsPool{IpPool: v.IPPool, LruSize: v.LruSize})
  20. }
  21. return fakeDNSPool, nil
  22. }
  23. return &fakedns.FakeDnsPool{
  24. IpPool: f.IPPool,
  25. LruSize: f.LruSize,
  26. }, nil
  27. }
  28. type FakeDNSPostProcessingStage struct{}
  29. func (FakeDNSPostProcessingStage) Process(conf *Config) error {
  30. var fakeDNSInUse bool
  31. if conf.DNSConfig != nil {
  32. for _, v := range conf.DNSConfig.Servers {
  33. if v.Address.Family().IsDomain() {
  34. if v.Address.Domain() == "fakedns" {
  35. fakeDNSInUse = true
  36. }
  37. }
  38. }
  39. }
  40. if fakeDNSInUse {
  41. if conf.FakeDNS == nil {
  42. // Add a Fake DNS Config if there is none
  43. conf.FakeDNS = &FakeDNSConfig{
  44. IPPool: "198.18.0.0/15",
  45. LruSize: 65535,
  46. }
  47. }
  48. found := false
  49. // Check if there is a Outbound with necessary sniffer on
  50. var inbounds []InboundDetourConfig
  51. if len(conf.InboundConfigs) > 0 {
  52. inbounds = append(inbounds, conf.InboundConfigs...)
  53. }
  54. for _, v := range inbounds {
  55. if v.SniffingConfig != nil && v.SniffingConfig.Enabled && v.SniffingConfig.DestOverride != nil {
  56. for _, dov := range *v.SniffingConfig.DestOverride {
  57. if dov == "fakedns" {
  58. found = true
  59. }
  60. }
  61. }
  62. }
  63. if !found {
  64. newError("Defined Fake DNS but haven't enabled fake dns sniffing at any inbound.").AtWarning().WriteToLog()
  65. }
  66. }
  67. return nil
  68. }