一、【暴力 | 有效】减少暴露端口
使用防火墙
,或云服务器的安全组
功能,配置端口访问黑白名单
。
尽量避免将非业务必须的服务端口暴露在公网上,从而避免与业务无关的请求和访问。通过配置防火墙或安全组可有效防止系统被扫描或者意外暴露。
二、【云服务 | 花钱】增加带宽、服务器
短期内,如果没有很好的其他解决办法,可以通过氪金的方式,临时增加服务配置,短期提升抗压能力:
-
通过负载均衡等方法,分摊攻击流量
架构更多服务器(一般云服务器有镜像复制功能,可快速复制构建),使用Nginx等将用户访问流量均衡分配到各个服务器上,降低单台服务器的压力,提升整体业务吞吐处理能力,可有效缓解一定流量范围内的DDoS攻击。 -
增加单台服务器配置
可短期弹性地增加单台服务器配置或带宽,保证DDoS攻击时间段内,服务的正常可用。
一般来说,方案1更省钱!
三、【灵活 | 免费】防DDoS软件
1、使用Nginx,防HTTP DDoS攻击
以下模块,可根据需要,任选其N!
-
ngx_http_limit_req_module
模块,限制每秒请求数
通过漏桶原理来限制单位时间内的请求数,一旦单位时间内请求数超过限制,就会返回503错误。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脚本,做了一些修改,可动态配置封禁时长。使用方法(宝塔):
- Nginx配置文件开启
include luawaf.conf;
- 将下载的文件,覆盖到
/www/server/nginx/waf
点我下载 - 重要配置说明(下载得到的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,威胁情报结果。
由上,通过日志统计分析,不难看出:
- 很容易给出:正常访问和异常访问的次数阈值,从而结合上面WAF软件,进行合理拦截;
其实一般网站,比起上面的图来说,正常和异常的访问分布,会更加清晰明显。 - 通过抽样一些IP,结合到本身业务场景分析:不应该会存在*IP访问,同时由于业务限制,不会存在IDC(云服务器)、VPS、VPN、Proxy等类型的IP,因此还可以利用纯真数据库,通过访问IP的归属,进行智能过滤(程序可直接集成qqwry.dat数据库)。
- 自行脑补……
五、【贵 | 好用】购买高防服务
1、高防服务器和带流量清洗的ISP
百度谷歌关键字:高防DDoS
,搜到一大批,优劣自行判断。
2、流量清洗服务
例如:akamai
、nexusguard
,费用比较贵。
3、CDN
例如:蓝讯
、网宿
、cloudflare
等,CDN针对DDOS的分布式特点,将流量引流分散,同时对网站又有加速作用,效果好,成本相对低。
好了,今天的分享就到这儿了。
如果喜欢本文,请关注公众号:开猿笔记,里面会有持续更新噢!