@@ -164,8 +164,8 @@ type IPTables struct {
164
164
type Sniffer struct {
165
165
Enable bool
166
166
Sniffers map [snifferTypes.Type ]SNIFF.SnifferConfig
167
- ForceDomain * trie. DomainSet
168
- SkipDomain * trie. DomainSet
167
+ ForceDomain []C. Rule
168
+ SkipDomain []C. Rule
169
169
ForceDnsMapping bool
170
170
ParsePureIp bool
171
171
}
@@ -627,7 +627,7 @@ func ParseRawConfig(rawCfg *RawConfig) (*Config, error) {
627
627
}
628
628
}
629
629
630
- config .Sniffer , err = parseSniffer (rawCfg .Sniffer )
630
+ config .Sniffer , err = parseSniffer (rawCfg .Sniffer , rules , ruleProviders )
631
631
if err != nil {
632
632
return nil , err
633
633
}
@@ -1408,87 +1408,27 @@ func parseDNS(rawCfg *RawConfig, hosts *trie.DomainTrie[resolver.HostValue], rul
1408
1408
return nil , err
1409
1409
}
1410
1410
1411
- var host * trie.DomainTrie [struct {}]
1412
- var fakeIPRules []C.Rule
1413
- // fake ip skip host filter
1414
- if len (cfg .FakeIPFilter ) != 0 {
1415
- host = trie .New [struct {}]()
1416
- for _ , domain := range cfg .FakeIPFilter {
1417
- if strings .Contains (strings .ToLower (domain ), "," ) {
1418
- if strings .Contains (domain , "geosite:" ) {
1419
- subkeys := strings .Split (domain , ":" )
1420
- subkeys = subkeys [1 :]
1421
- subkeys = strings .Split (subkeys [0 ], "," )
1422
- for _ , country := range subkeys {
1423
- found := false
1424
- for _ , rule := range rules {
1425
- if rule .RuleType () == C .GEOSITE {
1426
- if strings .EqualFold (country , rule .Payload ()) {
1427
- found = true
1428
- fakeIPRules = append (fakeIPRules , rule )
1429
- }
1430
- }
1431
- }
1432
- if ! found {
1433
- rule , err := RC .NewGEOSITE (country , "" )
1434
- if err != nil {
1435
- return nil , err
1436
- }
1437
- fakeIPRules = append (fakeIPRules , rule )
1438
- }
1439
- }
1440
-
1441
- }
1442
- } else if strings .Contains (strings .ToLower (domain ), "rule-set:" ) {
1443
- subkeys := strings .Split (domain , ":" )
1444
- subkeys = subkeys [1 :]
1445
- subkeys = strings .Split (subkeys [0 ], "," )
1446
- for _ , domainSetName := range subkeys {
1447
- if rp , ok := ruleProviders [domainSetName ]; ! ok {
1448
- return nil , fmt .Errorf ("not found rule-set: %s" , domainSetName )
1449
- } else {
1450
- switch rp .Behavior () {
1451
- case providerTypes .IPCIDR :
1452
- return nil , fmt .Errorf ("rule provider type error, except domain,actual %s" , rp .Behavior ())
1453
- case providerTypes .Classical :
1454
- log .Warnln ("%s provider is %s, only matching it contain domain rule" , rp .Name (), rp .Behavior ())
1455
- default :
1456
- }
1457
- }
1458
- rule , err := RP .NewRuleSet (domainSetName , "" , true )
1459
- if err != nil {
1460
- return nil , err
1461
- }
1462
-
1463
- fakeIPRules = append (fakeIPRules , rule )
1464
- }
1465
- } else {
1466
- _ = host .Insert (domain , struct {}{})
1467
- }
1468
- }
1469
- }
1470
-
1411
+ var fakeIPTrie * trie.DomainTrie [struct {}]
1471
1412
if len (dnsCfg .Fallback ) != 0 {
1472
- if host == nil {
1473
- host = trie .New [struct {}]()
1474
- }
1413
+ fakeIPTrie = trie .New [struct {}]()
1475
1414
for _ , fb := range dnsCfg .Fallback {
1476
1415
if net .ParseIP (fb .Addr ) != nil {
1477
1416
continue
1478
1417
}
1479
- _ = host .Insert (fb .Addr , struct {}{})
1418
+ _ = fakeIPTrie .Insert (fb .Addr , struct {}{})
1480
1419
}
1481
1420
}
1482
1421
1483
- if host != nil {
1484
- host .Optimize ()
1422
+ // fake ip skip host filter
1423
+ host , err := parseDomain (cfg .FakeIPFilter , fakeIPTrie , rules , ruleProviders )
1424
+ if err != nil {
1425
+ return nil , err
1485
1426
}
1486
1427
1487
1428
pool , err := fakeip .New (fakeip.Options {
1488
1429
IPNet : fakeIPRange ,
1489
1430
Size : 1000 ,
1490
1431
Host : host ,
1491
- Rules : fakeIPRules ,
1492
1432
Persistence : rawCfg .Profile .StoreFakeIP ,
1493
1433
})
1494
1434
if err != nil {
@@ -1609,7 +1549,7 @@ func parseTuicServer(rawTuic RawTuicServer, general *General) error {
1609
1549
return nil
1610
1550
}
1611
1551
1612
- func parseSniffer (snifferRaw RawSniffer ) (* Sniffer , error ) {
1552
+ func parseSniffer (snifferRaw RawSniffer , rules []C. Rule , ruleProviders map [ string ]providerTypes. RuleProvider ) (* Sniffer , error ) {
1613
1553
sniffer := & Sniffer {
1614
1554
Enable : snifferRaw .Enable ,
1615
1555
ForceDnsMapping : snifferRaw .ForceDnsMapping ,
@@ -1672,23 +1612,83 @@ func parseSniffer(snifferRaw RawSniffer) (*Sniffer, error) {
1672
1612
1673
1613
sniffer .Sniffers = loadSniffer
1674
1614
1675
- forceDomainTrie := trie .New [struct {}]()
1676
- for _ , domain := range snifferRaw .ForceDomain {
1677
- err := forceDomainTrie .Insert (domain , struct {}{})
1678
- if err != nil {
1679
- return nil , fmt .Errorf ("error domian[%s] in force-domain, error:%v" , domain , err )
1680
- }
1615
+ forceDomain , err := parseDomain (snifferRaw .ForceDomain , nil , rules , ruleProviders )
1616
+ if err != nil {
1617
+ return nil , fmt .Errorf ("error in force-domain, error:%w" , err )
1681
1618
}
1682
- sniffer .ForceDomain = forceDomainTrie . NewDomainSet ()
1619
+ sniffer .ForceDomain = forceDomain
1683
1620
1684
- skipDomainTrie := trie .New [struct {}]()
1685
- for _ , domain := range snifferRaw .SkipDomain {
1686
- err := skipDomainTrie .Insert (domain , struct {}{})
1687
- if err != nil {
1688
- return nil , fmt .Errorf ("error domian[%s] in force-domain, error:%v" , domain , err )
1689
- }
1621
+ skipDomain , err := parseDomain (snifferRaw .SkipDomain , nil , rules , ruleProviders )
1622
+ if err != nil {
1623
+ return nil , fmt .Errorf ("error in skip-domain, error:%w" , err )
1690
1624
}
1691
- sniffer .SkipDomain = skipDomainTrie . NewDomainSet ()
1625
+ sniffer .SkipDomain = skipDomain
1692
1626
1693
1627
return sniffer , nil
1694
1628
}
1629
+
1630
+ func parseDomain (domains []string , domainTrie * trie.DomainTrie [struct {}], rules []C.Rule , ruleProviders map [string ]providerTypes.RuleProvider ) (domainRules []C.Rule , err error ) {
1631
+ var rule C.Rule
1632
+ for _ , domain := range domains {
1633
+ domainLower := strings .ToLower (domain )
1634
+ if strings .Contains (domainLower , "geosite:" ) {
1635
+ subkeys := strings .Split (domain , ":" )
1636
+ subkeys = subkeys [1 :]
1637
+ subkeys = strings .Split (subkeys [0 ], "," )
1638
+ for _ , country := range subkeys {
1639
+ found := false
1640
+ for _ , rule = range rules {
1641
+ if rule .RuleType () == C .GEOSITE {
1642
+ if strings .EqualFold (country , rule .Payload ()) {
1643
+ found = true
1644
+ domainRules = append (domainRules , rule )
1645
+ }
1646
+ }
1647
+ }
1648
+ if ! found {
1649
+ rule , err = RC .NewGEOSITE (country , "" )
1650
+ if err != nil {
1651
+ return nil , err
1652
+ }
1653
+ domainRules = append (domainRules , rule )
1654
+ }
1655
+ }
1656
+ } else if strings .Contains (domainLower , "rule-set:" ) {
1657
+ subkeys := strings .Split (domain , ":" )
1658
+ subkeys = subkeys [1 :]
1659
+ subkeys = strings .Split (subkeys [0 ], "," )
1660
+ for _ , domainSetName := range subkeys {
1661
+ if rp , ok := ruleProviders [domainSetName ]; ! ok {
1662
+ return nil , fmt .Errorf ("not found rule-set: %s" , domainSetName )
1663
+ } else {
1664
+ switch rp .Behavior () {
1665
+ case providerTypes .IPCIDR :
1666
+ return nil , fmt .Errorf ("rule provider type error, except domain,actual %s" , rp .Behavior ())
1667
+ case providerTypes .Classical :
1668
+ log .Warnln ("%s provider is %s, only matching it contain domain rule" , rp .Name (), rp .Behavior ())
1669
+ default :
1670
+ }
1671
+ }
1672
+ rule , err = RP .NewRuleSet (domainSetName , "" , true )
1673
+ if err != nil {
1674
+ return nil , err
1675
+ }
1676
+
1677
+ domainRules = append (domainRules , rule )
1678
+ }
1679
+ } else {
1680
+ if domainTrie == nil {
1681
+ domainTrie = trie .New [struct {}]()
1682
+ }
1683
+ err = domainTrie .Insert (domain , struct {}{})
1684
+ if err != nil {
1685
+ return nil , err
1686
+ }
1687
+ }
1688
+ }
1689
+ if ! domainTrie .IsEmpty () {
1690
+ rule = RP .NewDomainSet (domainTrie .NewDomainSet (), "" )
1691
+ domainRules = append (domainRules , rule )
1692
+ }
1693
+ return
1694
+ }
0 commit comments