时间:2023-06-02 16:16:41 来源: 人气:
互联网如同现实社会一样充满钩心斗角,网站被DDOS也成为站长最头疼的事。在没有硬防的情况下,寻找软件代替是最直接的方法,比如用 iptables,但是iptables不能在自动屏蔽,只能手动屏蔽。, 一、什么是DDOS攻击?, DDoS也就是分布式拒绝服务攻击。它使用与普通的拒绝服务攻击同样的方法,但是发起攻击的源是多个。通常攻击者使用下载的工具渗透无保护的主机,当获得该主机的适当的访问权限后,攻击者在主机中安装软件的服务或进程(以下简侈怔理)。这些代理保持睡眠状态,直到从它们的主控端得到指令,对指定的目标发起拒绝服务攻击。, 二、如何确认自己受到DDOS攻击?, 在系统上执行:, netstat -ntu | awk {print $5} | cut -d: -f1 | sort | uniq -c | sort -n, 执行后,将会显示服务器上所有的每个IP多少个连接数。, 以下是我自己用VPS测试的结果:, li88-99:~# netstat -ntu | awk {print $5} | cut -d: -f1 | sort | uniq -c | sort -n, 1 114.226.9.132, 1 174.129.237.157, 1 58.60.118.142, 1 Address, 1 servers), 2 118.26.131.78, 3 123.125.1.202, 3 220.248.43.119, 4 117.36.231.253, 4 119.162.46.124, 6 219.140.232.128, 8 220.181.61.31, 2311 67.215.242.196, 每个IP几个、十几个或几十个连接数都还算比较正常,如果像上面成百上千肯定就不正常了。, 三、防范DDOS攻击的方法:, 一些常用的防DDOS攻击的方法,罗列如下:, 1.增加硬件防火墙和增加硬件设备来承载和抵御DDOS攻击,最基本的方法,但成本比较高。, 2.修改SYN设置抵御SYN攻击:, SYN攻击是利用TCP/IP协议3次握手的原理,发送大量的建立连接的网络包,但不实际建立连接,最终导致被攻击服务器的网络队列被占满,无法被正常用户访问。, Linux内核提供了若干SYN相关设置,使用命令:, sysctl -a | grep syn, 看到:, net.ipv4.tcp_max_syn_backlog = 1024, net.ipv4.tcp_syncookies = 0, net.ipv4.tcp_synack_retries = 5, net.ipv4.tcp_syn_retries = 5, tcp_max_syn_backlog是SYN队列的长度,tcp_syncookies是一个开关,是否打开SYN Cookie, 功能,该功能可以防止部分SYN攻击。tcp_synack_retries和tcp_syn_retries定义SYN, 的重试次数。, 加大SYN队列长度可以容纳更多等待连接的网络连接数,打开SYN Cookie功能可以阻止部分, SYN攻击,降低重试次数也有一定效果。, 调整上述设置的方法是:, 增加SYN队列长度到2048:, sysctl -w net.ipv4.tcp_max_syn_backlog=2048, 打开SYN COOKIE功能:, sysctl -w net.ipv4.tcp_syncookies=1, 降低重试次数:, sysctl -w net.ipv4.tcp_synack_retries=3, sysctl -w net.ipv4.tcp_syn_retries=3, 为了系统重启动时保持上述配置,可将上述命令加入到/etc/rc.d/rc.local文件中。, 3.安装iptables对特定ip进行屏蔽。, A.安装iptables和系统内核版本对应的内核模块kernel-smp-modules-connlimit, B. 配置相应的iptables规则, 示例如下:, (1)控制单个IP的最大并发连接数, iptables -I INPUT -p tcp –dport 80 -m connlimit –connlimit-above 50 -j REJECT, #允许单个IP的最大连接数为 30, (2)控制单个IP在一定的时间(比如60秒)内允许新建立的连接数, iptables -A INPUT -p tcp –dport 80 -m recent –name BAD_HTTP_ACCESS –update –seconds 60, –hitcount 30 -j REJECT, iptables -A INPUT -p tcp –dport 80 -m recent –name BAD_HTTP_ACCESS –set -j ACCEPT, #单个IP在60秒内只允许最多新建30个连接, (3)用iptables屏蔽IP, iptables -I RH-Lokkit-0-50-INPUT 1 -p tcp -m tcp -s 213.8.166.227 --dport 80 --syn -j REJECT, 指定端口的参数是--dport 80;多了--syn参数,可以自动检测sync攻击, (4)使用iptables禁止ping:, iptables -A INPUT -p icmp -m icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 2 -j ACCEPT-A INPUT -p icmp -m icmp --icmp-type 8 -j REJECT --reject-with icmp-port-unreachable, (5)允许某ip连接, iptables -I RH-Firewall-1-INPUT 1 -p tcp -m tcp -s 192.168.0.51 --syn -j ACCEPT, C. 验证, (1)工具:flood_connect.c(用来模拟攻击), (2)查看效果:, 使用, watch ‘netstat -an | grep:21 | grep< 模拟攻击客户机的IP>| wc -l’, 实时查看模拟攻击客户机建立起来的连接数,, 使用, watch ‘iptables -L -n -v | grep< 模拟攻击客户机的IP>’, 查看模拟攻击客户机被 DROP 的数据包数。, D.注意, 为了增强iptables防止CC攻击的能力,最好调整一下ipt_recent的参数如下:, #cat/etc/modprobe.conf, options ipt_recent ip_list_tot=1000 ip_pkt_list_tot=60, #记录1000个IP地址,每个地址记录60个数据包, #modprobe ipt_recent, E.可编写脚本自动提娶攻击ip然后自动屏蔽:, */2 * * * * /usr/local/nginx/var/log/drop.sh, #!/bin/sh, cd /usr/local/nginx/var/log, tail access.log -n 1000 |grep vote.php | |sort |uniq -c |sort -nr |awk {if ($2!=null && $1>50)} > drop_ip.txt, for i in `cat drop_ip.txt`, do, /sbin/iptables -I INPUT -s $i -j DROP;, done, 这shell 每几分钟执行一次,就可自动屏蔽那些不正常IP,相信大家都看的懂,下面是针对连接数屏蔽代码, #!/bin/sh, /bin/netstat -ant |grep 80 |awk {print $5} |awk -F : {print $1} |sort |uniq -c |sort -rn |grep -v -E 192.168|127.0 |awk {if ($2!=null && $1>50)} > drop_ip.txt, for i in `cat drop_ip.txt`, do, /sbin/iptables -I INPUT -s $i -j DROP;, done, 说下,grep -v -E 192.168|127.0 也就是排除内网IP,免得把自己给屏蔽了,当然还可以加些自己的IP。, 4.安装DDoS deflate自动抵御DDOS攻击:, DDoS deflate是一款免费的用来防御和减轻DDoS攻击的脚本。它通过netstat监测跟踪创建大量网络连接的IP地址,在检测到某个结点超过预设的限制时,该程序会通过APF或IPTABLES禁止或阻挡这些IP., DDoS deflate官方网站:, (1)安装DDoS deflate, wget, chmod 0700 install.sh //添加权限, ./install.sh //执行, (2)配置DDoS deflate, 下面是DDoS deflate的默认配置位于/usr/local/ddos/ddos.conf ,内容如下:, ##### Paths of the script and other files, PROGDIR=”/usr/local/ddos”, PROG=”/usr/local/ddos/ddos.sh”, IGNORE_IP_LIST=”/usr/local/ddos/ignore.ip.list” //IP地址白名单, CRON=”/etc/cron.d/ddos.cron” //定时执行程序, APF=”/etc/apf/apf”, IPT=”/sbin/iptables”, ##### frequency in minutes for running the script, ##### Caution: Every time this setting is changed run the script with –cron, ##### option so that the new frequency takes effect, FREQ=1 //检查时间间隔,默认1分钟, ##### How many connections define a bad IP? Indicate that below., NO_OF_CONNECTIONS=150 //最大连接数,超过这个数IP就会被屏蔽,一般默认即可, ##### APF_BAN=1 (Make sure your APF version is atleast 0.96), ##### APF_BAN=0 (Uses iptables for banning ips instead of APF), APF_BAN=1 //使用APF还是iptables,推荐使用iptables, ##### KILL=0 (Bad IPs are’nt banned good for interactive execution of script), ##### KILL=1 (Recommended setting), KILL=1 //是否屏蔽IP,默认即可, #### An email is sent to the following address when an IP is banned., ##### Blank would suppress sending of mails, EMAIL_TO=”root” //当IP被屏蔽时给指定邮箱发送邮件,推荐使用,换成自己的邮箱即可, ##### Number of seconds the banned ip should remain in blacklist., BAN_PERIOD=600 //禁用IP时间,默认600秒,可根据情况调整, 用户可根据给默认配置文件加上的注释提示内容,修岗?置文件。, 喜欢折腾的可以用Web压力测试软件(《Web服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程》)测试一下效果,这东西只能防御小流量的攻击了,聊胜于无吧。, 5.APACHE上安装mod_evasive 组件增强抵御力, mod_evasive是一个预防Apache 遭受DDos 攻击的模块,可以防止同一个IP 对相同URI 发出的大量请求,可设定的选项有:, – 限制同一个IP 在一定秒数内请求一个页面或档案的次数。, – 限制同一个IP 一秒内只可发出50 个请求。, – 设定被禁止的 IP 封锁时间。, 以下是 mod_evasive 的安装方法:, A. 先将原来的 httpd.conf 备份起来。, B. 到, C. 在指令模式解压及编译 mod_evasive:, tar zxvf mod_evasive_1.10.1.tar.gz, cd mod_evasive/, apxs -cia mod_evasive20.c, 以上的apxs 会放在Apache 的bin 目录内;如果Apache 版本是1.3 的话,指令要改为:, apxs -cia mod_evasive.c, 安装好mod_evasive 后,便要修改httpd.conf 内容。, D. 开启 httpd.conf,加入以内容:, DOSHashTableSize 3097, DOSPageCount 5, DOSSiteCount 100, DOSPageInterval 2, DOSSiteInterval 2, DOSBlockingPeriod 10, DOSBlockingPeriod 600, DOSHashTableSize — 这是占用内存的大小,如果服务器比较繁忙,这个数值要设定大一点。, DOSPageCount — 同一IP 在一个时段内可以存娶同一页面的次数,超过会被禁止。, DOSSiteCount — 同一IP 在一个网站内可以占用多少object,超过会禁止。, DOSPageInterval — DOSPageCount 内的时段设定。, DOSSiteInterval — DOSSiteCount 的时间设定,以秒为单位。, DOSBlockingPeriod — 当发现疑似攻击后,使用者会收到403 Forbidden,这是设定封锁的时间,以秒为单位。, E. 最后重新启动 Apache 即可。,