当前位置:网站首页 >  攻略

Linux服务器TCP攻击防护实战配置全流程

时间:2026年05月25日 01:20:26 来源:易频IT社区

1. 核心防护机制与原理简述

TCP协议攻击中最常见的是SYN Flood攻击。攻击者利用TCP三次握手特性,向服务器发送大量SYN包,但不回应第三次握手ACK。服务器会为每个SYN请求分配内存资源建立半连接,并等待ACK。当资源耗尽时,服务器无法处理新的正常连接请求,导致服务不可用。

本文将通过调整Linux内核参数优化TCP/IP协议栈处理能力,并配合iptables防火墙进行流量清洗,实现零成本、高可用的TCP攻击防护。所有操作均基于CentOS 7/8或Ubuntu 18.04/20.04环境,无需安装额外软件。

2. Linux内核参数深度调优

内核参数调优是防护的第一道防线。通过修改/etc/sysctl.conf文件,我们可以缩短超时时间、开启SYN Cookies机制、扩大队列长度,从而大幅提升系统抗攻击能力。

2.1 开启SYN Cookies防护

SYN Cookies是Linux内核内置的一种防护机制。当SYN队列满时,内核不再分配资源存储连接状态,而是根据特定算法生成一个“Cookie”作为序列号返回。如果客户端是真实的,它会回复ACK,内核验证ACK中的Cookie合法性后建立连接。

/etc/sysctl.conf文件末尾添加以下内容:

 开启SYN Cookies,当SYN队列满时自动启用
net.ipv4.tcp_syncookies = 1

2.2 优化连接队列与超时时间

默认情况下,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

2.3 增加本地端口范围与TIME_WAIT复用

高并发或攻击状态下,服务器作为客户端访问后端服务(如数据库、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

2.4 应用内核参数配置

配置文件修改完成后,执行以下命令使配置立即生效,无需重启服务器:

sysctl -p

执行后若无报错,说明参数已成功加载。可以使用sysctl net.ipv4.tcp_syncookies命令验证具体数值是否已更新。

3. 利用iptables限制SYN请求频率

虽然内核参数能提升抗压能力,但如果攻击流量带宽极大,仍会消耗CPU和网卡资源。我们需要使用iptables的recenthashlimit模块,对SYN包的频率进行限制。

3.1 配置iptables规则

以下规则将限制每个IP地址在每秒最多发起100个SYN连接请求,超过限制的SYN包将被直接丢弃。这里使用hashlimit模块,因为它比limit模块更高效且支持针对单个IP的限速。

执行以下命令配置防火墙规则:

Linux服务器TCP攻击防护实战配置全流程

 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-servicesnftables,或者临时关闭firewalld:systemctl stop firewalld

3.2 保存iptables规则

默认情况下,iptables规则重启后会丢失。执行以下命令永久保存规则:

 CentOS 7
service iptables save
Ubuntu/Debian
iptables-save > /etc/iptables/rules.v4
如果提示目录不存在,需先安装iptables-persistent:
apt-get install iptables-persistent -y

4. 配置生效与状态验证

配置完成后,我们需要验证防护是否生效,并掌握如何查看当前遭受攻击的情况。

4.1 检查当前SYN连接状态

当服务器遭受SYN Flood攻击时,会有大量处于SYN_RECV状态的连接。使用以下命令统计当前半连接数量:

netstat -ant | grep SYN_RECV | wc -l

或者使用更快的ss命令:

ss -ant | grep SYN_RECV | wc -l

如果该数值持续保持在几百上千且不下降,说明正在遭受攻击或并发极高。此时应检查内核参数是否已生效。

4.2 查看被丢弃的SYN包

我们可以通过查看内核统计信息,确认SYN Cookies是否在工作以及有多少包被丢弃:

netstat -s | grep "SYN cookies"

输出示例:12345 SYN cookies sent,表示内核已经发送了1万多个SYN Cookie,说明防护机制已被触发。

4.3 查看iptables限速命中情况

查看iptables规则匹配到的包数量和字节数,确认限速规则是否在拦截流量:

iptables -L INPUT -v -n | grep hashlimit

观察pkts(包数量)和bytes列,如果数值在快速增加,说明iptables正在拦截恶意流量。

5. 一键自动化部署脚本

为了方便快速部署,以下提供了一个完整的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号 网站地图