rule_default.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. package route
  2. import (
  3. "github.com/sagernet/sing-box/adapter"
  4. C "github.com/sagernet/sing-box/constant"
  5. "github.com/sagernet/sing-box/log"
  6. "github.com/sagernet/sing-box/option"
  7. E "github.com/sagernet/sing/common/exceptions"
  8. )
  9. func NewRule(router adapter.Router, logger log.ContextLogger, options option.Rule, checkOutbound bool) (adapter.Rule, error) {
  10. switch options.Type {
  11. case "", C.RuleTypeDefault:
  12. if !options.DefaultOptions.IsValid() {
  13. return nil, E.New("missing conditions")
  14. }
  15. if options.DefaultOptions.Outbound == "" && checkOutbound {
  16. return nil, E.New("missing outbound field")
  17. }
  18. return NewDefaultRule(router, logger, options.DefaultOptions)
  19. case C.RuleTypeLogical:
  20. if !options.LogicalOptions.IsValid() {
  21. return nil, E.New("missing conditions")
  22. }
  23. if options.LogicalOptions.Outbound == "" && checkOutbound {
  24. return nil, E.New("missing outbound field")
  25. }
  26. return NewLogicalRule(router, logger, options.LogicalOptions)
  27. default:
  28. return nil, E.New("unknown rule type: ", options.Type)
  29. }
  30. }
  31. var _ adapter.Rule = (*DefaultRule)(nil)
  32. type DefaultRule struct {
  33. abstractDefaultRule
  34. }
  35. type RuleItem interface {
  36. Match(metadata *adapter.InboundContext) bool
  37. String() string
  38. }
  39. func NewDefaultRule(router adapter.Router, logger log.ContextLogger, options option.DefaultRule) (*DefaultRule, error) {
  40. rule := &DefaultRule{
  41. abstractDefaultRule{
  42. invert: options.Invert,
  43. outbound: options.Outbound,
  44. },
  45. }
  46. if len(options.Inbound) > 0 {
  47. item := NewInboundRule(options.Inbound)
  48. rule.items = append(rule.items, item)
  49. rule.allItems = append(rule.allItems, item)
  50. }
  51. if options.IPVersion > 0 {
  52. switch options.IPVersion {
  53. case 4, 6:
  54. item := NewIPVersionItem(options.IPVersion == 6)
  55. rule.items = append(rule.items, item)
  56. rule.allItems = append(rule.allItems, item)
  57. default:
  58. return nil, E.New("invalid ip version: ", options.IPVersion)
  59. }
  60. }
  61. if len(options.Network) > 0 {
  62. item := NewNetworkItem(options.Network)
  63. rule.items = append(rule.items, item)
  64. rule.allItems = append(rule.allItems, item)
  65. }
  66. if len(options.AuthUser) > 0 {
  67. item := NewAuthUserItem(options.AuthUser)
  68. rule.items = append(rule.items, item)
  69. rule.allItems = append(rule.allItems, item)
  70. }
  71. if len(options.Protocol) > 0 {
  72. item := NewProtocolItem(options.Protocol)
  73. rule.items = append(rule.items, item)
  74. rule.allItems = append(rule.allItems, item)
  75. }
  76. if len(options.Domain) > 0 || len(options.DomainSuffix) > 0 {
  77. item := NewDomainItem(options.Domain, options.DomainSuffix)
  78. rule.destinationAddressItems = append(rule.destinationAddressItems, item)
  79. rule.allItems = append(rule.allItems, item)
  80. }
  81. if len(options.DomainKeyword) > 0 {
  82. item := NewDomainKeywordItem(options.DomainKeyword)
  83. rule.destinationAddressItems = append(rule.destinationAddressItems, item)
  84. rule.allItems = append(rule.allItems, item)
  85. }
  86. if len(options.DomainRegex) > 0 {
  87. item, err := NewDomainRegexItem(options.DomainRegex)
  88. if err != nil {
  89. return nil, E.Cause(err, "domain_regex")
  90. }
  91. rule.destinationAddressItems = append(rule.destinationAddressItems, item)
  92. rule.allItems = append(rule.allItems, item)
  93. }
  94. if len(options.Geosite) > 0 {
  95. item := NewGeositeItem(router, logger, options.Geosite)
  96. rule.destinationAddressItems = append(rule.destinationAddressItems, item)
  97. rule.allItems = append(rule.allItems, item)
  98. }
  99. if len(options.SourceGeoIP) > 0 {
  100. item := NewGeoIPItem(router, logger, true, options.SourceGeoIP)
  101. rule.sourceAddressItems = append(rule.sourceAddressItems, item)
  102. rule.allItems = append(rule.allItems, item)
  103. }
  104. if len(options.GeoIP) > 0 {
  105. item := NewGeoIPItem(router, logger, false, options.GeoIP)
  106. rule.destinationAddressItems = append(rule.destinationAddressItems, item)
  107. rule.allItems = append(rule.allItems, item)
  108. }
  109. if len(options.SourceIPCIDR) > 0 {
  110. item, err := NewIPCIDRItem(true, options.SourceIPCIDR)
  111. if err != nil {
  112. return nil, E.Cause(err, "source_ipcidr")
  113. }
  114. rule.sourceAddressItems = append(rule.sourceAddressItems, item)
  115. rule.allItems = append(rule.allItems, item)
  116. }
  117. if options.SourceIPIsPrivate {
  118. item := NewIPIsPrivateItem(true)
  119. rule.sourceAddressItems = append(rule.sourceAddressItems, item)
  120. rule.allItems = append(rule.allItems, item)
  121. }
  122. if len(options.IPCIDR) > 0 {
  123. item, err := NewIPCIDRItem(false, options.IPCIDR)
  124. if err != nil {
  125. return nil, E.Cause(err, "ipcidr")
  126. }
  127. rule.destinationAddressItems = append(rule.destinationAddressItems, item)
  128. rule.allItems = append(rule.allItems, item)
  129. }
  130. if options.IPIsPrivate {
  131. item := NewIPIsPrivateItem(false)
  132. rule.destinationAddressItems = append(rule.destinationAddressItems, item)
  133. rule.allItems = append(rule.allItems, item)
  134. }
  135. if len(options.SourcePort) > 0 {
  136. item := NewPortItem(true, options.SourcePort)
  137. rule.sourcePortItems = append(rule.sourcePortItems, item)
  138. rule.allItems = append(rule.allItems, item)
  139. }
  140. if len(options.SourcePortRange) > 0 {
  141. item, err := NewPortRangeItem(true, options.SourcePortRange)
  142. if err != nil {
  143. return nil, E.Cause(err, "source_port_range")
  144. }
  145. rule.sourcePortItems = append(rule.sourcePortItems, item)
  146. rule.allItems = append(rule.allItems, item)
  147. }
  148. if len(options.Port) > 0 {
  149. item := NewPortItem(false, options.Port)
  150. rule.destinationPortItems = append(rule.destinationPortItems, item)
  151. rule.allItems = append(rule.allItems, item)
  152. }
  153. if len(options.PortRange) > 0 {
  154. item, err := NewPortRangeItem(false, options.PortRange)
  155. if err != nil {
  156. return nil, E.Cause(err, "port_range")
  157. }
  158. rule.destinationPortItems = append(rule.destinationPortItems, item)
  159. rule.allItems = append(rule.allItems, item)
  160. }
  161. if len(options.ProcessName) > 0 {
  162. item := NewProcessItem(options.ProcessName)
  163. rule.items = append(rule.items, item)
  164. rule.allItems = append(rule.allItems, item)
  165. }
  166. if len(options.ProcessPath) > 0 {
  167. item := NewProcessPathItem(options.ProcessPath)
  168. rule.items = append(rule.items, item)
  169. rule.allItems = append(rule.allItems, item)
  170. }
  171. if len(options.PackageName) > 0 {
  172. item := NewPackageNameItem(options.PackageName)
  173. rule.items = append(rule.items, item)
  174. rule.allItems = append(rule.allItems, item)
  175. }
  176. if len(options.User) > 0 {
  177. item := NewUserItem(options.User)
  178. rule.items = append(rule.items, item)
  179. rule.allItems = append(rule.allItems, item)
  180. }
  181. if len(options.UserID) > 0 {
  182. item := NewUserIDItem(options.UserID)
  183. rule.items = append(rule.items, item)
  184. rule.allItems = append(rule.allItems, item)
  185. }
  186. if options.ClashMode != "" {
  187. item := NewClashModeItem(router, options.ClashMode)
  188. rule.items = append(rule.items, item)
  189. rule.allItems = append(rule.allItems, item)
  190. }
  191. if len(options.WIFISSID) > 0 {
  192. item := NewWIFISSIDItem(router, options.WIFISSID)
  193. rule.items = append(rule.items, item)
  194. rule.allItems = append(rule.allItems, item)
  195. }
  196. if len(options.WIFIBSSID) > 0 {
  197. item := NewWIFIBSSIDItem(router, options.WIFIBSSID)
  198. rule.items = append(rule.items, item)
  199. rule.allItems = append(rule.allItems, item)
  200. }
  201. if len(options.RuleSet) > 0 {
  202. item := NewRuleSetItem(router, options.RuleSet, options.RuleSetIPCIDRMatchSource)
  203. rule.items = append(rule.items, item)
  204. rule.allItems = append(rule.allItems, item)
  205. }
  206. return rule, nil
  207. }
  208. var _ adapter.Rule = (*LogicalRule)(nil)
  209. type LogicalRule struct {
  210. abstractLogicalRule
  211. }
  212. func NewLogicalRule(router adapter.Router, logger log.ContextLogger, options option.LogicalRule) (*LogicalRule, error) {
  213. r := &LogicalRule{
  214. abstractLogicalRule{
  215. rules: make([]adapter.HeadlessRule, len(options.Rules)),
  216. invert: options.Invert,
  217. outbound: options.Outbound,
  218. },
  219. }
  220. switch options.Mode {
  221. case C.LogicalTypeAnd:
  222. r.mode = C.LogicalTypeAnd
  223. case C.LogicalTypeOr:
  224. r.mode = C.LogicalTypeOr
  225. default:
  226. return nil, E.New("unknown logical mode: ", options.Mode)
  227. }
  228. for i, subRule := range options.Rules {
  229. rule, err := NewRule(router, logger, subRule, false)
  230. if err != nil {
  231. return nil, E.Cause(err, "sub rule[", i, "]")
  232. }
  233. r.rules[i] = rule
  234. }
  235. return r, nil
  236. }