上个月一个客户在排查分流误判,问我的问题挺典型:为什么已经把可疑IP加进黑名单了,真实用户反而大面积跑到标准页?这个反直觉。排查一圈发现,其实是他把CDN节点的回源IP当成访客出口IP,直接配进了过滤规则。回源IP和访客出口IP到底有什么边界?混淆以后会触发哪些链式误判?我下面就从入口层和回源层的判定机制来讲,说明这两个IP角色各自适用的配置位置,也顺便厘清和代理出口、NAT出口的相邻区别。这里容易搞混,所以先别急着背概念,跟着链路走一遍会清楚很多。
先分清链路位置:入口IP不是访客IP
要理解这个边界,最好回到分流系统的基础链路去看。访客请求先到接入层,接入层可能是CDN、反向代理,也可能是直连源站;然后接入层再往源站发回源请求。这里就出现两个位置完全不同的IP了。访客出口IP,说白了就是用户设备经过运营商NAT或者代理以后对外露出的那个地址;回源IP呢,是CDN或者反代向后端源站发起请求时自己用的源地址。同一个请求里这两个IP可能同时存在,但一个在入口层,一个在回源层,不是一回事。可以先回顾一下基础工作流程,别把接入节点和访客节点搞混。说白了,位置不同,后面处理方式就不同。
混淆后的典型链式误判
最常见的一个误用,就是把CDN回源IP段直接加进黑名单。我见过一个客户的金融教育业务,日均点击大概一千二三,接入CDN以后把回源段当成疑似爬虫段写进过滤规则,结果所有从CDN过来的正常请求在入口校验的时候就被拦了,或者被降级到标准页。原因不复杂:CDN回源时,Remote Address已经变成CDN节点地址了,真实访客出口只放在X-Forwarded-For或者自定义头里。如果入口只信Remote Address,真实访客等于集体消失。这个坑我见过好几次。
第二个场景,有人把访客出口IP直接写进源站防火墙白名单,结果漏了CDN回源段。源站呢,又只接受白名单里的IP,回源请求一过来就被拒,标准页都拉不起来,更别说分流了。其实这里就是回源层和入口层被混成一套了。第三个场景是在XFF多跳里取错段。有人把第一跳代理IP写进风险标记,结果风险标记的TTL一直续着,后续真实访客被持续影响。排查这类问题,我们一般会结合日志采样配置一起看,先区分入口层和回源层的错误码到底来自哪一段,别一上来就改规则。
入口层与回源层的配置适用条件
我的习惯是,先看链路结构,再决定要不要单独维护回源IP。其实这件事不看你流量多大,而是看链路里到底有没有CDN或者反向代理。直连源站的时候,Remote Address基本就等于访客出口IP,这时候混淆风险不高。但前面一旦挂了CDN,入口层和回源层就分开了,必须做两件事:第一,把可信任的CDN回源IP段配成来源白名单;第二,只从经过信任节点写入的XFF头里取访客出口IP,别乱取。我们一般用Nginx的real_ip模块来指定可信回源段,而不是直接读头字段,因为直接读头很容易被人塞东西。适用条件说到底就是链路结构,只要存在回源,就得分两套配置。相关术语可以参考回源与分流术语。
与代理出口、NAT出口的相邻概念区别
这里容易搞混的还有两个相邻概念:代理出口IP和NAT出口IP。代理出口是用户主动挂代理以后对外露出的地址,它还在访客侧;NAT出口是运营商或者企业网关统一转换后的地址,多个用户共享一个出口。回源IP的位置完全不一样,它属于接入层后端。把代理出口写进回源白名单,入口层反而会误信伪造的链路;把NAT出口当成回源IP,在CDN场景下也还是继续误判。其实边界判断就看一点:这个IP到底是在访客到达接入层之前出现的,还是接入层向上游发起请求之后才出现的。这个判断标准比记定义有用。
小结
回源IP和访客出口IP会混到一起,本质上是把入口层和回源层两个阶段的地址当成一个东西了。投放团队在设计分流规则、防火墙白名单、风险标记策略的时候,先别急着写规则,先确认请求到底经不经过CDN或反代;只要经过,就必须把两套IP配置分开,信任边界放在XFF写入方,而不是放在取XFF值的规则层。这样真实用户被误判的概率才会降下来,后面排查成本也小很多。
常见问题
怎么判断一个IP是访客出口IP还是回源IP?
看IP出现在请求链路中的位置。访客出口IP是用户设备经NAT或代理后到达接入层之前的地址,通常由X-Forwarded-For头携带;回源IP是CDN或反向代理向上游源站发起请求时使用的源地址,可以在源站日志的Remote Address中看到。如果请求直连源站,两者可能相同;如果经过CDN,则必须分开判断。
回源IP配置错误会让真实用户被当成爬虫吗?
会。若把CDN回源IP段写入过滤黑名单或爬虫规则,所有经该CDN进入的正常请求都可能被拦截或降级,真实用户看上去像消失一样。更隐蔽的情况是源站白名单漏掉回源段,导致回源请求被拒绝,标准页无法稳定返回。因此回源IP变更时要同步更新白名单和分流规则。
CDN开启后还需要单独维护出口IP规则吗?
需要。出口IP规则用于访客侧的地理判定、威胁标记和频率控制,回源IP白名单用于信任CDN或反代的回源请求,两者作用对象不同,不能互相替代。开启CDN后应分别维护可信回源IP段、访客出口IP的提取字段及信任链,否则分流系统容易把接入层行为误判为访客行为。
延伸阅读
理解IP边界后,还需要回到系统整体链路确认各组件角色,下面这篇文章补充了斗篷系统的技术结构与落地权衡。