遇到了一个问题,就是同一个域名,在两个网站上查到它的 IP 是不一样的???
这是为什么呢?这是因为 CDN:
CDN 即 content delivery network
(内容分发网络),通过在网络各处放置节点服务器所构成的 在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。
因此开了CDN 之后,会智能匹配当地最近的节点,所以请求的实际 IP 不同。
CDN网络是在用户和服务器之间增加Cache层,主要是通过接管DNS实现,将用户的请求引导到Cache上获得源服务器的数据,从而降低网络的访问时间。 首先,让我们看一下传统的未加缓存服务的访问过程:
如图可以看出,传统的网络访问的流程如下:
用户输入访问的域名,操作系统向 LocalDns 查询域名的ip地址;
LocalDns向 ROOT DNS 查询域名的授权服务器(这里假设LocalDns缓存过期);
ROOT DNS将域名授权dns记录回应给 LocalDns; LocalDns得到域名的授权dns记录后,继续向域名授权dns查询域名的ip地址;
域名授权dns 查询域名记录后,回应给 LocalDns;
LocalDns 将得到的域名ip地址,回应给用户端;
用户得到域名ip地址后,访问站点服务器;
站点服务器应答请求,将内容返回给客户端.
与传统访问方式不同,CDN网络则是在用户和服务器之间增加Cache层,将用户的访问请求引导到Cache节点而不是服务器源站点,要实现这一目的,主要是通过接管DNS实现,下图为使用CDN缓存后的网站访问过程:
1、用户输入访问的域名,操作系统向 LocalDns 查询域名的ip地址; 2、LocalDns向 ROOT DNS 查询域名的授权服务器(这里假设LocalDns缓存过期); 3、ROOT DNS将域名授权dns记录回应给 LocalDns; 4、LocalDns得到域名的授权dns记录后,继续向域名授权dns查询域名的ip地址; 5、域名授权dns 查询域名记录后(一般是CNAME),回应给 LocalDns; 6、LocalDns 得到域名记录后,向智能调度DNS查询域名的ip地址; 7、智能调度DNS 根据一定的算法和策略(比如静态拓扑,容量等),将最适合的CDN节点ip地址回应给 LocalDns; 8、LocalDns 将得到的域名ip地址,回应给用户端; 9、用户得到域名ip地址后,访问站点服务器。
由此可见,使用CDN缓存后的网站访问过程演变为了当 浏览器向域名解析服务器发出解析请求,由于CDN对域名解析过程进行了调整,所以用户端一般得到的是该域名对应的CNAME记录,此时浏览器需要再次对获得的CNAME域名进行解析才能得到缓存服务器的IP地址; 注:在此过程中,全局负载均衡DNS解析服务器会根据用户端的源IP地址,如地理位置(深圳还是上海)、接入网类型(电信还是网通)将用户的访问请求定位到离用户路由最短、位置最近、负载最轻的Cache节点(缓存服务器)上,实现就近定位。定位优先原则可按位置、可按路由、也可按负载等。
通过以上分析可以看到,不论是否使用CDN网络,普通用户客户端设置不需做任何改变,直接使用被加速网站原有域名访问即可。对于要加速的网站,只需修改整个访问过程中的域名解析部分,便能实现透明的网络加速服务。
举个例子:
假设通过CDN加速的域名为www.a.com
,接入CDN网络,开始使用加速服务后,当终端用户(北京)发起HTTP请求时,处理流程如下:
当终端用户(北京)向www.a.com
下的指定资源发起请求时,首先向LDNS发起域名解析请求。
LDNS检查缓存中是否有www.a.com
的IP地址记录。如果有,则直接返回给终端用户;如果没有,则向授权DNS查询。
当授权DNS解析www.a.com
时,返回域名CNAME www.a.tbcdn.com
对应IP地址。
域名解析请求发送至阿里云DNS调度系统,并为请求分配最佳节点IP地址。
LDNS获取DNS返回的解析IP地址。
用户获取解析IP地址。
用户向获取的IP地址发起对该资源的访问请求。
如果该IP地址对应的节点已缓存该资源,则会将数据直接返回给用户,例如,图中步骤7和8,请求结束。
如果该IP地址对应的节点未缓存该资源,则节点向源站发起对该资源的请求。获取资源后,结合用户自定义配置的缓存策略,将资源缓存至节点,例如,图中的北京节点,并返回给用户,请求结束。
从这个例子可以了解到:
(1)CDN的加速资源是跟域名绑定的。 (2)通过域名访问资源,首先是通过DNS调度系统查找离用户最近的CDN节点(边缘服务器)的IP (3)通过IP访问实际资源时,如果CDN上并没有缓存资源,则会到源站请求资源,并缓存到CDN节点上,这样,用户下一次访问时,该CDN节点就会有对应资源的缓存了。
其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输得更快、更稳定。日常使用CDN大概总结起来主要有一下几点原因:
(1)、加速网络访问,提供网站的访问速度
(2)、隐藏源站IP,减轻源站压力,提高安全性
(3)、降低服务器流量,使用cdn的流量价格远低于源站服务器的流量价格,节约流量费用
要检测 CDN 就要从 CDN 的配置说起,配置 CDN 一般只有两种方式:
方法 1(目前cdn厂商的普遍配置方式):
不管是阿里云、腾讯云还是华为云,因为CDN是通过将你的域名解析到CDN运营商的CDN缓存服务器上来实现加速的,因此需要将域名解析交给CDN运营商,给域名设置一个 cname
类型的记录,让它指向 cdn 厂商提供的另一个域名,这种域名有前缀一般是看起来很随机那种。
例如在配置的时候,需要将原来默认的解析删掉(是直接将网址解析到web服务器地址上的,跟CDN冲突),然后添加CNAME解析:记录类型为CNAME,主机记录为www,CDN中分配的CNAME(比如这里是www.123.cn.cdn.dnsv1.com) 【将www.123.cn解析到www.123.cn.cdn.dnsv1.com】
方法 2:
把域名的 NS
(Name Server记录是域名服务器记录,用来指定该域名由哪个DNS服务器来进行解析)记录指向 CDN 厂商的 DNS 服务器 IP。
或者有的 CDN 会改 http 响应头,能在响应头里面直接看出来。
需要获取域名对应的真实 IP。这就要求我们先判断哪些域名有 CDN 防护,那么我们需要进一步绕过 CDN 去获取真实 IP;哪些域名没有 CDN 防护,我们就可以直接获取真实 IP。也就是说,首先我们要按是否有 CDN 进行一个分类。
对于 CDN 的检测,我们分为单个域名的 CDN 检测和域名批量 CDN 检测两种,使用不同的方法。
(1)单个域名的 CDN 检测:
方法 1:
直接访问 ping 到的 IP,加了 CDN 之后,不能直接通过访问 IP 访问网站。
方法 2:
多地 ping,看得到的 IP 是不是一样的。不一样则可能有 CDN。
全球 ping 推荐网站:全球Ping测试,在线ping工具 - 网络工具(快、稳定)
方法 3:
是看 DNS 解析,一般有 CNAME 的大多数是 CDN。
下面是几个根据 CNAME 记录判断 CDN 的例子,CNAME 绑定的域名会有 cdn
相关字符。
(2)域名批量 CDN 检测:
根据cdn的配置方式,通过脚本实现域名的批量cdn检测。原理:
1、多ip识别:socket域名解析获取ip_list,忽略ipv6,看ip_list 中的ip个数,如果返回域名解析对应多个 IP 地址大概率使用了CDN;
2、cname识别:搜集常见厂商的cname,利用dnspython递归获取cname,看是否命中;
3、header识别:搜集常见的cdn header头,看是否命中;
4、cdn 网段识别:搜集常见的cdn ip网段,看是否命中;
5、ASN信息关联:
在网络中一个自主系统(AS)是一个有权自主的决定在本系统中应采用何种路由协议的小型单位。一个自治系统将会分配一个全局的唯一的16位号码,这个号码被称为自治系统号(ASN),相同组织的 ASN 是一样的,所以一个 CDN 厂商的 IP 段可能都在一个 ASN 里。用到GeoLite2-ASN.mmdb这个静态库。
搜集了常见 CDN 厂商的 ASN 号:
以及国内外常见的 CDN 段:
常见 CDN 段是从一些网站官网上公开的信息获取的,准确率高,但是涵盖不是很全。ASN 号是从 提供域名就可以找到ASN的工具 —— http://bgp.he.net/ 这个网站逐个收集的,覆盖面广,但是容易误报。
(1)、域名解析对应多个 IP 地址一定是使用了cdn吗?
答:也有可能是dns 解析时多添加几个不同IP的A记录,部分服务器使用DNS解析,利用域名解析作为第一级负载均衡,再在服务器中使用NGINX负载均衡作为第二级负载均衡。
(2)、多地ping一个域名只有一个ip一定没用cdn吗?
答:有可能是用了 Anycast CDN,一个IP走遍天下。根据访问量动态调整节点数量,访问量少的时候,CDN只开个别节点,甚至只保留一个节点,提高缓存命中率,节约成本。(但是这种情况极少)
AnyCast,也称任意播,或泛播,指IPV6协议中一个发送方同最近的一组接收方之间的通信。BGP AnyCast就是利用一个(或多个)AS号码在不同的地区广播相同的一个IP段。即不同地区若干个AS号广播同一个IP(段)。
(3)、命中header就一定是使用了cdn吗?
如果要通过客户端看某个网站是否使用CDN,看网站的发向客户端的 HEADER信息,如果header信息里面有X-Cache MISS from cache.xxx.com.cn, MISS from cache.xxx.com.cn类似这样的头部,就可能使用了CDN,不过也不好说,因为服务器使用了反向代理技术(如squid)也会发出这样的头部,这种情况得到的也不是网站真实ip。
综上,上述识别cdn的方法虽然不能100%正确,但是至少可以说明获得的不是该网站的真实ip。
(1)随机抽取一定量的 代码识别为使用cdn的网站;
(2)selenium模拟浏览器爬虫获得 全球ping工具(全球Ping测试,在线ping工具 - 网络工具) 的结果对比;
目前累计的识别为cdn数量 | 随机抽取 | 爬虫验证(10s等待加载) | 模糊准确率 | 准确率 | 备注 |
---|---|---|---|---|---|
12w | 2千 | 全部’loading‘:418 ;单ip:53; 多ip:1529 | 76.45% | 97.35% | ’loading‘可能是限制时间内未加载完全 |