From 48b2f27090aa44524dd8ed6e06e179a9730c7a1f Mon Sep 17 00:00:00 2001 From: Alex Yang Date: Sun, 30 Nov 2025 01:25:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BB=9F=E8=AE=A1=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.json | 55 +++++++++++++++++++++++- dns/server.go | 5 --- shield/manager.go | 105 +++++++++++++++++++++++++--------------------- 3 files changed, 111 insertions(+), 54 deletions(-) diff --git a/config.json b/config.json index a3bac99..4f3fff1 100644 --- a/config.json +++ b/config.json @@ -39,12 +39,63 @@ "name": "My GitHub Rules", "url": "https://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/rules/costomize.txt", "enabled": true, - "lastUpdateTime": "2025-11-28T16:13:05.960Z" + "lastUpdateTime": "2025-11-29T17:05:40.283Z" }, { "name": "CNList", "url": "https://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/list/china.list", - "enabled": false + "enabled": true + }, + { + "name": "大圣净化", + "url": "http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-Filters/raw/branch/main/hosts/dsjh.txt", + "enabled": true + }, + { + "name": "Hate \u0026 Junk", + "url": "http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/hate-and-junk-extended.txt", + "enabled": true + }, + { + "name": "My Gitlab Hosts", + "url": "http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/hosts/costomize.txt", + "enabled": true, + "lastUpdateTime": "2025-11-29T17:11:28.130Z" + }, + { + "name": "Anti Remote Requests", + "url": "http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/hosts/anti-remoterequests.txt", + "enabled": true + }, + { + "name": "URL-Based.txt", + "url": "http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/rules/url-based-adguard.txt", + "enabled": true + }, + { + "name": "My Gitlab A/T Rules", + "url": "http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/rules/ads-and-trackers.txt", + "enabled": true + }, + { + "name": "My Gitlab Malware List", + "url": "http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/rules/malware.txt", + "enabled": true + }, + { + "name": "hosts", + "url": "http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-Filters/raw/branch/main/hosts/costomize.txt", + "enabled": true + }, + { + "name": "AWAvenue-Ads-Rule", + "url": "http://gitea.amazehome.xyz/AMAZEHOME/hosts-and-Filters/raw/branch/main/rules/AWAvenue-Ads-Rule.txt", + "enabled": true + }, + { + "name": "诈骗域名", + "url": "https://gitea.amazehome.xyz/AMAZEHOME/hosts-and-filters/raw/branch/main/rules/cheat.txt", + "enabled": true } ], "updateInterval": 3600, diff --git a/dns/server.go b/dns/server.go index 142bc13..d8fb52f 100644 --- a/dns/server.go +++ b/dns/server.go @@ -366,11 +366,6 @@ func (s *Server) handleBlockedResponse(w dns.ResponseWriter, r *dns.Msg, domain // 更新被屏蔽域名统计 s.updateBlockedDomainStats(domain) - // 更新总体统计 - s.updateStats(func(stats *Stats) { - stats.Blocked++ - }) - response := new(dns.Msg) response.SetReply(r) response.RecursionAvailable = true diff --git a/shield/manager.go b/shield/manager.go index a700aaa..18c0463 100644 --- a/shield/manager.go +++ b/shield/manager.go @@ -36,46 +36,50 @@ type regexRule struct { // ShieldManager 屏蔽管理器 type ShieldManager struct { - config *config.ShieldConfig - domainRules map[string]bool - domainExceptions map[string]bool - domainRulesIsLocal map[string]bool // 标记域名规则是否为本地规则 - domainExceptionsIsLocal map[string]bool // 标记域名排除规则是否为本地规则 - domainRulesSource map[string]string // 标记域名规则来源 - domainExceptionsSource map[string]string // 标记域名排除规则来源 - regexRules []regexRule - regexExceptions []regexRule - hostsMap map[string]string - blockedDomainsCount map[string]int - resolvedDomainsCount map[string]int - rulesMutex sync.RWMutex - updateCtx context.Context - updateCancel context.CancelFunc - updateRunning bool - localRulesCount int // 本地规则数量 - remoteRulesCount int // 远程规则数量 + config *config.ShieldConfig + domainRules map[string]bool + domainExceptions map[string]bool + domainRulesIsLocal map[string]bool // 标记域名规则是否为本地规则 + domainExceptionsIsLocal map[string]bool // 标记域名排除规则是否为本地规则 + domainRulesSource map[string]string // 标记域名规则来源 + domainExceptionsSource map[string]string // 标记域名排除规则来源 + domainRulesOriginal map[string]string // 存储域名规则的原始字符串 + domainExceptionsOriginal map[string]string // 存储域名排除规则的原始字符串 + regexRules []regexRule + regexExceptions []regexRule + hostsMap map[string]string + blockedDomainsCount map[string]int + resolvedDomainsCount map[string]int + rulesMutex sync.RWMutex + updateCtx context.Context + updateCancel context.CancelFunc + updateRunning bool + localRulesCount int // 本地规则数量 + remoteRulesCount int // 远程规则数量 } // NewShieldManager 创建屏蔽管理器实例 func NewShieldManager(config *config.ShieldConfig) *ShieldManager { ctx, cancel := context.WithCancel(context.Background()) manager := &ShieldManager{ - config: config, - domainRules: make(map[string]bool), - domainExceptions: make(map[string]bool), - domainRulesIsLocal: make(map[string]bool), - domainExceptionsIsLocal: make(map[string]bool), - domainRulesSource: make(map[string]string), - domainExceptionsSource: make(map[string]string), - regexRules: []regexRule{}, - regexExceptions: []regexRule{}, - hostsMap: make(map[string]string), - blockedDomainsCount: make(map[string]int), - resolvedDomainsCount: make(map[string]int), - updateCtx: ctx, - updateCancel: cancel, - localRulesCount: 0, - remoteRulesCount: 0, + config: config, + domainRules: make(map[string]bool), + domainExceptions: make(map[string]bool), + domainRulesIsLocal: make(map[string]bool), + domainExceptionsIsLocal: make(map[string]bool), + domainRulesSource: make(map[string]string), + domainExceptionsSource: make(map[string]string), + domainRulesOriginal: make(map[string]string), + domainExceptionsOriginal: make(map[string]string), + regexRules: []regexRule{}, + regexExceptions: []regexRule{}, + hostsMap: make(map[string]string), + blockedDomainsCount: make(map[string]int), + resolvedDomainsCount: make(map[string]int), + updateCtx: ctx, + updateCancel: cancel, + localRulesCount: 0, + remoteRulesCount: 0, } // 加载已保存的计数数据 @@ -96,6 +100,8 @@ func (m *ShieldManager) LoadRules() error { m.domainExceptionsIsLocal = make(map[string]bool) m.domainRulesSource = make(map[string]string) m.domainExceptionsSource = make(map[string]string) + m.domainRulesOriginal = make(map[string]string) + m.domainExceptionsOriginal = make(map[string]string) m.regexRules = []regexRule{} m.regexExceptions = []regexRule{} m.hostsMap = make(map[string]string) @@ -333,6 +339,9 @@ func (m *ShieldManager) loadHosts() error { // parseRule 解析规则行 func (m *ShieldManager) parseRule(line string, isLocal bool, source string) { + // 保存原始规则用于后续使用 + originalLine := line + // 处理注释 if strings.HasPrefix(line, "!") || strings.HasPrefix(line, "#") || line == "" { return @@ -357,12 +366,12 @@ func (m *ShieldManager) parseRule(line string, isLocal bool, source string) { case strings.HasPrefix(line, "||") && strings.HasSuffix(line, "^"): // AdGuardHome域名规则格式: ||example.com^ domain := strings.TrimSuffix(strings.TrimPrefix(line, "||"), "^") - m.addDomainRule(domain, !isException, isLocal, source) + m.addDomainRule(domain, !isException, isLocal, source, originalLine) case strings.HasPrefix(line, "||"): // 精确域名匹配规则 domain := strings.TrimPrefix(line, "||") - m.addDomainRule(domain, !isException, isLocal, source) + m.addDomainRule(domain, !isException, isLocal, source, originalLine) case strings.HasPrefix(line, "*"): // 通配符规则,转换为正则表达式 @@ -370,7 +379,7 @@ func (m *ShieldManager) parseRule(line string, isLocal bool, source string) { pattern = "^" + pattern + "$" if re, err := regexp.Compile(pattern); err == nil { // 保存原始规则字符串 - m.addRegexRule(re, line, !isException, isLocal, source) + m.addRegexRule(re, originalLine, !isException, isLocal, source) } case strings.HasPrefix(line, "/") && strings.HasSuffix(line, "/"): @@ -380,7 +389,7 @@ func (m *ShieldManager) parseRule(line string, isLocal bool, source string) { // 对于像 /domain/ 这样的规则,应该匹配包含 domain 字符串的任何域名 if re, err := regexp.Compile("(?i).*" + regexp.QuoteMeta(pattern) + ".*"); err == nil { // 保存原始规则字符串 - m.addRegexRule(re, line, !isException, isLocal, source) + m.addRegexRule(re, originalLine, !isException, isLocal, source) } case strings.HasPrefix(line, "|") && strings.HasSuffix(line, "|"): @@ -389,7 +398,7 @@ func (m *ShieldManager) parseRule(line string, isLocal bool, source string) { // 将URL模式转换为正则表达式 pattern := "^" + regexp.QuoteMeta(urlPattern) + "$" if re, err := regexp.Compile(pattern); err == nil { - m.addRegexRule(re, line, !isException, isLocal, source) + m.addRegexRule(re, originalLine, !isException, isLocal, source) } case strings.HasPrefix(line, "|"): @@ -397,7 +406,7 @@ func (m *ShieldManager) parseRule(line string, isLocal bool, source string) { urlPattern := strings.TrimPrefix(line, "|") pattern := "^" + regexp.QuoteMeta(urlPattern) if re, err := regexp.Compile(pattern); err == nil { - m.addRegexRule(re, line, !isException, isLocal, source) + m.addRegexRule(re, originalLine, !isException, isLocal, source) } case strings.HasSuffix(line, "|"): @@ -405,12 +414,12 @@ func (m *ShieldManager) parseRule(line string, isLocal bool, source string) { urlPattern := strings.TrimSuffix(line, "|") pattern := regexp.QuoteMeta(urlPattern) + "$" if re, err := regexp.Compile(pattern); err == nil { - m.addRegexRule(re, line, !isException, isLocal, source) + m.addRegexRule(re, originalLine, !isException, isLocal, source) } default: // 默认作为普通域名规则 - m.addDomainRule(line, !isException, isLocal, source) + m.addDomainRule(line, !isException, isLocal, source, originalLine) } } @@ -434,7 +443,7 @@ func (m *ShieldManager) parseRuleOptions(optionsStr string) map[string]string { } // addDomainRule 添加域名规则,支持是否为阻止规则 -func (m *ShieldManager) addDomainRule(domain string, block bool, isLocal bool, source string) { +func (m *ShieldManager) addDomainRule(domain string, block bool, isLocal bool, source string, original string) { if block { // 如果是远程规则,检查是否已经存在本地规则,如果存在则不覆盖 if !isLocal { @@ -446,6 +455,7 @@ func (m *ShieldManager) addDomainRule(domain string, block bool, isLocal bool, s m.domainRules[domain] = true m.domainRulesIsLocal[domain] = isLocal m.domainRulesSource[domain] = source + m.domainRulesOriginal[domain] = original } else { // 添加到排除规则 // 如果是远程规则,检查是否已经存在本地规则,如果存在则不覆盖 @@ -458,6 +468,7 @@ func (m *ShieldManager) addDomainRule(domain string, block bool, isLocal bool, s m.domainExceptions[domain] = true m.domainExceptionsIsLocal[domain] = isLocal m.domainExceptionsSource[domain] = source + m.domainExceptionsOriginal[domain] = original } } @@ -529,7 +540,7 @@ func (m *ShieldManager) CheckDomainBlockDetails(domain string) map[string]interf // 检查域名排除规则 if m.domainExceptions[domain] { result["excluded"] = true - result["excludeRule"] = domain + result["excludeRule"] = m.domainExceptionsOriginal[domain] result["excludeRuleType"] = "exact_domain" result["blocksource"] = m.domainExceptionsSource[domain] return result @@ -541,7 +552,7 @@ func (m *ShieldManager) CheckDomainBlockDetails(domain string) map[string]interf subdomain := strings.Join(parts[i:], ".") if m.domainExceptions[subdomain] { result["excluded"] = true - result["excludeRule"] = subdomain + result["excludeRule"] = m.domainExceptionsOriginal[subdomain] result["excludeRuleType"] = "subdomain" result["blocksource"] = m.domainExceptionsSource[subdomain] return result @@ -563,7 +574,7 @@ func (m *ShieldManager) CheckDomainBlockDetails(domain string) map[string]interf // 检查精确域名匹配 if m.domainRules[domain] { result["blocked"] = true - result["blockRule"] = domain + result["blockRule"] = m.domainRulesOriginal[domain] result["blockRuleType"] = "exact_domain" result["blocksource"] = m.domainRulesSource[domain] return result @@ -575,7 +586,7 @@ func (m *ShieldManager) CheckDomainBlockDetails(domain string) map[string]interf subdomain := strings.Join(parts[i:], ".") if m.domainRules[subdomain] { result["blocked"] = true - result["blockRule"] = subdomain + result["blockRule"] = m.domainRulesOriginal[subdomain] result["blockRuleType"] = "subdomain" result["blocksource"] = m.domainRulesSource[subdomain] return result