CDN原理与识别
1、問題
遇到了一個問題,就是同一個域名,在兩個網站上查到它的 IP 是不一樣的???
這是為什么呢?這是因為 CDN:
CDN 即 content delivery network(內容分發網絡),通過在網絡各處放置節點服務器所構成的 在現有的互聯網基礎之上的一層智能虛擬網絡,CDN系統能夠實時地根據網絡流量和各節點的連接、負載狀況以及到用戶的距離和響應時間等綜合信息將用戶的請求重新導向離用戶最近的服務節點上。
因此開了CDN 之后,會智能匹配當地最近的節點,所以請求的實際 IP 不同。
2、CDN 的原理
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節點就會有對應資源的緩存了。
3、CDN的優勢
其基本思路是盡可能避開互聯網上有可能影響數據傳輸速度和穩定性的瓶頸和環節,使內容傳輸得更快、更穩定。日常使用CDN大概總結起來主要有一下幾點原因:
(1)、加速網絡訪問,提供網站的訪問速度
(2)、隱藏源站IP,減輕源站壓力,提高安全性
(3)、降低服務器流量,使用cdn的流量價格遠低于源站服務器的流量價格,節約流量費用
4、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 響應頭,能在響應頭里面直接看出來。
5、CDN 的檢測
需要獲取域名對應的真實 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/ 這個網站逐個收集的,覆蓋面廣,但是容易誤報。
6、補充問題:
(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。
7、cdn準確性驗證方式
(1)隨機抽取一定量的 代碼識別為使用cdn的網站;
(2)selenium模擬瀏覽器爬蟲獲得 全球ping工具(全球Ping測試,在線ping工具 - 網絡工具) 的結果對比;
| 12w | 2千 | 全部’loading‘:418 ;單ip:53; 多ip:1529 | 76.45% | 97.35% | ’loading‘可能是限制時間內未加載完全 |
總結
- 上一篇: 云计算介绍 tcp/ip协议介绍及配置
- 下一篇: paramiko.ssh_excepti