This commit is contained in:
sushen339
2025-11-18 03:52:41 +08:00
parent 2be372acb6
commit ad9fb9fe67
+10 -9
View File
@@ -199,9 +199,6 @@ $RAW_V6"
} }
}') }')
IP_LIST=$(echo "$CLEAN_DATA" | awk '{print $1}')
IP_V4_LIST=$(echo "$IP_LIST" | grep -v ':' || true)
IP_V6_LIST=$(echo "$IP_LIST" | grep ':' || true)
NFT_COUNT=0 NFT_COUNT=0
[ -n "$CLEAN_DATA" ] && NFT_COUNT=$(echo "$CLEAN_DATA" | awk 'NF>0' | wc -l) [ -n "$CLEAN_DATA" ] && NFT_COUNT=$(echo "$CLEAN_DATA" | awk 'NF>0' | wc -l)
if [ -f "$PERSIST_FILE" ]; then LOCAL_COUNT=$(wc -l < "$PERSIST_FILE"); else LOCAL_COUNT=0; fi if [ -f "$PERSIST_FILE" ]; then LOCAL_COUNT=$(wc -l < "$PERSIST_FILE"); else LOCAL_COUNT=0; fi
@@ -226,9 +223,13 @@ $RAW_V6"
# 智能IP段聚合统计 # 智能IP段聚合统计
msg "$C_CYAN" "=== 📊 攻击源聚合统计 (自动识别 IP 段) ===" msg "$C_CYAN" "=== 📊 攻击源聚合统计 (自动识别 IP 段) ==="
if [ "$NFT_COUNT" -gt 0 ]; then if [ -f "$PERSIST_FILE" ] && [ -s "$PERSIST_FILE" ]; then
# 从文件提取IPv4地址(去除国家代码)
FILE_V4_LIST=$(awk -F'|' '!/:|^$/ {print $1}' "$PERSIST_FILE")
FILE_V6_LIST=$(awk -F'|' '/:/ {print $1}' "$PERSIST_FILE")
V6_COUNT=0 V6_COUNT=0
[ -n "$IP_V6_LIST" ] && V6_COUNT=$(echo "$IP_V6_LIST" | awk 'NF>0' | wc -l) [ -n "$FILE_V6_LIST" ] && V6_COUNT=$(echo "$FILE_V6_LIST" | wc -l)
HAS_OUTPUT=0 HAS_OUTPUT=0
# 收集聚合数据 # 收集聚合数据
@@ -236,11 +237,11 @@ $RAW_V6"
: > "$TEMP_AGG_FILE" : > "$TEMP_AGG_FILE"
# 收集 /24 聚合 # 收集 /24 聚合
echo "$IP_V4_LIST" | cut -d. -f1-3 | sort | uniq -c | awk '$1>=2 {split($2,a,"."); printf "%d|%s|24|%s\n", $1, $2, a[1]}' >> "$TEMP_AGG_FILE" echo "$FILE_V4_LIST" | cut -d. -f1-3 | sort | uniq -c | awk '$1>=2 {split($2,a,"."); printf "%d|%s|24|%s\n", $1, $2, a[1]}' >> "$TEMP_AGG_FILE"
# 收集 /16 聚合 # 收集 /16 聚合
echo "$IP_V4_LIST" | cut -d. -f1-2 | sort | uniq -c | awk '$1>=2 {split($2,a,"."); printf "%d|%s|16|%s\n", $1, $2, a[1]}' >> "$TEMP_AGG_FILE" echo "$FILE_V4_LIST" | cut -d. -f1-2 | sort | uniq -c | awk '$1>=2 {split($2,a,"."); printf "%d|%s|16|%s\n", $1, $2, a[1]}' >> "$TEMP_AGG_FILE"
# 收集 /8 聚合 # 收集 /8 聚合
echo "$IP_V4_LIST" | cut -d. -f1 | sort | uniq -c | awk '$1>=2 {printf "%d|%s|8|%s\n", $1, $2, $2}' >> "$TEMP_AGG_FILE" echo "$FILE_V4_LIST" | cut -d. -f1 | sort | uniq -c | awk '$1>=2 {printf "%d|%s|8|%s\n", $1, $2, $2}' >> "$TEMP_AGG_FILE"
# 去重: 子段数量等于父段时隐藏父段 # 去重: 子段数量等于父段时隐藏父段
TEMP_FILTER="/tmp/block_ip_filter_$$" TEMP_FILTER="/tmp/block_ip_filter_$$"
@@ -291,7 +292,7 @@ $RAW_V6"
fi fi
# 统计未被任何段包含的散乱IP # 统计未被任何段包含的散乱IP
REMAIN_LIST="$IP_V4_LIST" REMAIN_LIST="$FILE_V4_LIST"
if [ -f "$TEMP_SUBNETS" ] && [ -s "$TEMP_SUBNETS" ]; then if [ -f "$TEMP_SUBNETS" ] && [ -s "$TEMP_SUBNETS" ]; then
while IFS= read -r subnet; do while IFS= read -r subnet; do
[ -n "$subnet" ] && REMAIN_LIST=$(echo "$REMAIN_LIST" | grep -v "^$subnet\." || true) [ -n "$subnet" ] && REMAIN_LIST=$(echo "$REMAIN_LIST" | grep -v "^$subnet\." || true)