Linux 服务器遭遇 SYN Flood 攻击怎么用 iptables 防御?

文章导读
面对 SYN Flood 攻击,最直接的止损方式是在内核层开启 SYN Cookies 配合 iptables 限制新建连接速率,但这仅适用于中小流量攻击,大流量需依赖上游清洗。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

面对 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

如果数量异常高且持续不降,可能存在攻击。

Linux 服务器遭遇 SYN Flood 攻击怎么用 iptables 防御?

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. 持久化规则
重启后规则会丢失,需根据发行版保存配置,并注意防火墙服务冲突:

Linux 服务器遭遇 SYN Flood 攻击怎么用 iptables 防御?
  • 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 是否仍能建立连接。

Linux 服务器遭遇 SYN Flood 攻击怎么用 iptables 防御?

常见坑

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