@@ -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 # 黑名单阈值
5050BLACKLIST_FILE=" /home/ubuntu/frp/blacklist.txt" # 黑名单文件路径
51- CHAIN_NAME=" FTP-BLACKLIST" # 自定义防火墙链名称
52-
51+ CHAIN_NAME=" FTP-BLACKLIST" # 自定义防火墙链名称
52+ LOG_LINES=5000 # 只处理最近多少行日志
5353
5454# 创建自定义防火墙链(如果不存在)
5555iptables -L $CHAIN_NAME & > /dev/null
5656if [[ $? -ne 0 ]]; then
5757 echo " 创建自定义链: $CHAIN_NAME "
5858 iptables -N $CHAIN_NAME
59- # 确保 INPUT 链引用自定义链
6059 iptables -I INPUT -j $CHAIN_NAME
6160fi
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
8982done
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 到防火墙
9590echo " 更新防火墙黑名单规则"
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
10398done
0 commit comments