阅读 200

【DDoS系列-03】钟南山:对抗DDoS的5大手段

一、【暴力 | 有效】减少暴露端口

使用防火墙,或云服务器的安全组功能,配置端口访问黑白名单

尽量避免将非业务必须的服务端口暴露在公网上,从而避免与业务无关的请求和访问。通过配置防火墙或安全组可有效防止系统被扫描或者意外暴露。

二、【云服务 | 花钱】增加带宽、服务器

短期内,如果没有很好的其他解决办法,可以通过氪金的方式,临时增加服务配置,短期提升抗压能力:

  1. 通过负载均衡等方法,分摊攻击流量

    架构更多服务器(一般云服务器有镜像复制功能,可快速复制构建),使用Nginx等将用户访问流量均衡分配到各个服务器上,降低单台服务器的压力,提升整体业务吞吐处理能力,可有效缓解一定流量范围内的DDoS攻击。

  2. 增加单台服务器配置

    可短期弹性地增加单台服务器配置或带宽,保证DDoS攻击时间段内,服务的正常可用。

    一般来说,方案1更省钱!

三、【灵活 | 免费】防DDoS软件

1、使用Nginx,防HTTP DDoS攻击

以下模块,可根据需要,任选其N!

  • ngx_http_limit_req_module模块,限制每秒请求数

通过漏桶原理来限制单位时间内的请求数,一旦单位时间内请求数超过限制,就会返回503错误。 bash http { limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; //触发条件,所有访问ip 限制每秒10个请求 ... server { ... location ~ \.php$ { limit_req zone=one burst=5 nodelay; //执行的动作,通过zone名字对应 ... } } }

参数说明:

  • $binary_remote_addr:二进制访问IP
  • zone=one:10m:定义zone名字叫one,并为这个zone分配10M内存,用来存储会话(二进制远程地址),1m内存可以保存16000会话
  • rate=10r/s:限制频率为每秒10个请求
  • burst=5:允许超过频率限制的请求数不多于5个,假设1、2、3、4秒请求为每秒9个,那么第5秒内请求15个是允许的,反之,如果第一秒内请求15个,会将5个请求放到第二秒,第二秒内超过10的请求直接503,类似多秒内平均速率限制。
  • nodelay:超过的请求不被延迟处理,设置后15个请求在1秒内处理。
  • ngx_http_limit_conn_module模块,限制IP连接数
    http {
       limit_conn_zone $binary_remote_addr zone=addr:10m;     //触发条件
       ...
       server {
           ...
           location /download/ {
               limit_conn addr 1;    //限制同一时间内1个连接,超出的连接返回503
               ...
                   }
              }
        }
    
    复制代码
  • ngx_lua_waf模块,实现应用级防火墙功能

经常使用宝塔的人知道,nginx配置中,有个叫做include luawaf.conf的配置,这就是大名鼎鼎的ngx_lua_waf防火墙。

它的常用功能包括:

  • 防止SQL注入,本地包含,部分溢出,fuzzing测试,XSS,SSRF等Web攻击
  • 防止SVN/备份之类文件泄漏
  • 防止ApacheBench之类压力测试工具的攻击
  • 屏蔽常见的扫描黑客工具,扫描器
  • 屏蔽异常的网络请求
  • 屏蔽图片附件类目录php执行权限
  • 防止WebShell上传

同时,它也具备基本的CC攻击拦截功能。即针对访问IP,记录其访问次数,当在一定时间内达到指定访问次数,则会进行拦截处理。

博主针对其lua脚本,做了一些修改,可动态配置封禁时长。使用方法(宝塔):

  1. Nginx配置文件开启include luawaf.conf;
  2. 将下载的文件,覆盖到/www/server/nginx/waf 点我下载
  3. 重要配置说明(下载得到的config.lua文件,可自行酌情修改):
    --是否开启拦截cc攻击
    CCDeny="on"
    --a/b-c 表示如果同一IP在b秒内请求超过a次,则禁用该IP c秒
    CCrate="100/50-60"    
    复制代码

2、使用iptables,防DDoS攻击

#限制SYN_RECV连接,每秒一次
-A FORWARD -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT

#限制IP碎片,每秒钟只允许100个碎片,用来防止DoS攻击
-A FORWARD -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT
 
#限制ping,每秒一次,10个后重新开始
-A FORWARD -p icmp -m limit --limit 1/sec --limit-burst 10 -j ACCEPT
 
#限制ICMP回应请求,每秒一次
-A FORWARD -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec -j ACCEPT

#防御大量DOS攻击连接,可允许外网每个IP最多15个初始连接,超过的则丢弃,第二条是在第一条的基础上允许已经建立的连接和子连接数量(--connlimit-mask 32为主机掩码,32即为一个主机ip,也可以是网段)
iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 --connlimit-mask 32 -j DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

#抵御DDOS,允许外网最多24个初始连接,然后服务器每秒新增12个,访问太多超过的丢弃,第二条是允许服务器内部每秒1个初始连接进行转发
iptables -A INPUT  -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

#允许单个IP访问服务器的80端口的最大连接数为20
iptables -I INPUT -p tcp --dport 80 -m connlimit  --connlimit-above 20 -j REJECT 

#对访问本机的3306端口进行限制,每个ip每小时只能连接5次,超过的拒接,1小时候重新计算次数
iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP
iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT
复制代码

3、使用Linux内核参数,削弱DDoS攻击

以下均是linux内核参数,可使用命令echo 2 > /proc/sys/net/ipv4/下述key来进行设值。

#表示开启 SYN Cookies功能,当出现 SYN 等待队列溢出时, 启用 Cookies 来处理, 可防范少量SYN攻击
net.ipv4.tcp_syncookies = 1

#新建TCP连接请求,需要发送一个SYN包,该值决定内核需要尝试发送多少次syn连接请求才决定放弃建立连接。默认值是5. 对于高负载且通信良好的物理网络而言,调整为2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2

#0:不进行源地址校验;
#1:严格模式,即RFC3704定义的严格反向路径;每个入向报文都要经过FIB进行反向路径检验,如果反向路径的出向端口不是最优的,则检测失败。默认情况下,丢弃检验失败的报文,在某些特殊情况下可能会丢包造成业务异常;
#2:松散模式,即RFC3704定义的松散反向路径;每个入向报文的源地址都要经过FIB检验,如果入向报文的源地址不能通过反向路径的任何出向端口到达,则检测失败。
#RFC3704文档建议使用严格模式,防止IP欺骗的DDos攻击。如果使用非对称路由或者其他复杂路由,建议使用松散模式
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

#表示套接字由本端要求关闭,这个参数决定了他保持在 FIN_WAIT_2 状态的时间, 默认值是 60 秒
net.ipv4.tcp_fin_timeout = 15

#忽略ICMP广播请求,启动设置为1:从 ICMP 的角度出发,为了避免 ICMP 主机探测、ICMP Flood 等各种网络问题,你可以通过内核选项,来限制 ICMP 的行为,避免放大攻击
net.ipv4.icmp_echo_ignore_broadcasts = 1

#开启恶意icmp错误消息保护
net.ipv4.icmp_ignore_bogus_error_responses = 1

#系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量,那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制,纯粹为了抵御那些简单的 DoS 攻击,千万不要依赖这个或是人为的降低这个限制。
net.ipv4.tcp_max_orphans = 16384

#永久禁 ping,一定程度上在互联网上隐藏自己防止一些批量扫描软件探测主机,减少被入侵的几率,不过却减少了使用上的便利性
net.ipv4.icmp_echo_ignore_all = 1
复制代码

4、使用DDoS deflate等专业软件

DDoS deflate是一款免费的用来防御和减轻DDoS攻击的脚本。它通过netstat监测跟踪创建大量网络连接的IP地址。

在检测到某个结点超过预设的阈值时,该程序会通过apf或iptables禁止或阻挡这些IP。

DDoS deflate官方网站:http://deflate.medialayer.com/

四、【复杂 | 定制化】业务系统过滤

我们可以通过ELK日志分析,结合具体业务情况,在业务系统层面编写一定的过滤逻辑,实现有效的DDoS过滤。

ELK这里不多讲,大家自行百度。下面放几张之前排查CC攻击的kibana统计图: X轴为所有IP(由于较多,所以看起来密密麻麻,几近全黑),Y轴为每个IP访问总次数,然后按照访问次数由高到低排序。

可以看到,90%的IP,访问次数在250以下,而少部分,达到了500以上。

X轴为不同IP,Y轴为各IP访问不同URL的次数(每一个点就是一个URL)。

可以看出,正常IP访问的页面,基本恒定在1-5次(本业务决定了访问比较恒定),而异常IP,每个页面数,则不固定,有多有少。

抽样异常IP,威胁情报结果。

由上,通过日志统计分析,不难看出:

  1. 很容易给出:正常访问和异常访问的次数阈值,从而结合上面WAF软件,进行合理拦截; 其实一般网站,比起上面的图来说,正常和异常的访问分布,会更加清晰明显。
  2. 通过抽样一些IP,结合到本身业务场景分析:不应该会存在境外IP访问,同时由于业务限制,不会存在IDC(云服务器)、VPS、VPN、Proxy等类型的IP,因此还可以利用纯真数据库,通过访问IP的归属,进行智能过滤(程序可直接集成qqwry.dat数据库)。

3. 自行脑补……

五、【贵 | 好用】购买高防服务

1、高防服务器和带流量清洗的ISP 百度谷歌关键字:高防DDoS,搜到一大批,优劣自行判断。

2、流量清洗服务 例如:akamainexusguard,费用比较贵。

3、CDN 例如:蓝讯网宿cloudflare等,CDN针对DDOS的分布式特点,将流量引流分散,同时对网站又有加速作用,效果好,成本相对低。


好了,今天的分享就到这儿了。

如果喜欢本文,请关注公众号:开猿笔记,里面会有持续更新噢!

文章分类
后端
文章标签