怎么防住ddos攻击的ip

2025-05-16 06:57:32
推荐回答(1个)
回答(1):

方法/步骤

  • 1

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

  • 2

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

  • 3

    禁止所有发给目标IP的UDP包,这种做法会让服务器丧失部分功能,如:DNS.

    好处:减轻了web服务器的压力,web可以正常工作

    弊端:攻击仍然可以到达web,影响网络性能

  • 4

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

  • 5

    统计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攻击

    END

  • 解决策略

  • 分析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