更新Web文件
This commit is contained in:
@@ -25,19 +25,21 @@ type BlockedDomain struct {
|
||||
|
||||
// Server DNS服务器
|
||||
type Server struct {
|
||||
config *config.DNSConfig
|
||||
shieldConfig *config.ShieldConfig
|
||||
shieldManager *shield.ShieldManager
|
||||
server *dns.Server
|
||||
resolver *dns.Client
|
||||
ctx context.Context
|
||||
cancel context.CancelFunc
|
||||
statsMutex sync.Mutex
|
||||
stats *Stats
|
||||
blockedDomainsMutex sync.RWMutex
|
||||
blockedDomains map[string]*BlockedDomain
|
||||
hourlyStatsMutex sync.RWMutex
|
||||
hourlyStats map[string]int64 // 按小时统计屏蔽数量
|
||||
config *config.DNSConfig
|
||||
shieldConfig *config.ShieldConfig
|
||||
shieldManager *shield.ShieldManager
|
||||
server *dns.Server
|
||||
resolver *dns.Client
|
||||
ctx context.Context
|
||||
cancel context.CancelFunc
|
||||
statsMutex sync.Mutex
|
||||
stats *Stats
|
||||
blockedDomainsMutex sync.RWMutex
|
||||
blockedDomains map[string]*BlockedDomain
|
||||
resolvedDomainsMutex sync.RWMutex
|
||||
resolvedDomains map[string]*BlockedDomain // 用于记录解析的域名
|
||||
hourlyStatsMutex sync.RWMutex
|
||||
hourlyStats map[string]int64 // 按小时统计屏蔽数量
|
||||
}
|
||||
|
||||
// Stats DNS服务器统计信息
|
||||
@@ -68,8 +70,9 @@ func NewServer(config *config.DNSConfig, shieldConfig *config.ShieldConfig, shie
|
||||
Allowed: 0,
|
||||
Errors: 0,
|
||||
},
|
||||
blockedDomains: make(map[string]*BlockedDomain),
|
||||
hourlyStats: make(map[string]int64),
|
||||
blockedDomains: make(map[string]*BlockedDomain),
|
||||
resolvedDomains: make(map[string]*BlockedDomain),
|
||||
hourlyStats: make(map[string]int64),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -184,6 +187,16 @@ func (s *Server) handleHostsResponse(w dns.ResponseWriter, r *dns.Msg, ip string
|
||||
response.Answer = append(response.Answer, answer)
|
||||
}
|
||||
|
||||
// 记录解析域名统计
|
||||
domain := ""
|
||||
if len(r.Question) > 0 {
|
||||
domain = r.Question[0].Name
|
||||
if len(domain) > 0 && domain[len(domain)-1] == '.' {
|
||||
domain = domain[:len(domain)-1]
|
||||
}
|
||||
s.updateResolvedDomainStats(domain)
|
||||
}
|
||||
|
||||
w.WriteMsg(response)
|
||||
s.updateStats(func(stats *Stats) {
|
||||
stats.Allowed++
|
||||
@@ -272,6 +285,9 @@ func (s *Server) forwardDNSRequest(w dns.ResponseWriter, r *dns.Msg, domain stri
|
||||
w.WriteMsg(response)
|
||||
logger.Debug("DNS查询成功", "domain", domain, "rtt", rtt, "server", upstream)
|
||||
|
||||
// 记录解析域名统计
|
||||
s.updateResolvedDomainStats(domain)
|
||||
|
||||
s.updateStats(func(stats *Stats) {
|
||||
stats.Allowed++
|
||||
})
|
||||
@@ -311,7 +327,26 @@ func (s *Server) updateBlockedDomainStats(domain string) {
|
||||
|
||||
// 更新小时统计
|
||||
hourKey := time.Now().Format("2006-01-02-15")
|
||||
s.hourlyStatsMutex.Lock()
|
||||
s.hourlyStats[hourKey]++
|
||||
s.hourlyStatsMutex.Unlock()
|
||||
}
|
||||
|
||||
// updateResolvedDomainStats 更新解析域名统计
|
||||
func (s *Server) updateResolvedDomainStats(domain string) {
|
||||
s.resolvedDomainsMutex.Lock()
|
||||
defer s.resolvedDomainsMutex.Unlock()
|
||||
|
||||
if entry, exists := s.resolvedDomains[domain]; exists {
|
||||
entry.Count++
|
||||
entry.LastSeen = time.Now()
|
||||
} else {
|
||||
s.resolvedDomains[domain] = &BlockedDomain{
|
||||
Domain: domain,
|
||||
Count: 1,
|
||||
LastSeen: time.Now(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// updateStats 更新统计信息
|
||||
@@ -359,6 +394,29 @@ func (s *Server) GetTopBlockedDomains(limit int) []BlockedDomain {
|
||||
return domains
|
||||
}
|
||||
|
||||
// GetTopResolvedDomains 获取TOP解析域名
|
||||
func (s *Server) GetTopResolvedDomains(limit int) []BlockedDomain {
|
||||
s.resolvedDomainsMutex.RLock()
|
||||
defer s.resolvedDomainsMutex.RUnlock()
|
||||
|
||||
// 转换为切片
|
||||
domains := make([]BlockedDomain, 0, len(s.resolvedDomains))
|
||||
for _, entry := range s.resolvedDomains {
|
||||
domains = append(domains, *entry)
|
||||
}
|
||||
|
||||
// 按数量排序
|
||||
sort.Slice(domains, func(i, j int) bool {
|
||||
return domains[i].Count > domains[j].Count
|
||||
})
|
||||
|
||||
// 返回限制数量
|
||||
if len(domains) > limit {
|
||||
return domains[:limit]
|
||||
}
|
||||
return domains
|
||||
}
|
||||
|
||||
// GetRecentBlockedDomains 获取最近屏蔽的域名列表
|
||||
func (s *Server) GetRecentBlockedDomains(limit int) []BlockedDomain {
|
||||
s.blockedDomainsMutex.RLock()
|
||||
|
||||
Reference in New Issue
Block a user