优化白名单

This commit is contained in:
2025-07-09 16:15:04 +08:00
parent 851b643374
commit de72ee1100
9 changed files with 155 additions and 32 deletions

74
main.go
View File

@@ -17,6 +17,8 @@ import (
"time"
)
var BuildDate = "unknown" // 由编译时注入
func init() {
// 强制使用 Go 的纯用户态 DNS 解析器
net.DefaultResolver = &net.Resolver{
@@ -45,6 +47,7 @@ var (
ProcessedIPMap = map[string]time.Time{} // 使用 map 存储已处理的 IP
ProcessedMutex sync.Mutex // 互斥锁保护 ProcessedIPMap
)
// 启动子进程
@@ -209,7 +212,8 @@ func loadFromFile(filePath string, logMessage string) error {
oldTemp := make(map[string]string)
if err := decoder.Decode(&oldTemp); err == nil {
for ip := range oldTemp {
ProcessedIPMap[ip] = time.Now() // 给旧 IP 打个当前时间戳
//ProcessedIPMap[ip] = time.Now() // 给旧 IP 打个当前时间戳
ProcessedIPMap[ip] = time.Date(1971, 1, 1, 0, 0, 0, 0, time.UTC) // 标记为永不过期
}
log.Println(logMessage + "(从旧格式转换)")
return nil
@@ -219,18 +223,14 @@ func loadFromFile(filePath string, logMessage string) error {
}
func InitMap() {
if err := loadFromFile("cn.json", "Map 已成功从文件加载"); err != nil {
log.Fatalf("加载 Map 失败: %v", err)
}
if err := loadFromFile("white.json", "白名单 Map 已成功从文件加载!!!"); err != nil {
log.Fatalf("加载 Map 失败: %v", err)
if err := loadFromFile("cn.json", " Map 已成功从文件加载"); err != nil {
log.Fatalf(" 加载 Map 失败: %v", err)
}
defer func() {
// 程序退出时保存数据
if err := saveMapToFile("cn.json"); err != nil {
log.Printf("保存 Map 失败: %v", err)
log.Printf(" 保存 Map 失败: %v", err)
}
}()
@@ -242,9 +242,11 @@ func WriteLocalAddr() {
if local_ipv4_addr != "NULL" {
//log.Printf("\033[33m %s 本机地址 \033[0m\n", ipStr)
ProcessedMutex.Lock()
ProcessedIPMap[local_ipv4_addr] = time.Now()
//ProcessedIPMap[local_ipv4_addr] = time.Now()
ProcessedIPMap[local_ipv4_addr] = time.Date(1971, 1, 1, 0, 0, 0, 0, time.UTC) // 标记为永不过期
ProcessedMutex.Unlock()
}
// 写入json文件
if err := saveMapToFile("cn.json"); err != nil {
log.Printf("实时保存 Map 失败: %v", err)
@@ -256,6 +258,8 @@ func RunMainProcess() { // 主进程逻辑
fmt.Println("主进程启动...")
WriteLocalAddr() // 将本机外网地址加入到已处理集合中
cmd, err := StartChildProcess()
if err != nil {
log.Fatalf("子进程启动失败: %v", err)
@@ -280,8 +284,6 @@ func RunMainProcess() { // 主进程逻辑
ipStr := e1.Value.(net.IP).String()
region, _ := ip2region(ipStr) // 离线库初步判断地域
WriteLocalAddr() // 将本机外网地址加入到已处理集合中
ProcessedMutex.Lock()
_, processed := ProcessedIPMap[ipStr] // 检查是否已处理
ProcessedMutex.Unlock()
@@ -292,6 +294,23 @@ func RunMainProcess() { // 主进程逻辑
goto next
}
// 检查是否在白名单中
if _, ip_ := whiteList[ipStr]; ip_ {
log.Printf("\033[33m %s 跳过白名单, 跳过!!! \033[0m\n", ipStr)
IpList.Remove(e1)
setName, err := RemoveIPIfInSets("root", MAX_IPSET_NAME, ipStr)
if err != nil {
log.Printf(" %s 删除 IP 出错: %v\n", ipStr, err)
} else if setName != "" {
log.Printf(" %s 已从 %s 中移除 \n", ipStr, setName)
} else {
log.Printf(" %s 不在任何 IPSet 中,无需移除\n", ipStr)
}
goto next
}
if Is_Ip_Ipset(ipStr) != 0 { // IP 不在 ipset 集合中
if !strings.Contains(region, "中国") && !strings.Contains(region, "内网") { // 离线库判断不在中国内
@@ -356,6 +375,11 @@ func RunMainProcess() { // 主进程逻辑
// 遍历 ProcessedIPMap检查每个 IP 的记录是否已超过 24 小时
for ip, t := range ProcessedIPMap {
if t.Year() == 1971 {
continue // 不清理标记为“永不过期”的 IP
}
// 如果当前时间减去记录时间大于 1 小时,则删除该条目
if now.Sub(t) > 30*time.Minute {
delete(ProcessedIPMap, ip)
@@ -366,7 +390,17 @@ func RunMainProcess() { // 主进程逻辑
ProcessedMutex.Unlock()
// 打印日志,表示本次清理已完成
log.Println("已清理过期 ProcessedIPMap 项")
log.Println(" 已清理过期 ProcessedIPMap 项")
}
}()
// 定时重新加载白名单
go func() {
for {
time.Sleep(1 * time.Minute) // 每 10 分钟自动刷新
if err := LoadWhiteList("whitelist.txt"); err != nil {
log.Printf(" 刷新白名单失败: %v", err)
}
}
}()
@@ -414,10 +448,10 @@ func HandleCmd() {
if help {
fmt.Printf(
"\t\tDenyip firewall\n" +
"\tVersion 0.2\n" +
"\tE-mail: aixiao@aixiao.me\n" +
"\tDate: 20250102\n")
"\t\tDenyip firewall\n"+
"\tVersion 0.2\n"+
"\tE-mail: aixiao@aixiao.me\n"+
"\tBuild Date: %s\n", BuildDate)
flag.Usage()
fmt.Printf("\n")
@@ -465,6 +499,14 @@ func main() {
embed_ip2region()
// 加载白名单
err := LoadWhiteList("whitelist.txt")
if err != nil {
log.Fatalf(" whiteList Map 加载白名单失败: %v", err)
} else {
log.Println(" whiteList Map 白名单加载成功")
}
// 守护进程模式
if *daemon {
StartDaemon()