全能通知插件自动拉黑功能失效分析与代码逻辑优化
问题描述
自动拉黑功能缺陷:当黑名单列表为空时,自动拉黑功能无法生效。代码逻辑为:先检测黑名单是否为空,若为空则直接退出,随后才尝试将失败的 IP(ssh\_failed 和 web_failed)添加到黑名单/usr/bin/pushbot/api/ip_blacklist。结果导致黑名单始终无法更新。通过ipset list ip_blacklist命令查看是否添加黑名单成功。
临时解决方法
设置黑名单时间为 0
手动添加任意 IP 到黑名单列表这样可以让自动拉黑功能恢复正常运行。
其他代码逻辑问题
失败次数判断不合理:代码仅检测 ssh\_failed 及 web\_failed 文件列表顶部的 IP。如果该 IP 登录失败次数不足 3 次,则直接退出,导致后续有多次失败的 IP 无法被拉黑。
逻辑优化
优化检测逻辑:调整代码,取消只判断第一行 IP 的逻辑,确保所有符合拉黑条件的 IP 都能被正确处理。
优化代码
需要优化的内容为web失败和ssh失败两处,删除末尾的|head =n1即可,优化后的代码如下:
echo "" > ${dir}ssh_login
unset login_ip login_ip_list
# --- 下面这一行需要修改:删除末尾的 |head -n1 ---
local login_ip_list=`cat ${dir}web_failed|awk '{print $1}'|grep -v "^$"|sort -u|head -n1`
for login_ip in $login_ip_list;
do
[ -z "$login_ip" ] && continue
echo "$ip_white_list"|grep -w -q "$login_ip" && continue
local web_login_sum=`cat ${dir}web_failed|grep -w "${login_ip}"|wc -l`
if [ "$web_login_sum" -ge "$login_max_num" ] ;then
if [ ! -z "$web_login_failed" ] && [ "$web_login_failed" -eq "1" ]; then
if [ -z "$title" ];
then
title="${login_ip} 通过 Web 频繁尝试登录"
content="${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}"
elif ( echo "$title"|grep -q "频繁尝试登录" );
then
title="${login_ip} ${title}"
content="${content}${str_splitline}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}"
else
title="设备状态变化"
content="${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}"
fi
fi
sed -i "/^${login_ip}$/d" ${dir}web_failed
echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】设备 ${login_ip} 通过 Web 频繁尝试登录" >> ${logfile}
add_ip_black $login_ip
fi
doneunset login_ip
# --- 下面这一行需要修改:删除末尾的 |head -n1 ---
local login_ip_list=`cat ${dir}ssh_failed|awk '{print $1}'|grep -v "^$"|sort -u|head -n1`
for login_ip in $login_ip_list;
do
[ -z "$login_ip" ] && continue
echo "$ip_white_list"|grep -w -q "$login_ip" && continue
local ssh_login_sum=`cat ${dir}ssh_failed|grep -w "${login_ip}"|wc -l`
if [ "$ssh_login_sum" -ge "$login_max_num" ] ;then
if [ ! -z "$ssh_login_failed" ] && [ "$ssh_login_failed" -eq "1" ]; then
if [ -z "$title" ];
then
title="${login_ip} 通过 SSH 频繁尝试登录"
content="${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}"
elif ( echo "$title"|grep -q "频繁尝试登录" );
then
title="${login_ip} ${title}"
content="${content}${str_splitline}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}"
else
title="设备状态变化"
content="${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP: ${str_space}${str_space}${str_space}${str_space}${login_ip}"
fi
fi
sed -i "/^${login_ip}$/d" ${dir}ssh_failed
echo "`date "+%Y-%m-%d %H:%M:%S"` 【!!!】设备 ${login_ip} 通过 SSH 频繁尝试登录" >> ${logfile}
add_ip_black $login_ip
fi
done
啊?
ccccccc
的