在实际运维中,SYN Flood攻击作为一种最常见的DoS攻击方式,攻击者通过大量伪造的SYN请求迅速填满服务器的连接队列,导致正常用户无法建立连接。针对Ubuntu系统,使用iptables进行防护是一种成本低且效果显著的方案。以下将直接介绍几个关键配置步骤。

第一招:启用SYN Cookies。从技术角度看,SYN Cookies能够在服务器内存紧张时,通过无状态方式处理半开连接,防止连接队列被耗尽。以下是具体的iptables规则配置:
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
这两条规则的作用十分明确:首先限制每秒通过的SYN包数量(每秒1个,允许3个突发),然后将匹配新连接状态的请求交由SYNPROXY处理,本质上是在内核层面启用了SYN Cookies功能。需要注意的是,第二条规则依赖于conntrack模块和SYNPROXY目标,如果内核版本较新,通常可以正常运行。
第二招:限制单个IP的连接速率。许多攻击源自少数IP地址发起的大流量,这时可以利用limit模块进行速率限制:
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -m conntrack --ctstate NEW -j DROP
这两条规则组合后的效果是:每个源IP每秒最多允许1个新SYN包(允许突发3个),超出限制的请求将被丢弃。在实际参数调整时,需要结合正常业务流量,避免误伤合法用户的请求。
第三招:丢弃无效的SYN包。攻击者有时会发送带有异常TCP标志的数据包以绕过检测,直接丢弃这些包是最简单的处理方式:
sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
第一条规则丢弃所有TCP标志位全为0的包,第二条规则丢弃所有标志位全为1的包——正常TCP握手过程中不会出现这类数据包,因此可以安全地丢弃。
第四招:调整内核参数,从系统层面提升抗压能力。iptables仅负责过滤,而内核的SYN队列(backlog)大小决定了系统能同时承受多少半开连接:
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=2048
sudo sysctl -w net.ipv4.tcp_synack_retries=2
sudo sysctl -w net.ipv4.tcp_syncookies=1
这里将SYN队列长度调整为2048,SYN+ACK重试次数减少至2次(缩短等待时间),同时强制启用SYN Cookies。这些参数配合上述iptables规则,基本能够应对中小规模的SYN Flood攻击。
需要特别提醒:规则中使用的limit、conntrack、SYNPROXY等模块,在不同内核版本和Linux发行版中的支持程度可能不同,建议先在测试环境中进行验证。另外,sysctl命令写入的参数是临时生效的,如需持久化请修改 /etc/sysctl.conf 文件。总之,安全配置不存在万能方案,结合实际流量模型进行微调才是关键。
