如何防止ddos攻击

作者:小胖吴 | 创建时间: 2023-06-17
dos攻击,让你的计算机或网络无法提供正常访问...
如何防止ddos攻击

操作方法

先检查了web服务器日志,没有异常。查看防火墙日志和路由器日志,发现部分可疑流量,进而发现攻击时,路由器日志里有大量64字节的数据包,还有大量的“UDP-other”数据包,而web服务器日志还是正常。

SYN洪泛式攻击,利用tcp三次握手,由伪造的IP地址向目标端发送请求报文,而目标端的响应报文永远无法发送,如果有成千上万的这种连接,目标端等待关闭连接的过程会消耗大量的主机资源

禁止所有发给目标IP的UDP包,这种做法会让服务器丧失部分功能,如:DNS. 好处:减轻了web服务器的压力,web可以正常工作 弊端:攻击仍然可以到达web,影响网络性能

联系上游带宽提供商,暂时限制网站端口的UDP进入流量,降低网络到服务器的流量

统计SYN_RECV的状态,发现有大量的tcp同步数据包,但是连接上的却没有几个 [root@xiaoya ~]# netstat -an|grep SYN_RECV|wc -l1522 或者查看当前最大连接数 [root@xiaoya ~]# netstat -na|grep EST|awk '{print $5}'|cut -d":" -f1,3|sort|uniq -c|sort -n 1 192.168.150.10 2 192.168.150.20 … … 1987 192.168.150.200 明显是收到了dos攻击

解决策略

分析web日志 把单IP PV数高的封掉(可按天定义PV=1000即封掉) [root@xiaoya ~]# cat test#!/bin/bash  while true  do  ####access.log为web日志文件  awk '{print $1}' access.log | grep -v "^$" | sort | uniq -c > tmp.log          exec < tmp.log             #输入重定向    while read line            #读取文件    do      ip=`echo $line | awk '{print $2}'`      count=`echo $line | awk '{print $1}'`        if [ $count -gt 100 ] && [ `iptables -n -L | grep "$ip" | wc -l` -lt 1 ]        then          iptables -I INPUT -s $ip -j DROP          echo "$line is dropped" >> droplist.log        fi      done  sleep 3  done

分析网络连接数 netstat -an | grep EST查看网络状态如下: tcp        0      0 192.168.40.125:46476        112.95.242.171:80           ESTABLISHEDtcp        0     74 192.168.40.125:57948        173.194.127.177:443         ESTABLISHEDtcp        0      0 192.168.40.125:52290        118.144.78.52:80            ESTABLISHEDtcp        0      0 192.168.40.125:42593        163.177.65.182:80           ESTABLISHEDtcp        0      0 192.168.40.125:49259        121.18.230.110:80           ESTABLISHEDtcp        0      0 192.168.40.125:52965        117.79.157.251:80           ESTABLISHED 脚本如下 [root@xiaoya ~]# cat test#!/bin/bash  while true  do grep EST est.log | awk -F '[ :]+' '{print $6}' | sort | uniq -c > tmp.log  ####netstat -an | grep EST | awk -F '[ :]+' '{print $6}' | sort | uniq -c  exec < tmp.log    while read line    do      ip=`echo $line | awk '{print $2}'`      count=`echo $line | awk '{print $1}'`        if [ $count -gt 100 ] && [ `iptables -n -L | grep "$ip" | wc -l` -lt 1 ]        then          iptables -I INPUT -s $ip -j DROP          echo "$line is dropped" >> droplist.log        fi      done  sleep 3  done

点击展开全文

更多推荐