1、DDos

Dos(Denail of Service),拒绝服务攻击,指利用大量的合理请求,来占用过多的目标资源,从而使目标服务。
DDos(Distributed Denail of Service),在 Dos 的基础上,采用了分布式架构,利用多态主机同时攻击目标主机。
主要分为:耗尽带宽、耗尽操作系统的资源、消耗应用程序的运行资源。

2、分析思路及解决

1、sar

  1. sar -n DEV 1

image.png
可以看到,网络接收的 PPS 已经达到了 30000 左右,但 BPS 却只有 1700 kB,这样每个包的大小只有 58 B(1700*1024/30000=58)。

2、tcpdump

  1. # -i ens33 只抓取 ens33 网卡, -n 不解析协议名和主机名
  2. # tcp port 80 只抓取tcp协议并且端口号为80的网络帧
  3. tcpdump -i ens33 -n tcp port 80

image.pngFlag[S] 表示这是一个 SYN 包。大量的 SYN 包表示,这是一个 SYN Flood 攻击。
这是 DDos 最经典的攻击方式。

  • 客户端构造大量的 SYN 包,请求建立 TCP连接
  • 服务器收到包后(处于 SYN_RECEIVED),会向源 IP 发送 SYN+ACK 报文,并等待三次握手的最后一个ACK报文,直到超时。

这种等待状态的 TCP连接,也称为 半开连接。由于连接表的大小有限,大量的半开连接会导致连接表迅速占满,从而无法建立新的 TCP 连接。

3、netstat

  1. # -n 表示不解析名字,-p 表示显示连接所属进程
  2. netstat -n -p | grep SYN_REC

image.png
可以看到大量的 SYN_RECV 状态的连接,并且源地址是 172.16.246.7 。
image.png
统计 SYN_RECV 的数量,有18个。

4、iptables

找出源 IP 后,可以通过 iptables进行操作

  1. # 丢掉包
  2. iptables -I INPUT -s 172.16.246.7 -p tcp -j REJECT
  1. # 限制 syn 并发数为每秒 1 次
  2. iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
  1. # 限制单个IP在60秒新建立的连接数为 10
  2. iptables -I INPUT -p tcp --dport 80 --syn -m recent --name SYN_FLOOD --update --seconds 60 --hitcount 10 -j REJECT

5、半开状态连接数

  1. sysctl net.ipv4.tcp_max_syn_backlog

image.png
可以看到只允许 128 个半开状态连接数。

  1. # 半开状态连接数 修改为 1024
  2. sysctl -w net.ipv4.tcp_max_syn_backlog=1024

6、减少连接充实

连接每个 SYN_RECV 时,如果失败,内核会自动重试,默认重试次数是 5次,可以减小为 1次

  1. sysctl -w net.ipv4.tcp_synack_retries=1

7、TCP SYN Cookies

SYN Cookies 基于连接信息(包括源地址、源端口、目的地址、目的端口等)以及一个加密种子(如系统启动时间),计算出一个哈希值(SHA1),作为 Cookie。
这个 Cookie 被用作序列号,来应答 SYN+ACK 包,并释放连接状态。当客户端完成三次握手的最后一次ACK后,服务器就会再次计算这个哈希值,确认是上次返回的 SYN+ACK的返回包,才会进入 TCP连接状态。
开启 SYN Cookie后,就不需要维护半开连接状态了,也就没有半开连接数的限制。

  1. # 临时开启
  2. sysctl -w net.ipv4.tcp_syncookies=1
  1. # 永久开启
  2. $ cat /etc/sysctl.conf
  3. net.ipv4.tcp_syncookies = 1
  4. net.ipv4.tcp_synack_retries = 1
  5. net.ipv4.tcp_max_syn_backlog = 1024
  6. # 使配置生效
  7. sysctl -p