前言
在企业实际环境中,服务器可能会遭受DDos攻击。如果我们能合理的设置iptables或者防火墙,就可以大大提高服务器正常提供服务的稳定性。
以下是对iptables的应用
问题描述
写一个脚本解决DOS攻击生产案例:
==提示:==根据web日志或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,立即调用防火墙命令封掉对应的IP,监控频率每隔3分钟。
防火墙命令为:iptables -I INPUT -s (源ip地址) -j DROP
思路
- 取到ip和ip访问次数
- 统计ip访问次数是否大于100次
- 判断出来后设置防火墙命令,并查看是否执行成功
- 根据实际情况进行优化
脚本
#!/bin/sh
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
count=100
Path=/server/scripts/shell/access_2020_20-8.log
##需要进行分析的日志文件位置
function ipt(){
awk ' [print $1] ' $Path|sort|uniq c|sort nr k1 > /tmp/tmp.log
##将访问的ip进行过滤,并且按访问次数倒序排出来
exec < /tmp/tmp.log
## 将文件导入exec
while read line
do
IP= echo $line|awk '{print $2}'
## 将文件中的ip提取
if [ echo $line|awk '{print $1}' -ge $count -a iptables -L -n |grep "$IP"|wc -l -lt 1] ; then
##如果访问的次数大于count值并且在iptables链中没有被处理过
iptables -I INPUT -s $IP -j DROP
## 对它进行DROP操作
RETVAL=$?
## 判断是否执行成功
if [ $RETVAL -eq 0 ];then
## 如果执行成功
action "$IP is DROP" /bin/true
echo "$IP" >> /tmp/ip_$(data +%F).log
##将这个ip放入生成的文件中去
else
action "iptables -I INPUT -s $IP -j DROP " /bin/false
fi
fi
}
function del(){
exec </tmp/ip_$(date +%F -d '-1day' ).log
##将前一天的文件导入到exec
while read line
do
if [ iptables -L -n | grep "$line"|wc -l -ge 1];then
## 如果这个ip在iptables链中大于等于1
iptables -D INPUT -s $line -j DROP
##将这个链删除
fi
done
}
main(){
flag=0
while true
do
sleep 180
##没三分钟执行一次
((flag++))
ipt
[ $flag -ge 480 ] && del && flag=0
##如果flag大于等于了480个flag即24小时,进行删除操作,并对flag重新赋值为0
done
}
后记
关于iptables的应用场景还有很多,可以继续联系,从而加深印象。