传输层想在不误杀前提下拦掉异常新连接,核心不是“见陌生就丢”,而是把连接建立拆成握手验证、首包识别、动态限速三步,先验证再拒绝,先限速再隔离,正常业务就能照常建立连接。
传输层怎么拦截异常新连接不误杀?先分清“异常”与“陌生”
传输层面对的新连接,本质是第一个SYN报文带来的建立请求,很多运维把“陌生IP发来的SYN”直接当成异常,这其实是误杀的最大来源,正常用户换网络、App重新启动、小区NAT出口集体上线,都会产生陌生新连接。
- 正常新连接:三次握手能完成,首包带业务特征,速率可能有突发但很快回落。
- 异常新连接:高频SYN但不回ACK,首包垃圾或空载荷,同一来源短时间大量新建却无后续流量。
- 容易被误杀的新连接:游戏玩家掉线重连、CDN节点回源、移动网络IP池切换、办公网出口集中访问。
一旦把“陌生”直接等同于“异常”,就会出现封禁整个小区出口、误伤正常用户重连、把CDN回源当攻击丢掉的状况,传输层拦截要解决的不是“敢不敢封”,而是“封之前能不能多看一眼”。
syn flood攻击防护方法里,先让握手可验证
SYN Cookie:不急着分配资源
SYN Flood的杀伤力在于让服务器为半开连接分配大量内存,传输层最成熟的防御不是封IP,而是启用SYN Cookie,服务器收到SYN后不立即分配连接资源,只回一个带校验信息的SYN-ACK,只有收到合法ACK,才真正建立连接。
- 半开连接不再消耗内存。
- 正常用户完成握手不受影响。
- 攻击工具多数只发SYN不回ACK,会直接被过滤。
行业共识认为,在SYN Flood场景下,先启用SYN Cookie比直接封禁来源IP更不容易误伤正常用户,这是传输层“不误杀”的第一道保险。
首包指纹:看它开口说的第一句
握手完成后,传输层还能看连接建立后的第一个数据包,正常业务的首包通常有明显特征:TLS ClientHello长度固定、HTTP请求头完整、游戏协议带版本号、物联网设备带固定标识,异常流量往往首包随机、空载荷、协议头残缺。
- 对首包长度做白名单,比如只放行1200到1600字节的ClientHello。
- 对首包字节特征做匹配,不符合业务协议的直接丢弃。
- 对首包时间做观察,连接建立后超过2秒不发数据的进入观察池。
这个动作不需要解密业务内容,只看传输层之上的首包形状,就能拦掉相当一部分扫描器和僵尸网络,正常客户端不会因为首包被多看一眼而掉线。
源认证:给正常用户一次重试机会
触发限速阈值后,最差的做法是直接DROP,更好的策略是回一个带挑战的响应,比如强制重新握手,或者发送TCP RST要求重新连接,真实用户的操作系统会自动重试,攻击脚本往往不会处理这种交互。
- 首次触发:标记来源IP,回RST或SYN-ACK挑战。
- 二次触发:进入限速队列,只允许每10秒建立1个新连接。
- 持续触发:临时隔离5到10分钟,自动解封。
这样即使误伤了正常用户,也能通过重连快速恢复,不会造成长时间掉线。
iptables限制新连接操作步骤:给正常业务留快速通道
先加白名单,再谈限速
在配置任何限速规则前,必须先把确定可信的来源加白,否则规则一上线,CDN回源、内部服务调用、监控探活都会先被打掉。
iptables -A INPUT -s 10.0.0.0/8 -j ACCEPT iptables -A INPUT -s 业务对端IP -j ACCEPT iptables -A INPUT -p tcp --dport 443 -m state --state ESTABLISHED,RELATED -j ACCEPT
白名单不是一劳永逸,但能把误杀范围从“所有来源”缩小到“真正需要监控的外部IP”。
用recent模块做观察-限速-隔离
对于外部来源,建议用三层递进规则,而不是直接封禁。
# 第一步:记录新连接来源 iptables -A INPUT -p tcp --syn -m state --state NEW -m recent --set --name NEWCONN # 第二步:60秒内新建超过30次的,进入验证池 iptables -A INPUT -p tcp --syn -m state --state NEW -m recent --update --seconds 60 --hitcount 30 --name NEWCONN -j RETURN # 第三步:超过验证池阈值的,只限制速率,不直接DROP iptables -A INPUT -p tcp --syn -m limit --limit 5/s --limit-burst 20 -j ACCEPT iptables -A INPUT -p tcp --syn -j DROP
这里的逻辑是:先让大部分正常连接通过,只有持续超速的来源才被限制,最后一条DROP只是兜底,前面已经给了白名单、验证池、限速三道缓冲。
把DROP换成限速和跳转
很多误杀来自一条简单的-j DROP,当一条规则直接丢弃所有超过阈值的新连接时,正常用户的突发热点访问也会被丢,更稳的做法是:
- 对超阈值的来源跳转到限制链。
- 在限制链里用
--limit限制每秒放行数量。 - 对限制链里的连接缩短超时时间,让它占不满资源。
用nftables会更灵活:
nft add rule ip filter input tcp flags syn limit rate over 50/second burst 100 packets jump slowpath nft add rule ip filter slowpath tcp flags syn limit rate 10/second burst 20 packets accept nft add rule ip filter slowpath drop
这样正常业务即使突发,只要不超过burst上限就能通过;超过后也不是全断,只是变慢。
不误杀的现场设计:按业务画像下规则
北京服务器被攻击怎么处理
以北京机房服务器为例,如果业务只面向国内用户,却突然出现大量海外IP的新连接,不需要全局封禁,可以按地域来源提高验证级别:
- 国内主要省份来源:正常限速。
- 海外来源:先过SYN Cookie,再补一次源认证。
- 数据中心IP来源:直接跳转慢速池。
这样不会因为北京出口带宽被攻击,就把本地正常用户连接一起丢掉,地域策略要在机房上层清洗基础上做补充,不能只靠本机iptables。
长连接业务要单独放行
游戏、直播、物联网这类长连接业务,新连接速率天然比普通网站高,玩家集体掉线重连时,同一IP可能在几秒内发起几十个新连接,如果按普通网站的每秒10个阈值限速,正常玩家会被直接限死。
- 对长连接端口设置更高的burst,比如每秒200个。
- 对首包带客户端版本号的连接直接放行。
- 对连接建立后10秒内有心跳或认证包的来源解除观察。
误杀往往不是规则太松,而是阈值和业务不匹配。
高防IP价格一般多少?先做本机分级拦截再决定
不少团队遇到连接耗尽型攻击,第一反应是买高防IP,高防IP的价格按防护峰值和带宽计费,对于小型业务来说,这笔投入不一定马上需要,先在传输层把SYN Cookie、首包指纹、限速和源认证做好,就能挡掉相当一部分连接型攻击,等到出现大规模流量型攻击,再按需采购高防,能避免提前花冤枉钱。
误杀红线:传输层和网络层防护哪个更容易误杀
网络层只能看到IP和包量,一个IP后面可能藏着几千个正常用户,传输层能看到端口、握手状态、首包内容,误杀概率更低。
| 处理方式 | 异常拦截效果 | 正常用户影响 | 运维成本 |
|---|---|---|---|
| 直接封IP | 高 | 高 | 低 |
| 仅限速 | 中 | 中 | 低 |
| 握手验证+首包指纹+动态限速 | 较高 | 低 | 中 |
业内专家指出,多数误杀不是技术选型错误,而是把“临时限速”做成了“长期封禁”,没有给正常连接恢复路径,保住恢复路径,就保住了不误杀的底线。
Q&A:传输层拦异常新连接常见疑问
传输层拦异常新连接会影响正常用户重连吗?
如果只靠固定阈值封IP,会,正确的做法是首次触发阈值后不直接DROP,而是进入验证池,要求重新完成握手或首包校验,正常用户的操作系统会自动重试,攻击脚本大多不会处理验证,所以正常重连可以恢复。
为什么限速阈值设得越低越容易误杀?
阈值低意味着正常业务的突发流量更容易触顶,一个大型NAT出口可能在促销、晚高峰、游戏更新时产生大量新连接,单看每秒新建数量,它和攻击流量很像,阈值要按业务波峰来设,而不是按平均值来设。
传输层和网络层防护哪个更适合拦新连接?
传输层更适合,它能识别端口、TCP状态和首包内容,可以在连接还没完全建立时进行验证和限速,网络层只能按IP和包量处理,很容易把共享出口的正常用户一起丢掉,传输层的核心优势是把拦截动作放到了资源分配之前,这是网络层做不到的。
传输层的拦截逻辑不是“宁可错杀”,而是“先验证、再限速、后隔离”,守住这个顺序,异常新连接很难打进来,正常连接也不会被误丢。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/637009.html





