rule_dns.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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 NewDNSRule(router adapter.Router, logger log.ContextLogger, options option.DNSRule, checkServer bool) (adapter.DNSRule, 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.Server == "" && checkServer {
  16. return nil, E.New("missing server field")
  17. }
  18. return NewDefaultDNSRule(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.Server == "" && checkServer {
  24. return nil, E.New("missing server field")
  25. }
  26. return NewLogicalDNSRule(router, logger, options.LogicalOptions)
  27. default:
  28. return nil, E.New("unknown rule type: ", options.Type)
  29. }
  30. }
  31. var _ adapter.DNSRule = (*DefaultDNSRule)(nil)
  32. type DefaultDNSRule struct {
  33. abstractDefaultRule
  34. disableCache bool
  35. rewriteTTL *uint32
  36. }
  37. func NewDefaultDNSRule(router adapter.Router, logger log.ContextLogger, options option.DefaultDNSRule) (*DefaultDNSRule, error) {
  38. rule := &DefaultDNSRule{
  39. abstractDefaultRule: abstractDefaultRule{
  40. invert: options.Invert,
  41. outbound: options.Server,
  42. },
  43. disableCache: options.DisableCache,
  44. rewriteTTL: options.RewriteTTL,
  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.QueryType) > 0 {
  62. item := NewQueryTypeItem(options.QueryType)
  63. rule.items = append(rule.items, item)
  64. rule.allItems = append(rule.allItems, item)
  65. }
  66. if len(options.Network) > 0 {
  67. item := NewNetworkItem(options.Network)
  68. rule.items = append(rule.items, item)
  69. rule.allItems = append(rule.allItems, item)
  70. }
  71. if len(options.AuthUser) > 0 {
  72. item := NewAuthUserItem(options.AuthUser)
  73. rule.items = append(rule.items, item)
  74. rule.allItems = append(rule.allItems, item)
  75. }
  76. if len(options.Protocol) > 0 {
  77. item := NewProtocolItem(options.Protocol)
  78. rule.items = append(rule.items, item)
  79. rule.allItems = append(rule.allItems, item)
  80. }
  81. if len(options.Domain) > 0 || len(options.DomainSuffix) > 0 {
  82. item := NewDomainItem(options.Domain, options.DomainSuffix)
  83. rule.destinationAddressItems = append(rule.destinationAddressItems, item)
  84. rule.allItems = append(rule.allItems, item)
  85. }
  86. if len(options.DomainKeyword) > 0 {
  87. item := NewDomainKeywordItem(options.DomainKeyword)
  88. rule.destinationAddressItems = append(rule.destinationAddressItems, item)
  89. rule.allItems = append(rule.allItems, item)
  90. }
  91. if len(options.DomainRegex) > 0 {
  92. item, err := NewDomainRegexItem(options.DomainRegex)
  93. if err != nil {
  94. return nil, E.Cause(err, "domain_regex")
  95. }
  96. rule.destinationAddressItems = append(rule.destinationAddressItems, item)
  97. rule.allItems = append(rule.allItems, item)
  98. }
  99. if len(options.Geosite) > 0 {
  100. item := NewGeositeItem(router, logger, options.Geosite)
  101. rule.destinationAddressItems = append(rule.destinationAddressItems, item)
  102. rule.allItems = append(rule.allItems, item)
  103. }
  104. if len(options.SourceGeoIP) > 0 {
  105. item := NewGeoIPItem(router, logger, true, options.SourceGeoIP)
  106. rule.sourceAddressItems = append(rule.sourceAddressItems, 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.SourcePort) > 0 {
  118. item := NewPortItem(true, options.SourcePort)
  119. rule.sourcePortItems = append(rule.sourcePortItems, item)
  120. rule.allItems = append(rule.allItems, item)
  121. }
  122. if len(options.SourcePortRange) > 0 {
  123. item, err := NewPortRangeItem(true, options.SourcePortRange)
  124. if err != nil {
  125. return nil, E.Cause(err, "source_port_range")
  126. }
  127. rule.sourcePortItems = append(rule.sourcePortItems, item)
  128. rule.allItems = append(rule.allItems, item)
  129. }
  130. if len(options.Port) > 0 {
  131. item := NewPortItem(false, options.Port)
  132. rule.destinationPortItems = append(rule.destinationPortItems, item)
  133. rule.allItems = append(rule.allItems, item)
  134. }
  135. if len(options.PortRange) > 0 {
  136. item, err := NewPortRangeItem(false, options.PortRange)
  137. if err != nil {
  138. return nil, E.Cause(err, "port_range")
  139. }
  140. rule.destinationPortItems = append(rule.destinationPortItems, item)
  141. rule.allItems = append(rule.allItems, item)
  142. }
  143. if len(options.ProcessName) > 0 {
  144. item := NewProcessItem(options.ProcessName)
  145. rule.items = append(rule.items, item)
  146. rule.allItems = append(rule.allItems, item)
  147. }
  148. if len(options.ProcessPath) > 0 {
  149. item := NewProcessPathItem(options.ProcessPath)
  150. rule.items = append(rule.items, item)
  151. rule.allItems = append(rule.allItems, item)
  152. }
  153. if len(options.PackageName) > 0 {
  154. item := NewPackageNameItem(options.PackageName)
  155. rule.items = append(rule.items, item)
  156. rule.allItems = append(rule.allItems, item)
  157. }
  158. if len(options.User) > 0 {
  159. item := NewUserItem(options.User)
  160. rule.items = append(rule.items, item)
  161. rule.allItems = append(rule.allItems, item)
  162. }
  163. if len(options.UserID) > 0 {
  164. item := NewUserIDItem(options.UserID)
  165. rule.items = append(rule.items, item)
  166. rule.allItems = append(rule.allItems, item)
  167. }
  168. if len(options.Outbound) > 0 {
  169. item := NewOutboundRule(options.Outbound)
  170. rule.items = append(rule.items, item)
  171. rule.allItems = append(rule.allItems, item)
  172. }
  173. if options.ClashMode != "" {
  174. item := NewClashModeItem(router, options.ClashMode)
  175. rule.items = append(rule.items, item)
  176. rule.allItems = append(rule.allItems, item)
  177. }
  178. if len(options.WIFISSID) > 0 {
  179. item := NewWIFISSIDItem(router, options.WIFISSID)
  180. rule.items = append(rule.items, item)
  181. rule.allItems = append(rule.allItems, item)
  182. }
  183. if len(options.WIFIBSSID) > 0 {
  184. item := NewWIFIBSSIDItem(router, options.WIFIBSSID)
  185. rule.items = append(rule.items, item)
  186. rule.allItems = append(rule.allItems, item)
  187. }
  188. return rule, nil
  189. }
  190. func (r *DefaultDNSRule) DisableCache() bool {
  191. return r.disableCache
  192. }
  193. func (r *DefaultDNSRule) RewriteTTL() *uint32 {
  194. return r.rewriteTTL
  195. }
  196. var _ adapter.DNSRule = (*LogicalDNSRule)(nil)
  197. type LogicalDNSRule struct {
  198. abstractLogicalRule
  199. disableCache bool
  200. rewriteTTL *uint32
  201. }
  202. func NewLogicalDNSRule(router adapter.Router, logger log.ContextLogger, options option.LogicalDNSRule) (*LogicalDNSRule, error) {
  203. r := &LogicalDNSRule{
  204. abstractLogicalRule: abstractLogicalRule{
  205. rules: make([]adapter.Rule, len(options.Rules)),
  206. invert: options.Invert,
  207. outbound: options.Server,
  208. },
  209. disableCache: options.DisableCache,
  210. rewriteTTL: options.RewriteTTL,
  211. }
  212. switch options.Mode {
  213. case C.LogicalTypeAnd:
  214. r.mode = C.LogicalTypeAnd
  215. case C.LogicalTypeOr:
  216. r.mode = C.LogicalTypeOr
  217. default:
  218. return nil, E.New("unknown logical mode: ", options.Mode)
  219. }
  220. for i, subRule := range options.Rules {
  221. rule, err := NewDNSRule(router, logger, subRule, false)
  222. if err != nil {
  223. return nil, E.Cause(err, "sub rule[", i, "]")
  224. }
  225. r.rules[i] = rule
  226. }
  227. return r, nil
  228. }
  229. func (r *LogicalDNSRule) DisableCache() bool {
  230. return r.disableCache
  231. }
  232. func (r *LogicalDNSRule) RewriteTTL() *uint32 {
  233. return r.rewriteTTL
  234. }