以 DDOS SYN Flood 攻击为例。
第一种方式是禁止攻击来源IP,但是通常攻击源都不是一个IP
1 | $ iptables -I INPUT -s 192.168.0.2 -p tcp -j REJECT |
第二钟方式是 限制syn并发的次数以及同一个IP 新建连接数的数量
1 | # 限制 syn 并发数为每秒 1 次 |
但是如果攻击源特别多,其实还是很难阻挡。
SYN Flood 会导致 SYN_RECV 状态的连接急剧增大,可以通过调整半连接容量大小,例如调整为 1024
1 | $ sysctl -w net.ipv4.tcp_max_syn_backlog=1024 |
另外,每个SYN_RECV 如果失败,内核还会自动重试,默认是 5次,可以修改为1次
1 | $ sysctl -w net.ipv4.tcp_synack_retries=1 |
此外,TCP SYN Cookies 是一种专门防御 SYN Flood 攻击的方法,其原理是基于连接信息(包括源地址、源端口、目的地址、目的端口等)以及一个加密种子(如系统启动时间),计算出一个哈希值(SHA1),这个哈希值称为 cookie。
这个 cookie 就被用作序列号,来应答 SYN+ACK 包,并释放连接状态。当客户端发送完三次握手的最后一次 ACK 后,服务器就会再次计算这个哈希值,确认是上次返回的 SYN+ACK 的返回包,才会进入 TCP 的连接状态。 因而,开启 SYN Cookies 后,就不需要维护半开连接状态了,进而也就没有了半连接数的限制。
注意:开启 TCP syncookies 后,内核选项 net.ipv4.tcp_max_syn_backlog 也就无效了。
可以通过下面的方式开启
1 | $ sysctl -w net.ipv4.tcp_syncookies=1 |