我每分钟运行一次 cron 来阻止暴力攻击。
awk '{print $2}' < ipkill.txt | while read ip; do
#query geographical info IP address
curl -o country.txt ipinfo.io/$ip
#parse the JSON result pull the country
country=$(cat country.txt | jq ".country")
#echo $country
#Get country & null-route IPs and quickstart the firewall
if [ $country != '"US"' ] && [ $country != 'null' ] && [ $country != '"JP"' ] && [ $country != '"CA"' ]; then
msg=" address blocked: "
echo $country$msg$ip >> blocked.txt
#below command disabled
#iptables -I INPUT -s $ip -j DROP
#add IP to CSF rules
csf -d $ip
#kill all associated processes from offending IP
process=`netstat -tuapn | grep $ip | awk {'print $7}' | awk -F '/' {'print $1'} | uniq`
for hacker in $process
do
kill $hacker
done
#blackhole IP
route add $ip gw 127.0.0.1 lo
echo $(date) " $ip null-routed and corresponding process killed."
load=`cat /proc/loadavg | awk '{print $1}'`
echo $(date) ' Load is now: '$load
fi
#csf -r
csf -q
done
效果很好。(将对 ipinfo.io 的请求限制为 10,000 个)
主要问题是 CSF 没有将 IP 添加到防火墙拒绝文件中。命令是
脑脊液
这会将 IP 添加到 cfs.deny 文件中。我经常在运行中使用它。嵌入到此脚本中后,它不起作用。
我的直觉是,当脚本被触发(+200)时,在高负载期间服务器负载实在太高,并且不知何故命令从未执行或所需的文件操作没有发生。
我的下一步是在脚本完成并且负载下降后添加 IP。看看这是否有所作为。
我预计 CSF 命令行操作将在高负载期间排队。
答案1
您可以尝试运行csf
使用完整路径运行该命令。/usr/sbin/csf
据我所知,csf 在运行时不实现任何类型的排队csf -d
因此快速阻止太多 IP 会导致负载。
您可以尝试直接将 IP 添加到/etc/csf/csf.deny
文件中(每行一个 IP,IP 后可选添加注释),然后使用以下命令重新启动 csfcsf -r
我不确定这是否会减少对负载的影响。无论如何,当您阻止过多 IP 时,无论您使用哪种方法,都会降低系统速度(反正都是 iptables)。
您可以检查脚本,以便如果负载低于阈值,则发出 csf 重新启动以加载新的csf.deny
,否则休眠并稍后重试,直到负载足够低。