优化白名单
This commit is contained in:
74
main.go
74
main.go
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user