传输层防护对TCP异常握手做限速与验证,本质是给半开连接队列装上“限流阀”和“身份闸机”,让伪造SYN包无法占满资源,真实客户端能正常完成三次握手。
传输层限速和防火墙对比:哪个更适合拦TCP异常握手?
很多运维遇到SYN Flood,第一反应是上防火墙,防火墙能拦,但它更像小区门卫,看“来者是谁”;传输层限速和验证像电梯限重和刷卡,直接控制“同时能进多少人”和“你是不是真住户”。
- 防火墙侧重包过滤、黑名单、特征匹配,对海量伪造源IP的异常握手,规则更新往往滞后。
- 传输层限速直接控制SYN包到达速率,超出阈值的请求直接丢弃或延迟响应。
- 传输层验证通过SYN Cookie、首包丢弃重传等方式,判断客户端是否真实存在,不只看IP信誉。
| 能力 | 传统防火墙 | 传输层限速+验证 |
|---|---|---|
| 拦截伪造源IP | 依赖规则库 | 限速天然压制 |
| 保护半开连接队列 | 间接 | 直接 |
| 误伤正常用户 | 可能 | 可通过白名单降低 |
行业共识认为,单纯的防火墙策略在高强度异常握手攻击下防护效果有限,传输层限速与验证才是更贴近协议栈的解法。
TCP异常握手怎么防护?先看三次握手哪里会被滥用
TCP三次握手第一步是客户端发SYN,服务端收到后把连接信息放进半开连接队列,回复SYN+ACK,等客户端ACK,问题出在这个“等”字。
- 攻击者发一个SYN就消失,服务端会重试数次,每次重试间隔翻倍。
- 半开连接队列长度有限,默认值往往只有几百到几千。
- 队列占满后,新的正常SYN只能被丢弃,表现为网站打不开、服务超时。
所以防护要解决两件事:别让队列被瞬间塞满(限速),别把资源浪费在假客户端身上(验证)。
限速解决“进多快”
限速不判断好坏,只控制速率,攻击流量再大,单位时间内能进入协议栈的SYN包数量被锁死,半开连接队列就有喘息空间。
验证解决“进谁”
验证判断客户端是否真实存在,真实客户端会完成握手,假源IP不会回ACK,自然被淘汰。
服务器防SYN Flood配置:Linux内核参数实操
Linux内核自带参数,可以直接对TCP异常握手做限制和验证,以下配置在CentOS、Ubuntu等主流发行版通用。
- 开启SYN Cookie:
net.ipv4.tcp_syncookies = 1,队列快满时,服务端不再为每个SYN分配完整资源,而是用算法生成特殊序列号,只有收到正确ACK才建立连接。 - 加大半开连接队列:
net.ipv4.tcp_max_syn_backlog = 8192,但别盲目往大调,内存和文件描述符会跟着涨。 - 减少SYN+ACK重试次数:
net.ipv4.tcp_synack_retries = 2,攻击者不回应,服务端少等几轮,队列释放更快。 - 开启时间戳:
net.ipv4.tcp_timestamps = 1,有助于SYN Cookie校验。
修改后执行 sysctl -p 生效。
另外还可用iptables限速:
iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst 20 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
上面命令表示每秒最多放行10个新建连接请求,突发最多20个,这样即使攻击流量进来,半开连接队列也不会被瞬间冲垮。
iptables limit与recent模块配合
还可以用recent模块按源IP限速:
iptables -A INPUT -p tcp --syn -m recent --set iptables -A INPUT -p tcp --syn -m recent --update --seconds 60 --hitcount 10 -j DROP
单个IP在60秒内发起超过10次新建连接就丢弃,对分布式慢速攻击也有效。
传输层验证的两种思路:Cookie与反向探测
SYN Cookie:用算法代替内存
SYN Cookie核心是不存状态,服务端回复的SYN+ACK序列号里编码了源IP、端口、时间戳等信息,收到客户端ACK时再解码验证,假客户端不会回ACK,自然不占资源,它适合在队列压力大时自动启用,平时仍走正常握手流程。
首包丢弃与重传验证
一些高防设备会把第一个SYN包直接丢弃,等客户端重传,真实客户端操作系统会自动重传SYN,而很多攻击脚本发一次就换源,不会重传,这个方法简单有效,但对网络质量差的用户可能增加首次连接延迟,所以一般只在攻击期间开启。
限速阈值怎么定?结合业务场景和地域分布
阈值没有万能数字,需要观察正常业务的连接速率。
- 小型API服务,正常每秒新建连接可能只有几十,阈值设在100~200较为安全。
- 大型门户或游戏登录服,突发可达数千,需要结合监控历史峰值设置。
- 对于北京服务器防攻击方案,如果业务用户集中在华北,可以按地域做访问分级:北京、天津等本地源IP给较高阈值,其他地区给较低阈值。
- 抗DDoS防护价格通常按防护峰值带宽和清洗流量计费,传输层限速能在一定程度上降低对昂贵清洗带宽的依赖,让预算花在刀刃上。
用监控数据反推阈值
执行 netstat -s | grep -i syn 能看到SYN相关统计,观察正常时段的SYN接收速率,再乘以安全系数,比如正常峰值50/s,阈值放100/s就有余量,又不会给攻击者太大空间。
部署后的验证与监控
改完配置不能拍脑袋说生效了,要实际验证。
- 查看半开连接数:
看ss -s
synrecv或SYN-RECV状态数量。 - 查看SYN统计:
netstat -s | grep -i syn,观察SYNs to LISTEN sockets dropped是否还在涨。 - 模拟攻击:用
hping3 -S --flood -p 80 目标IP从测试机打少量流量,看服务是否还能正常访问。 - 抓包验证:
tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'看SYN包速率是否被限制。
监控建议把半开连接数、SYN接收速率、丢包数做成趋势图,阈值触发告警,告警可以接企业微信或邮件,避免攻击发生半小时后才后知后觉。
Q&A:TCP异常握手怎么防护常见问题
限速会误伤正常用户吗?
会,但可通过白名单和阈值调优降低,比如把办公网出口、合作方IP加入白名单,或者把限速阈值设置在正常峰值的两倍以上,限速本质是牺牲少量异常流量下的用户体验,换取整体可用性。
传输层限速和防火墙对比,高防IP有什么区别?
高防IP是更高层级的清洗服务,通常部署在云端入口,把攻击流量引走清洗后再回源,传输层限速和验证部署在源站或本地网关,解决源站本身的资源保护,两者配合使用:高防IP挡住大流量,源站传输层限速兜底漏网流量。
服务器防SYN Flood配置需要买抗DDoS防护吗?价格如何?
如果攻击流量超过源站带宽,单靠服务器配置是扛不住的,需要抗DDoS防护,抗DDoS防护价格差异较大,基础版可能每年几百元,高防IP按保底防护峰值和弹性计费,较大规模防护每月费用可能从数千元到数万元不等,具体选型取决于业务预算和攻击历史。
传输层限速与验证不是一次性配置,而是要和业务波动、攻击态势持续磨合,把半开连接队列守好,TCP异常握手就翻不起大浪。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/637143.html





