1、解决DOS生产案例:根据web日志或者或者网络连接数,监控当某个IP 并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP,监控频 率每隔5分钟。防火墙命令为:iptables -A INPUT -s IP -j REJECT
用while true做这个很合适,可以逐行送进循环,下面取出的ip统计后,前面是ip个数,后面是ip,分别赋值给count和ip,这个别看不懂哦。
#第一种方法
[root@centos-7 ~]#cat check_link.sh
#!/bin/bash
#
#********************************************************************
#Author: jiangmin
#QQ: 1461918614
#Date: 2021-08-18
#FileName: check_link.sh
#Description: The test script
#Copyright (C): 2021 All rights reserved
#********************************************************************
WARNING=100
touch deny_hosts.txt
while true;do
ss -nt | sed -nr '1!s#.* ([0-9.]+):[0-9]+ *#\1#p'|sort |uniq -c|sort | while read count ip;do
if [ $count -gt $WARNING ];then
echo $ip is deny
grep -q "$ip" deny_hosts.txt || { echo $ip >> deny_hosts.txt; iptables -A INPUT -s $ip -j REJECT; }
fi
done
sleep 300
done
#第二种方法
[root@centos-7 ~]#cat deny_dos.sh
#!/bin/bash
#
#********************************************************************
#Author: jiangmin
#QQ: 1461918614
#Date: 2021-08-18
#FileName: deny_dos.sh
#Description: The test script
#Copyright (C): 2021 All rights reserved
#********************************************************************
LINK=100
while true;do
ss -nt|awk -F"[[:space:]]+|:" '/^ESTAB/{print $(NF-2)}'|sort|uniq -c |sort -nr|while read count ip;do
if [ $count -gt $LINK ];then
iptables -A INPUT -s $ip -j REJECT
fi
done
done
[root@centos-7 ~]#chmod +x /root/deny_dos.sh
[root@centos-7 ~]#crontab -e
[root@centos-7 ~]#crontab -l
*/5 * * * * /root/deny_dos.sh
2、使用awk以冒号分隔获取/ettc/passwd文件第一列
#第一种方法
[root@centos-7 ~]#awk -F: '{print $1}' < /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
sshd
postfix
nginx
#第二种方法
[root@centos-7 ~]#awk -v FS=":" '{print $1}' < /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
sshd
postfix
nginx