周六凌晨两点十七分,我手机上的监控告警开始连环轰炸。一个朋友经营的电商小站突然网页打不开,入口带宽被打满,服务器CPU持续100%,客服群里全是用户发来的加载失败截图。第一反应是代码出问题了,查了一圈才发现,流量层面的异常才是真凶——有人在对他的源站IP做DDoS攻击。那次之后,我才真正弄明白高防IP这个产品到底在解决什么问题:它要让网页在攻击洪流中依然保持正常运行。这篇文章就沿着这条主线,把高防IP的运作机制、接入流程、验证方法和常见坑点完整拆开讲一遍,适合正在排查网站打不开问题的站长,也适合准备上高防方案的技术负责人。
1. 网页打不开的本质:攻击流量是怎么把你的服务挤垮的
很多人第一次遇到网站被打瘫时,第一反应也是改代码、加缓存、重启服务,折腾半天才发现流量根本没断过,只是全部变成了恶意流量。要理解高防IP为什么管用,得先从攻击流量怎么把一台服务器挤垮说起。
1.1 三种最常见的攻击模式
DDoS攻击不是只有一种打法,从影响层面看,大致可以分成三类:打带宽的、打连接数的、打应用资源的。它们的目标其实都是同一个:耗尽某个环节的资源,让正常请求进不来或处理不了。
第一类是带宽型攻击。攻击者用大量的UDP包、ICMP包或者DNS放大包,把出口带宽填满。一台普通服务器的公网带宽可能只有几十Mbps到几百Mbps,而攻击流量往往几个Gbps起步。带宽被占满后,别说网页请求,连SSH登录都会变成龟速。这类攻击最粗暴,也最容易判断——你去看网卡流量,会发现数字高得离谱。
第二类是连接型攻击。典型代表是SYN Flood和TCP全连接攻击。服务器处理TCP连接要靠内核维护连接状态表,每来一个连接都要占一条记录。攻击者伪造海量IP发起连接请求,但不完成握手,或者完成了握手之后只挂机不发送数据。连接表被占满后,正常用户的TCP连接根本排不上队,网页自然打不开。这类攻击打的是操作系统的并发上限,哪怕带宽没满,服务器也会失去响应。
第三类是应用层攻击。这类攻击最难防,因为它看起来就像真实用户在访问。攻击者用大量代理IP去请求首页、搜索接口、登录接口,每次请求都要消耗CPU、内存、数据库连接。慢速攻击则是一个连接建立之后,故意以极慢的速度吐数据,把服务器的并发连接池一点点耗尽。这类攻击流量不大,但能把应用层直接拖垮。
| 攻击类型 | 典型手段 | 主要消耗资源 | 表现特征 |
|---|---|---|---|
| 带宽型 | UDP Flood、ICMP Flood、DNS放大 | 公网带宽 | 带宽被打满,网卡流量异常高 |
| 连接型 | SYN Flood、TCP全连接 | 内核连接表、并发连接数 | 大量半连接或空连接,正常连接进不来 |
| 应用层 | HTTP Flood、慢速攻击 | CPU、内存、数据库连接 | 流量不大,但请求数奇高,页面响应缓慢 |
1.2 为什么普通服务器在DDoS面前一碰就碎
原因说白了就四个字:资源不对等。一台服务器的带宽、连接数、CPU线程数都是有限的,而攻击者可以动用成千上万台肉鸡或云主机形成流量洪峰。对方花几十块钱就能持续打几个小时,你要扛住这个量,就得买比对方贵得多的带宽和机器,这种防御成本是普通网站根本承受不起的。
更麻烦的是,常规手段在DDoS面前非常乏力。CDN能缓存静态资源,但动态请求和登录接口最终还是得回源;防火墙和安全组只能按IP或端口做静态规则,面对不断变化的攻击源IP基本没辙;限制IP并发又容易误伤正常用户。只要源站IP直接暴露在公网,攻击者就有的是办法绕过这些设施直捣黄龙。
所以业界的标准思路,是在源站前面再加一道更粗的管道、更强壮的处理车间——这就是高防IP存在的意义。它不等同于普通CDN,也不是简单的一台高配服务器,而是一套专门为抗流量攻击设计的网络接入与清洗体系。
2. 高防IP的看家本领:牵引、清洗、回源这三板斧
高防IP的整个工作链路,可以用三个词概括:牵引、清洗、回源。理解这三步,基本就理解了这个产品八成的工作原理。
2.1 牵引:从DNS解析那一刻就把流量改道
正常情况下,用户访问你的网页,DNS会把域名解析到源站服务器的公网IP,流量直接打到你的服务器上。攻击者只要拿到了这个IP,就能绕开所有中间环节直接攻击源站。
接入高防IP后,第一步就是把域名的A记录改成服务商提供的高防IP。解析一改,所有用户流量先到达高防节点,而不是你的源站。用户并不会感知到任何差异,因为从浏览器视角看,它只是访问了一个返回网页的IP。
这里的关键点在于高防节点不是一台机器,而是一套分布式网络。服务商通常会用BGP多线路接入,把同一个高防IP广播到多个核心机房。攻击流量到达时,会被分散到不同区域的清洗节点就近处理。好处是单点扛不住时,流量可以在更大范围内均衡,真正实现"用整个网络帮你分摊压力"。你可以把它理解为:以前访客都直接进你家门,现在所有人都先到小区门口的安保中心,确认身份后才被引导进屋。
2.2 清洗:哪些流量该放行,哪些该丢掉
流量被牵引到高防节点后,接下来就是清洗集群的工作。清洗系统会把流量镜像到旁路检测设备,做实时分析,判断哪些是恶意流量、哪些是正常访问。
这套判断机制是分层的。底层做协议栈校验,比如验证TCP握手是否完整、IP包头的长度和校验和是否合法,很多伪造流量在这一层就会被识别并丢弃。再往上做行为分析,看访问频率、请求间隔、User-Agent是否合理、Cookie是否带得上,判断它是不是真实浏览器在访问。还有IP信誉库,把历史攻击源IP段、已知代理IP段直接列入黑名单。
不同类型攻击的清洗动作也不同:SYN Flood可以启用SYN Cookie技术,让源站在完成握手前不分配连接资源;UDP Flood直接按来源IP限速,超量就丢包;HTTP Flood则通过连速限制、滑块验证、指纹识别等手段拦截。清洗最终的目标,是让进入回源链路的流量里,恶意成分被压到最低。
这里要解释一个很多人误解的地方:高防IP不是"检测到攻击才开始防御",而是流量清洗能力时刻在线。哪怕只有很少的恶意请求混在正常流量里,清洗系统也会在毫秒级完成识别和过滤。否则攻击流量一暴涨,处理必然跟不上。
2.3 回源:如何保证真实用户仍然拿到数据
清洗完成的合法流量,需要通过回源链路转发到你的源站服务器。回源链路的设计直接决定了源站IP能不能藏得住、回源请求能不能稳定到达。
高防服务商一般会架设专用的回源通道,让高防节点通过私有协议或加密隧道把请求转发到源站。这样在公网上,攻击者无法通过抓包看到源站的真实IP。源站只需要在防火墙里放行固定的高防节点IP段即可,其他IP一律拒绝,等于给源站加了第二道保险。
回源时还需要配置端口、协议、超时时间等参数。比如说网站只开放了80和443端口,回源时就只转发这两个端口的请求;如果业务需要WebSocket长连接,就得把会话保持时间适当调长,否则一断连,实时消息就全丢了。
有个容易忽略的细节是:高防IP转发给源站的请求,HTTP头里通常会带上真实来源IP,而不是统一显示高防节点的IP。很多源站程序依赖获取用户IP来做风控,如果没在高防侧开启"原IP转发",会发现所有用户都来自同一个地址。这个问题后面讲配置时会再提到。
3. 从选型到上线:高防IP接入的完整实操流程
知道原理只是第一步,真正把高防IP用起来,中间还有很多决策和配置工作。这部分我按个人实际接入的经验来写,每一步尽量说清楚为什么这样做。
3.1 选型前先想清楚的三件事
我见过不少人一上来就问哪家高防便宜,结果买完发现防护等级不够或功能不匹配。选型前应该先回答三个问题。
第一,业务是四层还是七层。如果只是网站HTTP/HTTPS访问,需要重点看七层防护能力,比如CC攻击拦截、HTTPS证书适配、WebSocket支持。如果是游戏、API服务、TCP长连接设备接入,就得关注四层转发性能、并发连接数和会话保持能力。买错了层级,效果会大打折扣。
第二,防御峰值怎么定。高防IP一般分"保底防护"和"弹性防护"。保底是基础套餐,平时就生效;弹性是超过保底后按量付费的扩展能力,峰值越高账单越贵。选保底时不要只看平时流量,要参考业务历史上被攻击的最大量,留出至少30%的余量。弹性上限也要提前了解清楚,否则攻击量超过上限,高防IP直接黑洞,网页照样挂。
第三,源站放在哪里。如果源站在同一家云厂商内网,回源走的内部链路,延迟低且稳定。如果源站是自建机房,就要确认服务商能不能回源到非云环境的固定IP,有些服务商默认只支持自家云服务器回源,买之前不问清楚会踩大坑。
3.2 接入配置分步走
确定好参数后,接入过程其实是可以固化成步骤的。我一般按下面的顺序操作,出错概率最低。
- 购买高防IP实例,选择防护线路、保底峰值、弹性峰值。解析线路建议选BGP多线,覆盖效果好。
- 在控制台添加保护对象。填入要防护的域名或者IP,再填写源站真实IP和应用端口。这里填的源站IP就是实际运行网站的服务器IP。
- 获取分配的高防IP。这个IP会替代源站IP,成为域名解析的新目标。
- 修改DNS解析。把域名原来的A记录改成高防IP,并将TTL调低到600秒甚至更低。TTL低的意义是:如果切换后发现问题,你能在十分钟内改回原解析。
- 等待解析生效并验证。用
dig命令查一下域名解析结果是否已经指向高防IP,确认无误后再进行下一步。 - 配置源站防火墙。只允许高防节点的回源IP段访问源站的业务端口,其他来源一律拒绝。这一步是整个接入过程中最容易被漏掉的关键动作。
光看这个列表觉得很简单,实际操作中至少有一半问题出在第四步到第六步衔接不严。比如有人只改了DNS,忘了配防火墙,结果高防转发过来的请求全被源站防火墙拦掉,网页当然还是打不开。
3.3 上线前必须做的本机加固
源站侧的准备并不只是配一条防火墙规则。我在实践中还会做下面这些加固动作,尤其是自建机房场景。
关闭不必要的公网端口。源站只需要保留80、443和运维用的22端口,其他如3306、6379等数据库和缓存端口一律不对外暴露。之前见过有用户把数据库端口直接暴露,攻击者顺手就把业务库拖走了。高防IP防的是流量攻击,不是数据泄露。
只允许特定来源SSH。源站IP已经隐藏起来的情况下,仍然建议把SSH登录限定在办公网或跳板机IP段。这样即便真实IP泄露,运维入口也有兜底。
不要用源站IP主动访问外网。从源站上发起下载、发邮件、调用第三方API,都可能让对方在服务端日志里看到源站IP,变现地把隐藏的源站暴露出去。如果需要外联,应通过单独部署的代理出口。
检查是否还有其他域名解析指向源站。有些站点在接入高防前可能已经解析过多个子域,或者留过邮件MX记录。这些记录都会泄露源站IP,要一并改成高防IP或单独处理。
4. 压测与实战验证:如何确定高防真的在干活
配置上线不等于万事大吉。我见过不少接入高防后没人验证,直到下一次攻击来了才发现回源链路早断掉了的情况。所以接入当天,就要把"验证"这件事完整做一遍。
4.1 先用本地工具做有节制的压测
第一步,先用常规压力测试工具确认正常请求能顺畅通过高防链路。我个人习惯用ab或wrk对高防IP发起持续几分钟的HTTP请求,观察成功率、平均响应时间有没有明显异常。
比如用wrk模拟200个并发线程、持续60秒的请求:
wrk -t8 -c200 -d60s http://高防IP/正常情况下,响应时间和直接访问源站相比会略有增加,但不应出现大量超时或连接失败。如果大胆一点,可以逐渐加并发,但要时刻关注源站的CPU和连接数,别把自己源站压垮。这里的核心目的是验证高防打通链路的正确性,不是为了拼极限。
要特别提醒:不要直接拿高防IP做超大流量DDoS压力测试。高防节点通常是共享清洗能力的,你对某个IP发起的大流量攻击可能影响同节点上的其他业务,甚至触发服务商的黑洞封禁。真想测防御能力,可以联系服务商申请专门测试通道,或者在购买的保底范围内做低强度攻击模拟。
4.2 在控制台看清洗拦截数据
验证高防是否在干活的第二层依据,是控制台的数据报告。正常接入后,控制台会实时展示当前攻击流量、清洗次数、拦截包数量、攻击类型分布等指标。
我一般会分三个维度看:一是攻击流量曲线,如果攻击发生,曲线会明显抬升,但源站入口带宽保持平稳,说明牵引和清洗是生效的;二是拦截详情,可以看到拦截了多少包、多少连接,攻击源IP段分布是什么;三是回源监控,看从高防转发到源站的正常流量是否持续存在、有无突然归零。回源监控归零是很危险的信号,说明高防侧根本没能把流量转回源站,排查方向要立刻转到回源配置上。
4.3 攻击发生时,快速判断链路是否正常
等真攻击来临时,手忙脚乱最容易误判。我总结了一套按顺序排查的路径,照着走基本能快速定位问题。
第一步,先看本地到高防IP的连通性:用ping和traceroute确认本机到高防IP的网络路径是否正常。第二步,打开高防控制台看当前是否有攻击告警,以及清洗策略是否触发。第三步,登录源站服务器,用netstat或tcpdump查看是否持续有来自高防节点IP段的连接。第四步,如果源站流量极少而控制台显示清洗大量拦截,重点检查回源IP段白名单、端口配置、源站状态。
可以参考下面的对应关系:
| 现象 | 可能原因 | 排查点 |
|---|---|---|
| 高防IP通,源站无请求 | 回源链路断掉 | 防火墙白名单、回源端口、源站IP是否填错 |
| 源站有请求,但网页仍卡顿 | 源站资源不足或带宽不足 | 源站CPU、内存、出口带宽 |
| 所有用户IP显示为高防IP | 未开启原IP转发 | 控制台开启回源HTTP头携带真实IP |
| 部分正常用户访问被拦截 | CC防护阈值过低或误判 | 调整CC阈值、加白名单 |
5. 高防IP不是上了就高枕无忧:常见坑与排查经验
高防IP能解决大部分DDoS问题,但它不是保险箱。自己运维了这几年,真正让我头疼的往往不是攻击本身,而是一些上线时没处理干净的细节。
5.1 源站IP泄露,高防成了摆设
最典型的反面案例就是:明明接入了高防,攻击者还是能绕过高防直接把源站打瘫。原因基本只有一个——源站真实IP早就暴露了。
泄露途径比很多人想的多:历史DNS解析记录可能还保留着源站IP;网站SSL证书在证书透明度日志里会暴露签发域名,顺着关联能找到IP;服务器发出去的邮件头里也可能包含源站地址;第三方接口报错时打印的调用来源同样会泄露。攻击者不用花什么力气,在公开信息里就能把这些翻出来。
处理方式没有捷径:一方面清掉所有公开页面对源站IP的引用,改走高防或代理;另一方面,源站防火墙必须做成只允许高防回源IP段访问,即使真实IP泄露,对方也无法直接建立业务连接。被泄露得厉害的情况下,最彻底的办法是更换源站IP并重新做一轮隐藏。
5.2 回源链路被绕过,如何定位
还有一种情况是,高防控制台显示攻击被清洗了不少,但源站依然被打得很惨。这时优先怀疑的,不是高防没有效果,而是还有流量不走高防。
定位方法很简单:登录源站,看访问日志里的来源IP分布。正常情况下,绝大部分请求应该来自高防的回源IP段;如果出现大量随机分布的公网IP直接访问源站,说明攻击者绕过高防打到了源站。这时回查DNS会发现可能还有某个旧解析、某个子域直接指向源站IP,或者源站防火墙根本没限制来源。
修复的时候要把所有可能解析到源站的记录全部改掉,然后把防火墙策略收紧到只放行高防回源IP段,再把源站换新IP暴露风险降至最低。做完后持续观察,两小时内如果源站日志里不再出现异常来源IP,基本可以确认修复到位。
5.3 误杀正常用户:从黑白名单到CC阈值调优
高防IP保护过头的时候,也会误伤用户。最常见的是把某个企业出口IP误判成攻击源,或者因为某个接口的请求频率过高触发了CC防护。这种问题处理不好,比被攻击还麻烦——用户会直接流失。
我的经验是先看控制台的拦截日志,确认被拦截的是不是正常来源。如果确实误判,先在防护策略里把该IP段加入白名单,再观察是否影响防护效果。CC防护阈值不要一上来设太低,建议先按正常业务峰值的1.5到2倍来设,跑一天看误杀率,再逐步下探。比如某个活动接口正常峰值是500QPS,阈值可以先设1000,稳定后再下调到800。要动态调整,不要一个数值用一年。
另外,把静态资源请求和动态接口请求分流防护也是减少误杀的好办法。静态资源走CDN缓存,高防侧只对动态接口做严格频率限制,这样普通浏览行为基本不会被误伤,只有频繁调接口的异常行为才容易被识别出来。
测过高防链路后,我会习惯在源站前面保留一层轻量的Nginx访问日志,专门记录回源请求的来源IP和请求特征。这样平时看着平平无奇,一旦高防节点回源出现异常,能很快定位是策略问题还是网络问题。再有一点,建议每三个月导出一次高防控制台的拦截报告,看看攻击来源和类型的变化趋势,下次做方案预算和防护升级时会轻松很多。