rule_default.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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 len(options.IPCIDR) > 0 {
  118. item, err := NewIPCIDRItem(false, options.IPCIDR)
  119. if err != nil {
  120. return nil, E.Cause(err, "ipcidr")
  121. }
  122. rule.destinationAddressItems = append(rule.destinationAddressItems, item)
  123. rule.allItems = append(rule.allItems, item)
  124. }
  125. if len(options.SourcePort) > 0 {
  126. item := NewPortItem(true, options.SourcePort)
  127. rule.sourcePortItems = append(rule.sourcePortItems, item)
  128. rule.allItems = append(rule.allItems, item)
  129. }
  130. if len(options.SourcePortRange) > 0 {
  131. item, err := NewPortRangeItem(true, options.SourcePortRange)
  132. if err != nil {
  133. return nil, E.Cause(err, "source_port_range")
  134. }
  135. rule.sourcePortItems = append(rule.sourcePortItems, item)
  136. rule.allItems = append(rule.allItems, item)
  137. }
  138. if len(options.Port) > 0 {
  139. item := NewPortItem(false, options.Port)
  140. rule.destinationPortItems = append(rule.destinationPortItems, item)
  141. rule.allItems = append(rule.allItems, item)
  142. }
  143. if len(options.PortRange) > 0 {
  144. item, err := NewPortRangeItem(false, options.PortRange)
  145. if err != nil {
  146. return nil, E.Cause(err, "port_range")
  147. }
  148. rule.destinationPortItems = append(rule.destinationPortItems, item)
  149. rule.allItems = append(rule.allItems, item)
  150. }
  151. if len(options.ProcessName) > 0 {
  152. item := NewProcessItem(options.ProcessName)
  153. rule.items = append(rule.items, item)
  154. rule.allItems = append(rule.allItems, item)
  155. }
  156. if len(options.ProcessPath) > 0 {
  157. item := NewProcessPathItem(options.ProcessPath)
  158. rule.items = append(rule.items, item)
  159. rule.allItems = append(rule.allItems, item)
  160. }
  161. if len(options.PackageName) > 0 {
  162. item := NewPackageNameItem(options.PackageName)
  163. rule.items = append(rule.items, item)
  164. rule.allItems = append(rule.allItems, item)
  165. }
  166. if len(options.User) > 0 {
  167. item := NewUserItem(options.User)
  168. rule.items = append(rule.items, item)
  169. rule.allItems = append(rule.allItems, item)
  170. }
  171. if len(options.UserID) > 0 {
  172. item := NewUserIDItem(options.UserID)
  173. rule.items = append(rule.items, item)
  174. rule.allItems = append(rule.allItems, item)
  175. }
  176. if options.ClashMode != "" {
  177. item := NewClashModeItem(router, options.ClashMode)
  178. rule.items = append(rule.items, item)
  179. rule.allItems = append(rule.allItems, item)
  180. }
  181. if len(options.WIFISSID) > 0 {
  182. item := NewWIFISSIDItem(router, options.WIFISSID)
  183. rule.items = append(rule.items, item)
  184. rule.allItems = append(rule.allItems, item)
  185. }
  186. if len(options.WIFIBSSID) > 0 {
  187. item := NewWIFIBSSIDItem(router, options.WIFIBSSID)
  188. rule.items = append(rule.items, item)
  189. rule.allItems = append(rule.allItems, item)
  190. }
  191. if len(options.RuleSet) > 0 {
  192. item := NewRuleSetItem(router, options.RuleSet, options.RuleSetIPCIDRMatchSource)
  193. rule.items = append(rule.items, item)
  194. rule.allItems = append(rule.allItems, item)
  195. }
  196. return rule, nil
  197. }
  198. var _ adapter.Rule = (*LogicalRule)(nil)
  199. type LogicalRule struct {
  200. abstractLogicalRule
  201. }
  202. func NewLogicalRule(router adapter.Router, logger log.ContextLogger, options option.LogicalRule) (*LogicalRule, error) {
  203. r := &LogicalRule{
  204. abstractLogicalRule{
  205. rules: make([]adapter.HeadlessRule, len(options.Rules)),
  206. invert: options.Invert,
  207. outbound: options.Outbound,
  208. },
  209. }
  210. switch options.Mode {
  211. case C.LogicalTypeAnd:
  212. r.mode = C.LogicalTypeAnd
  213. case C.LogicalTypeOr:
  214. r.mode = C.LogicalTypeOr
  215. default:
  216. return nil, E.New("unknown logical mode: ", options.Mode)
  217. }
  218. for i, subRule := range options.Rules {
  219. rule, err := NewRule(router, logger, subRule, false)
  220. if err != nil {
  221. return nil, E.Cause(err, "sub rule[", i, "]")
  222. }
  223. r.rules[i] = rule
  224. }
  225. return r, nil
  226. }