router.go 6.0 KB

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