router.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. package conf
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "strconv"
  6. "strings"
  7. "v2ray.com/core/app/router"
  8. "v2ray.com/core/common/log"
  9. v2net "v2ray.com/core/common/net"
  10. "v2ray.com/core/tools/geoip"
  11. )
  12. type RouterRulesConfig struct {
  13. RuleList []json.RawMessage `json:"rules"`
  14. DomainStrategy string `json:"domainStrategy"`
  15. }
  16. type RouterConfig struct {
  17. Settings *RouterRulesConfig `json:"settings"`
  18. }
  19. func (this *RouterConfig) Build() (*router.Config, error) {
  20. if this.Settings == nil {
  21. return nil, errors.New("Router settings is not specified.")
  22. }
  23. config := new(router.Config)
  24. settings := this.Settings
  25. config.DomainStrategy = router.Config_AsIs
  26. config.Rule = make([]*router.RoutingRule, len(settings.RuleList))
  27. domainStrategy := strings.ToLower(settings.DomainStrategy)
  28. if domainStrategy == "alwaysip" {
  29. config.DomainStrategy = router.Config_UseIp
  30. } else if domainStrategy == "ipifnonmatch" {
  31. config.DomainStrategy = router.Config_IpIfNonMatch
  32. }
  33. for idx, rawRule := range settings.RuleList {
  34. rule := ParseRule(rawRule)
  35. config.Rule[idx] = rule
  36. }
  37. return config, nil
  38. }
  39. type RouterRule struct {
  40. Type string `json:"type"`
  41. OutboundTag string `json:"outboundTag"`
  42. }
  43. func parseIP(s string) *router.IP {
  44. var addr, mask string
  45. i := strings.Index(s, "/")
  46. if i < 0 {
  47. addr = s
  48. } else {
  49. addr = s[:i]
  50. mask = s[i+1:]
  51. }
  52. ip := v2net.ParseAddress(addr)
  53. if !ip.Family().Either(v2net.AddressFamilyIPv4, v2net.AddressFamilyIPv6) {
  54. return nil
  55. }
  56. bits := uint32(32)
  57. if len(mask) > 0 {
  58. bits64, err := strconv.ParseUint(mask, 10, 32)
  59. if err != nil {
  60. return nil
  61. }
  62. bits = uint32(bits64)
  63. }
  64. if bits > 32 {
  65. log.Warning("Router: invalid network mask: ", bits)
  66. return nil
  67. }
  68. return &router.IP{
  69. Ip: []byte(ip.IP()),
  70. UnmatchingBits: 32 - bits,
  71. }
  72. }
  73. func parseFieldRule(msg json.RawMessage) (*router.RoutingRule, error) {
  74. type RawFieldRule struct {
  75. RouterRule
  76. Domain *StringList `json:"domain"`
  77. IP *StringList `json:"ip"`
  78. Port *PortRange `json:"port"`
  79. Network *NetworkList `json:"network"`
  80. }
  81. rawFieldRule := new(RawFieldRule)
  82. err := json.Unmarshal(msg, rawFieldRule)
  83. if err != nil {
  84. return nil, err
  85. }
  86. rule := new(router.RoutingRule)
  87. rule.Tag = rawFieldRule.OutboundTag
  88. if rawFieldRule.Domain != nil {
  89. for _, domain := range *rawFieldRule.Domain {
  90. domainRule := new(router.Domain)
  91. if strings.HasPrefix(domain, "regexp:") {
  92. domainRule.Type = router.Domain_Regex
  93. domainRule.Value = domain[7:]
  94. } else {
  95. domainRule.Type = router.Domain_Plain
  96. domainRule.Value = domain
  97. }
  98. rule.Domain = append(rule.Domain, domainRule)
  99. }
  100. }
  101. if rawFieldRule.IP != nil {
  102. for _, ip := range *rawFieldRule.IP {
  103. ipRule := parseIP(ip)
  104. if ipRule != nil {
  105. rule.Ip = append(rule.Ip, ipRule)
  106. }
  107. }
  108. }
  109. if rawFieldRule.Port != nil {
  110. rule.PortRange = rawFieldRule.Port.Build()
  111. }
  112. if rawFieldRule.Network != nil {
  113. rule.NetworkList = rawFieldRule.Network.Build()
  114. }
  115. return rule, nil
  116. }
  117. func ParseRule(msg json.RawMessage) *router.RoutingRule {
  118. rawRule := new(RouterRule)
  119. err := json.Unmarshal(msg, rawRule)
  120. if err != nil {
  121. log.Error("Router: Invalid router rule: ", err)
  122. return nil
  123. }
  124. if rawRule.Type == "field" {
  125. fieldrule, err := parseFieldRule(msg)
  126. if err != nil {
  127. log.Error("Invalid field rule: ", err)
  128. return nil
  129. }
  130. return fieldrule
  131. }
  132. if rawRule.Type == "chinaip" {
  133. chinaiprule, err := parseChinaIPRule(msg)
  134. if err != nil {
  135. log.Error("Router: Invalid chinaip rule: ", err)
  136. return nil
  137. }
  138. return chinaiprule
  139. }
  140. if rawRule.Type == "chinasites" {
  141. chinasitesrule, err := parseChinaSitesRule(msg)
  142. if err != nil {
  143. log.Error("Invalid chinasites rule: ", err)
  144. return nil
  145. }
  146. return chinasitesrule
  147. }
  148. log.Error("Unknown router rule type: ", rawRule.Type)
  149. return nil
  150. }
  151. func parseChinaIPRule(data []byte) (*router.RoutingRule, error) {
  152. rawRule := new(RouterRule)
  153. err := json.Unmarshal(data, rawRule)
  154. if err != nil {
  155. log.Error("Router: Invalid router rule: ", err)
  156. return nil, err
  157. }
  158. return &router.RoutingRule{
  159. Tag: rawRule.OutboundTag,
  160. Ip: geoip.ChinaIPs,
  161. }, nil
  162. }
  163. func parseChinaSitesRule(data []byte) (*router.RoutingRule, error) {
  164. rawRule := new(RouterRule)
  165. err := json.Unmarshal(data, rawRule)
  166. if err != nil {
  167. log.Error("Router: Invalid router rule: ", err)
  168. return nil, err
  169. }
  170. return &router.RoutingRule{
  171. Tag: rawRule.OutboundTag,
  172. Domain: chinaSitesDomains,
  173. }, nil
  174. }