SYN洪水攻击是网络运维中最常见且令人头痛的问题之一,它利用TCP三次握手的机制漏洞,大量发送伪造的SYN请求,迅速占满服务器的半连接队列,导致正常用户无法建立连接。Linux系统虽然内置了部分防御能力,但默认参数往往难以应对真实攻击场景。本文将从内核参数调优、防火墙规则配置以及持久化设置三个维度,逐步加固服务器的SYN攻击防御体系。
一、默认SYN配置
首先,我们需要查看当前系统的SYN相关默认参数。执行以下命令即可获取关键信息:
sysctl -a | grep _syn net.ipv4.tcp_max_syn_backlog = 1024 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_synack_retries = 5 net.ipv4.tcp_syn_retries = 5
这些参数的含义非常明确:tcp_max_syn_backlog代表半连接队列的最大长度,默认1024在遭受攻击时明显不足;tcp_syncookies是防御SYN攻击的核心开关,开启后可通过计算Cookie来缓解攻击,默认已经启用,这是一个好现象;tcp_synack_retries和tcp_syn_retries分别控制SYN+ACK及SYN的重试次数,默认各为5次,这意味着当连接失败时内核会反复重试,大量消耗系统资源,因此攻击场景下必须降低这些数值。
二、修改SYN配置
接下来,我们对这些内核参数进行调整,使其具备更强的抗攻击能力。首先增大系统文件描述符限制,然后修改核心参数:
ulimit -HSn 65535 sysctl -w net.ipv4.tcp_max_syn_backlog=2048 sysctl -w net.ipv4.tcp_syncookies=1 sysctl -w net.ipv4.tcp_synack_retries=2 sysctl -w net.ipv4.tcp_syn_retries=2
此处我们将半连接队列从1024扩容至2048,以应对更大的突发连接请求;syncookies保持开启状态;同时将两个重试次数从5降低到2,让内核能够更快地放弃无效连接并释放占用的资源。需要注意的是,ulimit命令仅对当前会话生效,生产环境中还需在/etc/security/limits.conf文件中进行持久化配置。
三、添加防火墙规则
仅靠内核参数调整还不够,防火墙规则同样不可或缺。使用iptables对SYN包的速率进行限制,同时检测端口扫描行为并防范Ping洪水攻击:
#Syn 洪水攻击(--limit 1/s 限制syn并发数每秒1次) iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT #防端口扫描 iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT #防洪水ping iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
第一条规则将入站SYN包的速率限制为每秒最多1个,超出部分将被直接丢弃,从而有效拦截大多数低成本的洪水攻击;第二条规则针对异常的RST包进行限速,防止端口扫描工具利用RST包探测开放端口;第三条规则对ICMP Echo请求进行限速,避免Ping洪水耗尽网络带宽。当然,这只是一个基础配置模板,实际生产环境需要根据自身流量模型合理调整限速阈值。
四、添加开机启动
最后,务必将这些配置写入开机自启动脚本,否则系统重启后所有防御参数都会失效。将第二步和第三步的命令追加到/etc/rc.d/rc.local文件中,并赋予该文件执行权限。这样,每次服务器启动时,上述SYN攻击防御措施就会自动加载并生效。
