一、模拟DDOS攻击
运行 hping3 命令
如果现象不明显,那么把参数里面的 u10 调小,或者加上–flood 选项;
二、确认DDOS攻击
1. 执行命令变慢,正常客户端的连接超时了,并没有收到 Nginx 服务的响应。
2. sar命令查看网络收发状况
接收的 PPS 已经达到了 20000 多,但是 BPS 却只有 1174 kB,这样每个包的大小就只有54B(1174*1024/22274=54)。
这明显就是个小包了
3. tcpdump 抓包极客时间
Flags [S] 表示这是一个 SYN 包。大量的 SYN 包表明,这是一个 SYN Flood 攻击。
三、缓解DDOS
1. 封IP
(1) DDOS是客户端发送了SYN包,但不发送ACK包。这时服务端处于SYN_RECEIVED 状态。
(2) 用 netstat 命令查看
确认IP是192.168.0.2
(3) 使用iptables限制IP
2. 限制SYN并发和连接数
SYN Flood 攻击中的源 IP 并不是固定的。比如,可以在 hping3 命令中,加入 --rand-source 选项,来随机化源 IP。这时上面1的方法就不适用了。
这时可使用下面的方法来限制syn 包的速率:
# 限制 syn 并发数为每秒 1 次
$ iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
# 限制单个 IP 在 60 秒新建立的连接数为 10
$ iptables -I INPUT -p tcp --dport 80 --syn -m recent --name SYN_FLOOD --update --seconds 60 --hitcount 10 -j REJECT
3. 加大半连接容量
如果是多台机器同时发送 SYN Flood,这种方法就无效了。
这时可使用下面的方法:
(1) 加大半连接容量,从256改成1024
$ sysctl -w net.ipv4.tcp_max_syn_backlog=1024
net.ipv4.tcp_max_syn_backlog = 1024
(2) 减少重试次数,从5改为1
$ sysctl -w net.ipv4.tcp_synack_retries=1
net.ipv4.tcp_synack_retries = 1
4. 直接不维护半连接队列
如果情况继续严重,就开启 SYN Cookies ,不需要维护半开连接状态了
$ sysctl -w net.ipv4.tcp_syncookies=1
net.ipv4.tcp_syncookies = 1
为了保证配置持久化,你还应该把这些配置,写入 /etc/sysctl.conf 文件中。
$ cat /etc/sysctl.conf
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_max_syn_backlog = 1024
5. 外围设备的防护措施
购置专业的入侵检测和防御设备,配置流量清洗设备阻断恶意流量等。