面对 SYN Flood 攻击,最直接的止损方式是在内核层开启 SYN Cookies 配合 iptables 限制新建连接速率,但这仅适用于中小流量攻击,大流量需依赖上游清洗。
先说结论:iptables 能做速率限制和状态过滤,但单靠它无法抵御大规模流量,必须结合内核参数调优。
- 先判断:确认攻击类型是否为 SYN 包异常增多,而非业务带宽耗尽。
- 优先做:开启 net.ipv4.tcp_syncookies 并设置 iptables 限流规则。
- 再验证:观察服务器负载和连接状态是否恢复平稳。
命令速用版
# 开启 SYN Cookies
sysctl -w net.ipv4.tcp_syncookies=1
# 限制每秒新建 SYN 连接数(示例:每秒 25 个,突发 50 个)
# 注意:阈值需根据实际业务流量调整,切勿直接套用
iptables -A INPUT -p tcp `--syn` -m limit `--limit` 25/s `--limit-burst` 50 -j ACCEPT
iptables -A INPUT -p tcp `--syn` -j DROP
# 保存规则(CentOS/RHEL)
service iptables save
# 或(Ubuntu/Debian)
iptables-save > /etc/iptables/rules.v4
为什么会这样
SYN Flood 利用 TCP 三次握手的缺陷,攻击者发送大量 SYN 包但不完成握手,耗尽服务器的半连接队列(backlog)。当队列满时,正常用户无法建立连接。iptables 可以在数据包进入协议栈早期进行丢弃,减少内核处理压力;而 SYN Cookies 机制则允许在内核队列满时仍能响应合法请求,不保存半连接状态。
分步处理
1. 确认当前连接状态
使用 ss 或 netstat 查看 SYN_RECV 状态的数量:
ss -ant | grep SYN-RECV | wc -l
# 或
netstat -ant | grep SYN_RECV | wc -l
如果数量异常高且持续不降,可能存在攻击。
2. 调整内核参数
编辑 /etc/sysctl.conf,确保以下参数存在且生效:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
执行 sysctl -p 使其生效。公开资料中没有看到可靠的量化数据表明具体数值应设为多少,需根据内存和业务并发调整。
3. 配置 iptables 规则
使用 limit 模块限制 SYN 包速率。注意规则顺序,确保允许已建立连接:
iptables -A INPUT -m state `--state` ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp `--syn` -m limit `--limit` 25/s `--limit-burst` 50 -j ACCEPT
iptables -A INPUT -p tcp `--syn` -j DROP
4. 持久化规则
重启后规则会丢失,需根据发行版保存配置,并注意防火墙服务冲突:
- CentOS 6 及以前:使用
service iptables save。 - CentOS 7+:默认使用 firewalld,与 iptables 服务冲突。若需使用 iptables 命令,建议停止 firewalld (
systemctl stop firewalld) 并安装 iptables-services (yum install iptables-services),然后使用service iptables save。 - Ubuntu 18.04+:建议安装
iptables-persistent包,使用netfilter-persistent save保存规则。
怎么验证是否生效
1. 查看 iptables 计数器
运行 iptables -L -n -v,观察对应规则的 packet 计数是否增长。如果 DROP 规则计数持续增加,说明规则正在拦截。
2. 观察系统日志
查看 /var/log/messages 或 dmesg,确认是否有 TCP 队列溢出的警告减少。
3. 业务连通性
在攻击期间尝试从外部访问服务,确认正常 IP 是否仍能建立连接。
常见坑
1. 误伤正常流量
限流阈值设得太低会导致正常用户无法访问,尤其是高并发业务场景。示例中的 25/s 仅为参考,Web 服务器可能需要更高阈值。建议先观察正常业务峰值,设置为峰值的 1.5-2 倍。
2. 性能开销
iptables 规则过多或匹配逻辑复杂会消耗 CPU。在高包率攻击下,防火墙本身可能成为瓶颈,此时应联系 ISP 或云服务商启用流量清洗。
3. 规则生效顺序
iptables 按顺序匹配,确保 ACCEPT 已建立连接的规则在限流规则之前,否则会导致现有连接中断。
4. 防火墙服务冲突
在 CentOS 7+ 等现代发行版上,firewalld 和 iptables-services 不能同时运行。修改规则前请确认当前使用的防火墙管理工具,避免规则被覆盖或不生效。
参考来源
- Linux Kernel Documentation - IP Sysctl: https://www.kernel.org/doc/html/latest/networking/ip-sysctl.html
- Netfilter Project - iptables documentation: https://www.netfilter.org/documentation/
- Red Hat Enterprise Linux Documentation - Security Hardening