router.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. package conf
  2. import (
  3. "encoding/json"
  4. "strconv"
  5. "strings"
  6. "v2ray.com/core/app/log"
  7. "v2ray.com/core/app/router"
  8. v2net "v2ray.com/core/common/net"
  9. "v2ray.com/core/tools/geoip"
  10. "github.com/golang/protobuf/proto"
  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 (c *RouterConfig) Build() (*router.Config, error) {
  20. if c.Settings == nil {
  21. return nil, newError("Router settings is not specified.")
  22. }
  23. config := new(router.Config)
  24. settings := c.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, err := ParseRule(rawRule)
  35. if err != nil {
  36. return nil, err
  37. }
  38. config.Rule[idx] = rule
  39. }
  40. return config, nil
  41. }
  42. type RouterRule struct {
  43. Type string `json:"type"`
  44. OutboundTag string `json:"outboundTag"`
  45. }
  46. func parseIP(s string) (*router.CIDR, error) {
  47. var addr, mask string
  48. i := strings.Index(s, "/")
  49. if i < 0 {
  50. addr = s
  51. } else {
  52. addr = s[:i]
  53. mask = s[i+1:]
  54. }
  55. ip := v2net.ParseAddress(addr)
  56. switch ip.Family() {
  57. case v2net.AddressFamilyIPv4:
  58. bits := uint32(32)
  59. if len(mask) > 0 {
  60. bits64, err := strconv.ParseUint(mask, 10, 32)
  61. if err != nil {
  62. return nil, newError("invalid network mask for router: ", mask).Base(err)
  63. }
  64. bits = uint32(bits64)
  65. }
  66. if bits > 32 {
  67. return nil, newError("invalid network mask for router: ", bits)
  68. }
  69. return &router.CIDR{
  70. Ip: []byte(ip.IP()),
  71. Prefix: bits,
  72. }, nil
  73. case v2net.AddressFamilyIPv6:
  74. bits := uint32(128)
  75. if len(mask) > 0 {
  76. bits64, err := strconv.ParseUint(mask, 10, 32)
  77. if err != nil {
  78. return nil, newError("invalid network mask for router: ", mask).Base(err)
  79. }
  80. bits = uint32(bits64)
  81. }
  82. if bits > 128 {
  83. return nil, newError("invalid network mask for router: ", bits)
  84. }
  85. return &router.CIDR{
  86. Ip: []byte(ip.IP()),
  87. Prefix: bits,
  88. }, nil
  89. default:
  90. return nil, newError("unsupported address for router: ", s)
  91. }
  92. }
  93. func parseFieldRule(msg json.RawMessage) (*router.RoutingRule, error) {
  94. type RawFieldRule struct {
  95. RouterRule
  96. Domain *StringList `json:"domain"`
  97. IP *StringList `json:"ip"`
  98. Port *PortRange `json:"port"`
  99. Network *NetworkList `json:"network"`
  100. SourceIP *StringList `json:"source"`
  101. User *StringList `json:"user"`
  102. InboundTag *StringList `json:"inboundTag"`
  103. }
  104. rawFieldRule := new(RawFieldRule)
  105. err := json.Unmarshal(msg, rawFieldRule)
  106. if err != nil {
  107. return nil, err
  108. }
  109. rule := new(router.RoutingRule)
  110. rule.Tag = rawFieldRule.OutboundTag
  111. if rawFieldRule.Domain != nil {
  112. for _, domain := range *rawFieldRule.Domain {
  113. domainRule := new(router.Domain)
  114. switch {
  115. case strings.HasPrefix(domain, "regexp:"):
  116. domainRule.Type = router.Domain_Regex
  117. domainRule.Value = domain[7:]
  118. case strings.HasPrefix(domain, "domain:"):
  119. domainRule.Type = router.Domain_Domain
  120. domainRule.Value = domain[7:]
  121. default:
  122. domainRule.Type = router.Domain_Plain
  123. domainRule.Value = domain
  124. }
  125. rule.Domain = append(rule.Domain, domainRule)
  126. }
  127. }
  128. if rawFieldRule.IP != nil {
  129. for _, ip := range *rawFieldRule.IP {
  130. ipRule, err := parseIP(ip)
  131. if err != nil {
  132. return nil, newError("invalid IP: ", ip).Base(err)
  133. }
  134. rule.Cidr = append(rule.Cidr, ipRule)
  135. }
  136. }
  137. if rawFieldRule.Port != nil {
  138. rule.PortRange = rawFieldRule.Port.Build()
  139. }
  140. if rawFieldRule.Network != nil {
  141. rule.NetworkList = rawFieldRule.Network.Build()
  142. }
  143. if rawFieldRule.SourceIP != nil {
  144. for _, ip := range *rawFieldRule.SourceIP {
  145. ipRule, err := parseIP(ip)
  146. if err != nil {
  147. return nil, newError("invalid IP: ", ip).Base(err)
  148. }
  149. rule.SourceCidr = append(rule.SourceCidr, ipRule)
  150. }
  151. }
  152. if rawFieldRule.User != nil {
  153. for _, s := range *rawFieldRule.User {
  154. rule.UserEmail = append(rule.UserEmail, s)
  155. }
  156. }
  157. if rawFieldRule.InboundTag != nil {
  158. for _, s := range *rawFieldRule.InboundTag {
  159. rule.InboundTag = append(rule.InboundTag, s)
  160. }
  161. }
  162. return rule, nil
  163. }
  164. func ParseRule(msg json.RawMessage) (*router.RoutingRule, error) {
  165. rawRule := new(RouterRule)
  166. err := json.Unmarshal(msg, rawRule)
  167. if err != nil {
  168. return nil, newError("invalid router rule").Base(err)
  169. }
  170. if rawRule.Type == "field" {
  171. fieldrule, err := parseFieldRule(msg)
  172. if err != nil {
  173. return nil, newError("invalid field rule").Base(err)
  174. }
  175. return fieldrule, nil
  176. }
  177. if rawRule.Type == "chinaip" {
  178. chinaiprule, err := parseChinaIPRule(msg)
  179. if err != nil {
  180. return nil, newError("invalid chinaip rule").Base(err)
  181. }
  182. return chinaiprule, nil
  183. }
  184. if rawRule.Type == "chinasites" {
  185. chinasitesrule, err := parseChinaSitesRule(msg)
  186. if err != nil {
  187. return nil, newError("invalid chinasites rule").Base(err)
  188. }
  189. return chinasitesrule, nil
  190. }
  191. return nil, newError("unknown router rule type: ", rawRule.Type)
  192. }
  193. func parseChinaIPRule(data []byte) (*router.RoutingRule, error) {
  194. rawRule := new(RouterRule)
  195. err := json.Unmarshal(data, rawRule)
  196. if err != nil {
  197. return nil, newError("invalid router rule").Base(err)
  198. }
  199. var chinaIPs geoip.CountryIPRange
  200. if err := proto.Unmarshal(geoip.ChinaIPs, &chinaIPs); err != nil {
  201. return nil, newError("invalid china ips").Base(err)
  202. }
  203. return &router.RoutingRule{
  204. Tag: rawRule.OutboundTag,
  205. Cidr: chinaIPs.Ips,
  206. }, nil
  207. }
  208. func parseChinaSitesRule(data []byte) (*router.RoutingRule, error) {
  209. rawRule := new(RouterRule)
  210. err := json.Unmarshal(data, rawRule)
  211. if err != nil {
  212. log.Trace(newError("invalid router rule: ", err).AtError())
  213. return nil, err
  214. }
  215. return &router.RoutingRule{
  216. Tag: rawRule.OutboundTag,
  217. Domain: chinaSitesDomains,
  218. }, nil
  219. }