TCP协议攻击中最常见的是SYN Flood攻击。攻击者利用TCP三次握手特性,向服务器发送大量SYN包,但不回应第三次握手ACK。服务器会为每个SYN请求分配内存资源建立半连接,并等待ACK。当资源耗尽时,服务器无法处理新的正常连接请求,导致服务不可用。
本文将通过调整Linux内核参数优化TCP/IP协议栈处理能力,并配合iptables防火墙进行流量清洗,实现零成本、高可用的TCP攻击防护。所有操作均基于CentOS 7/8或Ubuntu 18.04/20.04环境,无需安装额外软件。
内核参数调优是防护的第一道防线。通过修改/etc/sysctl.conf文件,我们可以缩短超时时间、开启SYN Cookies机制、扩大队列长度,从而大幅提升系统抗攻击能力。
SYN Cookies是Linux内核内置的一种防护机制。当SYN队列满时,内核不再分配资源存储连接状态,而是根据特定算法生成一个“Cookie”作为序列号返回。如果客户端是真实的,它会回复ACK,内核验证ACK中的Cookie合法性后建立连接。
在/etc/sysctl.conf文件末尾添加以下内容:
开启SYN Cookies,当SYN队列满时自动启用
net.ipv4.tcp_syncookies = 1
默认情况下,Linux的半连接队列(SYN Queue)和全连接队列(Accept Queue)较小,且超时重试时间过长。我们需要根据服务器内存大小调整这些参数。
在/etc/sysctl.conf中继续添加以下配置:
增加SYN队列长度,建议设置为8192或更大,取决于内存大小
net.ipv4.tcp_max_syn_backlog = 8192
增加全连接队列长度,默认通常为128,建议提升至4096
net.core.somaxconn = 4096
减少SYN ACK重试次数。默认为5次(约18秒),攻击时会迅速占满资源,建议改为2次
net.ipv4.tcp_synack_retries = 2
减少主动建立连接的重试次数,默认为6次,建议改为2次
net.ipv4.tcp_syn_retries = 2
当SYN队列满时,直接发送RST包复位连接,而不是默默丢弃
这能防止合法用户长时间等待,但需确保应用层能处理连接重置
net.ipv4.tcp_abort_on_overflow = 1
高并发或攻击状态下,服务器作为客户端访问后端服务(如数据库、API)时可能会耗尽本地临时端口。大量TIME_WAIT状态的连接也会消耗文件描述符。
扩大本地临时端口范围,默认为32768-60999,扩大到1024-65535
net.ipv4.ip_local_port_range = 1024 65535
开启TIME_WAIT套接字的快速回收。注意:在NAT环境下可能引发问题,通常建议开启reuse即可
net.ipv4.tcp_tw_reuse = 1
允许将TIME_WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_tw_recycle = 0
配置文件修改完成后,执行以下命令使配置立即生效,无需重启服务器:
sysctl -p
执行后若无报错,说明参数已成功加载。可以使用sysctl net.ipv4.tcp_syncookies命令验证具体数值是否已更新。
虽然内核参数能提升抗压能力,但如果攻击流量带宽极大,仍会消耗CPU和网卡资源。我们需要使用iptables的recent或hashlimit模块,对SYN包的频率进行限制。
以下规则将限制每个IP地址在每秒最多发起100个SYN连接请求,超过限制的SYN包将被直接丢弃。这里使用hashlimit模块,因为它比limit模块更高效且支持针对单个IP的限速。
执行以下命令配置防火墙规则:

1. 创建一个名为SYN_FLOOD的哈希表,用于记录源IP
--hashlimit-above: 每秒超过100个包即触发限制
--hashlimit-burst: 初始允许的突发包数量为150
--hashlimit-mode srcip: 基于源IP地址进行计算
--hashlimit-name: 名字
--hashlimit-expire: 记录过期时间
iptables -A INPUT -p tcp --syn -m hashlimit \
--hashlimit-name syn_flood \
--hashlimit-above 100/sec \
--hashlimit-burst 150 \
--hashlimit-mode srcip \
--hashlimit-expire 3000 \
-j DROP
2. 允许已建立的连接和相关连接通过
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
3. 注意:请确保在规则末尾有允许特定端口(如80, 443, 22)的规则,否则可能导致服务不可用
例如:iptables -A INPUT -p tcp --dport 80 -j ACCEPT
注意:如果你的服务器默认策略是DROP,请确保上述规则插入在正确的位置。如果是CentOS 7,默认使用firewalld,建议直接使用iptables-services或nftables,或者临时关闭firewalld:systemctl stop firewalld。
默认情况下,iptables规则重启后会丢失。执行以下命令永久保存规则:
CentOS 7
service iptables save
Ubuntu/Debian
iptables-save > /etc/iptables/rules.v4
如果提示目录不存在,需先安装iptables-persistent:
apt-get install iptables-persistent -y
配置完成后,我们需要验证防护是否生效,并掌握如何查看当前遭受攻击的情况。
当服务器遭受SYN Flood攻击时,会有大量处于SYN_RECV状态的连接。使用以下命令统计当前半连接数量:
netstat -ant | grep SYN_RECV | wc -l
或者使用更快的ss命令:
ss -ant | grep SYN_RECV | wc -l
如果该数值持续保持在几百上千且不下降,说明正在遭受攻击或并发极高。此时应检查内核参数是否已生效。
我们可以通过查看内核统计信息,确认SYN Cookies是否在工作以及有多少包被丢弃:
netstat -s | grep "SYN cookies"
输出示例:12345 SYN cookies sent,表示内核已经发送了1万多个SYN Cookie,说明防护机制已被触发。
查看iptables规则匹配到的包数量和字节数,确认限速规则是否在拦截流量:
iptables -L INPUT -v -n | grep hashlimit
观察pkts(包数量)和bytes列,如果数值在快速增加,说明iptables正在拦截恶意流量。
为了方便快速部署,以下提供了一个完整的Bash脚本。该脚本会自动备份原配置,应用上述所有内核参数,并配置iptables规则。请将以下内容保存为tcp_protect.sh,赋予执行权限后运行。
!/bin/bash
TCP攻击防护一键部署脚本
适用于 CentOS 7/8, Ubuntu 18.04+
echo "开始配置TCP内核参数..."
备份原配置
cp /etc/sysctl.conf /etc/sysctl.conf.bak_$(date +%F)
检查并追加配置,避免重复
if ! grep -q "net.ipv4.tcp_syncookies = 1" /etc/sysctl.conf; then
cat >> /etc/sysctl.conf </dev/null; then
iptables -A INPUT -p tcp --syn -m hashlimit --hashlimit-name syn_flood --hashlimit-above 100/sec --hashlimit-burst 150 --hashlimit-mode srcip -j DROP
echo "iptables限速规则已添加。"
else
echo "iptables规则已存在,跳过。"
fi
保存规则
if [ -f /etc/redhat-release ]; then
service iptables save 2>/dev/null || echo "请手动保存iptables规则或安装iptables-services"
else
iptables-save > /etc/iptables/rules.v4 2>/dev/null || echo "请手动保存iptables规则或安装iptables-persistent"
fi
echo "所有防护配置已部署完成!"
echo "当前SYN_RECV连接数:"
netstat -ant | grep SYN_RECV | wc -l
执行命令:
chmod +x tcp_protect.sh
./tcp_protect.sh
该脚本执行完毕后,服务器即具备了基础的TCP SYN Flood攻击防护能力。在真实攻击场景下,建议结合云厂商的清洗服务或专业硬件防火墙使用,以应对超大带宽的流量攻击。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图