config.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package router
  2. import (
  3. "net"
  4. "v2ray.com/core/common/errors"
  5. v2net "v2ray.com/core/common/net"
  6. "v2ray.com/core/proxy"
  7. )
  8. type Rule struct {
  9. Tag string
  10. Condition Condition
  11. }
  12. func (v *Rule) Apply(session *proxy.SessionInfo) bool {
  13. return v.Condition.Apply(session)
  14. }
  15. func (v *RoutingRule) BuildCondition() (Condition, error) {
  16. conds := NewConditionChan()
  17. if len(v.Domain) > 0 {
  18. anyCond := NewAnyCondition()
  19. for _, domain := range v.Domain {
  20. if domain.Type == Domain_Plain {
  21. anyCond.Add(NewPlainDomainMatcher(domain.Value))
  22. } else {
  23. matcher, err := NewRegexpDomainMatcher(domain.Value)
  24. if err != nil {
  25. return nil, err
  26. }
  27. anyCond.Add(matcher)
  28. }
  29. }
  30. conds.Add(anyCond)
  31. }
  32. if len(v.Cidr) > 0 {
  33. ipv4Net := v2net.NewIPNet()
  34. ipv6Cond := NewAnyCondition()
  35. hasIpv6 := false
  36. for _, ip := range v.Cidr {
  37. switch len(ip.Ip) {
  38. case net.IPv4len:
  39. ipv4Net.AddIP(ip.Ip, byte(ip.Prefix))
  40. case net.IPv6len:
  41. hasIpv6 = true
  42. matcher, err := NewCIDRMatcher(ip.Ip, ip.Prefix, false)
  43. if err != nil {
  44. return nil, err
  45. }
  46. ipv6Cond.Add(matcher)
  47. default:
  48. return nil, errors.New("Router: Invalid IP length.")
  49. }
  50. }
  51. if !ipv4Net.IsEmpty() && hasIpv6 {
  52. cond := NewAnyCondition()
  53. cond.Add(NewIPv4Matcher(ipv4Net, false))
  54. cond.Add(ipv6Cond)
  55. conds.Add(cond)
  56. } else if !ipv4Net.IsEmpty() {
  57. conds.Add(NewIPv4Matcher(ipv4Net, false))
  58. } else if hasIpv6 {
  59. conds.Add(ipv6Cond)
  60. }
  61. }
  62. if v.PortRange != nil {
  63. conds.Add(NewPortMatcher(*v.PortRange))
  64. }
  65. if v.NetworkList != nil {
  66. conds.Add(NewNetworkMatcher(v.NetworkList))
  67. }
  68. if len(v.SourceCidr) > 0 {
  69. ipv4Net := v2net.NewIPNet()
  70. ipv6Cond := NewAnyCondition()
  71. hasIpv6 := false
  72. for _, ip := range v.SourceCidr {
  73. switch len(ip.Ip) {
  74. case net.IPv4len:
  75. ipv4Net.AddIP(ip.Ip, byte(ip.Prefix))
  76. case net.IPv6len:
  77. hasIpv6 = true
  78. matcher, err := NewCIDRMatcher(ip.Ip, ip.Prefix, true)
  79. if err != nil {
  80. return nil, err
  81. }
  82. ipv6Cond.Add(matcher)
  83. default:
  84. return nil, errors.New("Router: Invalid IP length.")
  85. }
  86. }
  87. if !ipv4Net.IsEmpty() && hasIpv6 {
  88. cond := NewAnyCondition()
  89. cond.Add(NewIPv4Matcher(ipv4Net, true))
  90. cond.Add(ipv6Cond)
  91. conds.Add(cond)
  92. } else if !ipv4Net.IsEmpty() {
  93. conds.Add(NewIPv4Matcher(ipv4Net, true))
  94. } else if hasIpv6 {
  95. conds.Add(ipv6Cond)
  96. }
  97. }
  98. if len(v.UserEmail) > 0 {
  99. conds.Add(NewUserMatcher(v.UserEmail))
  100. }
  101. if len(v.InboundTag) > 0 {
  102. conds.Add(NewInboundTagMatcher(v.InboundTag))
  103. }
  104. if conds.Len() == 0 {
  105. return nil, errors.New("Router: This rule has no effective fields.")
  106. }
  107. return conds, nil
  108. }