Skip to content

Commit 12f0a4b

Browse files
committed
update
1 parent 25cd628 commit 12f0a4b

1 file changed

Lines changed: 28 additions & 33 deletions

File tree

source/_posts/编程记录/云服日常被攻击(三).md

Lines changed: 28 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -45,59 +45,54 @@ bash脚本我就不是很熟了,连夜和gpt一起写了个脚本,检测ftp
4545
#!/bin/bash
4646

4747
# 配置参数
48-
LOG_FILE="/home/ubuntu/frp/frp_0.56.0_linux_amd64/frps.log" # 日志文件路径
49-
THRESHOLD=20 # 黑名单阈值
48+
LOG_FILE="/home/ubuntu/frp/frps.log" # 日志文件路径
49+
THRESHOLD=100 # 黑名单阈值
5050
BLACKLIST_FILE="/home/ubuntu/frp/blacklist.txt" # 黑名单文件路径
51-
CHAIN_NAME="FTP-BLACKLIST" # 自定义防火墙链名称
52-
51+
CHAIN_NAME="FTP-BLACKLIST" # 自定义防火墙链名称
52+
LOG_LINES=5000 # 只处理最近多少行日志
5353

5454
# 创建自定义防火墙链(如果不存在)
5555
iptables -L $CHAIN_NAME &> /dev/null
5656
if [[ $? -ne 0 ]]; then
5757
echo "创建自定义链: $CHAIN_NAME"
5858
iptables -N $CHAIN_NAME
59-
# 确保 INPUT 链引用自定义链
6059
iptables -I INPUT -j $CHAIN_NAME
6160
fi
6261

63-
# 提取日志中的 IP 地址并统计
64-
echo "解析日志文件:$LOG_FILE"
65-
declare -A ip_counts
66-
while read -r line; do
67-
# 从日志中提取 IP
68-
ip=$(echo "$line" | grep -oP '\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b')
69-
if [[ -n "$ip" ]]; then
70-
ip_counts["$ip"]=$((ip_counts["$ip"] + 1))
71-
fi
72-
done < "$LOG_FILE"
73-
74-
# 遍历统计结果,筛选频率超过 $THRESHOLD 的 IP
75-
echo "筛选频率超过 $THRESHOLD 的 IP"
76-
blacklist_ips=()
77-
for ip in "${!ip_counts[@]}"; do
78-
if [[ ${ip_counts["$ip"]} -gt $THRESHOLD ]]; then
79-
blacklist_ips+=("$ip")
80-
fi
81-
done
62+
# 提取日志中的 IP 地址并统计(只读最后 LOG_LINES 行)
63+
echo "解析日志文件最后 $LOG_LINES 行:$LOG_FILE"
64+
blacklist_ips=$(tail -n "$LOG_LINES" "$LOG_FILE" \
65+
| grep -oP '\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b' \
66+
| awk '{counts[$1]++} END {for (ip in counts) if (counts[ip] > '"$THRESHOLD"') print ip}')
67+
68+
# 如果没有符合条件的 IP,直接退出
69+
if [[ -z "$blacklist_ips" ]]; then
70+
echo "没有超过阈值的 IP"
71+
exit 0
72+
fi
8273

83-
# 去重并添加到黑名单文件
84-
echo "将 IP 添加到黑名单文件并去重"
85-
for ip in "${blacklist_ips[@]}"; do
74+
# 去重并写入黑名单文件
75+
echo "更新黑名单文件:$BLACKLIST_FILE"
76+
mkdir -p "$(dirname "$BLACKLIST_FILE")"
77+
touch "$BLACKLIST_FILE"
78+
for ip in $blacklist_ips; do
8679
if ! grep -q "^$ip$" "$BLACKLIST_FILE"; then
8780
echo "$ip" >> "$BLACKLIST_FILE"
8881
fi
8982
done
9083

91-
# 一次性检查哪些 IP 已经在防火墙中,过滤掉已存在的 IP
92-
existing_ips=$(iptables -L $CHAIN_NAME -v -n | grep -oP '\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b' | sort -u | grep -v '^0\.0\.0\.0$')
84+
# 获取现有防火墙规则里的 IP
85+
existing_ips=$(iptables -L $CHAIN_NAME -v -n \
86+
| grep -oP '\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b' \
87+
| sort -u | grep -v '^0\.0\.0\.0$')
9388

94-
# 遍历黑名单 IP,添加到防火墙中
89+
# 添加新 IP 到防火墙
9590
echo "更新防火墙黑名单规则"
96-
for ip in "${blacklist_ips[@]}"; do
91+
for ip in $blacklist_ips; do
9792
if echo "$existing_ips" | grep -wq "^$ip$"; then
98-
echo "IP 已在防火墙中$ip"
93+
echo "已存在规则$ip"
9994
else
100-
echo "添加黑名单规则$ip"
95+
echo "添加规则$ip"
10196
iptables -A $CHAIN_NAME -s "$ip" -j DROP
10297
fi
10398
done

0 commit comments

Comments
 (0)