帶你瞭解代理 IP 那些事

極客猴發表於2018-11-07

「極客猴」每週堅持分享 Python 原創乾貨的公眾號。包括基礎入門,進階技巧,網路爬蟲,資料分析, Web 應用開發等,歡迎關注。

在爬取某些網站時,我們經常會設定代理 IP 來避免爬蟲程式被封。我們獲取代理 IP 地址方式通常提取國內的知名 IP 代理商(如西刺代理,快代理,無憂代理等)的免費代理。這些代理商一般都會提供透明代理,匿名代理,高匿代理。那麼這幾種代理的區別是什麼?我們該如何選擇呢?本文的主要內容是講解各種代理 IP 背後的原理。

1 代理型別

代理型別一共能分為四種。除了前面提到的透明代理,匿名代理,高匿代理,還有混淆代理。從安全程度來說,這四種代理型別的排序是 高匿 > 混淆 > 匿名 > 透明。

2 代理原理

代理型別主要取決於代理伺服器端的配置。不同配置會形成不同的代理型別。在配置中,這三個變數 REMOTE_ADDRHTTP_VIAHTTP_X_FORWARDED_FOR 是決定性因素。

1) REMOTE_ADDR REMOTE_ADDR 表示客戶端的 IP,但是它的值不是由客戶端提供的,而是伺服器根據客戶端的 IP 指定的。

如果使用瀏覽器直接訪問某個網站,那麼網站的 web 伺服器(Nginx、Apache等)就會把 REMOTE_ADDR 設為客戶端的 IP 地址。

如果我們給瀏覽器設定代理,我們訪問目標網站的請求會先經過代理伺服器,然後由代理伺服器將請求轉化到目標網站。那麼網站的 web 伺服器就會把 REMOTE_ADDR 設為代理伺服器的 IP。

2)X-Forwarded-For(XFF) X-Forwarded-For 是一個 HTTP 擴充套件頭部,用來表示 HTTP 請求端真實 IP。當客戶端使用了代理時,web 伺服器就不知道客戶端的真實 IP 地址。為了避免這個情況,代理伺服器通常會增加一個 X-Forwarded-For 的頭資訊,把客戶端的 IP 新增到頭資訊裡面。

X-Forwarded-For 請求頭格式如下:

X-Forwarded-For: client, proxy1, proxy2
複製程式碼

client 表示客戶端的 IP 地址;proxy1 是離服務端最遠的裝置 IP; proxy2 是次級代理裝置的 IP;從格式中,可以看出從 client 到 server 是可以有多層代理的。

如果一個 HTTP 請求到達伺服器之前,經過了三個代理 Proxy1、Proxy2、Proxy3,IP 分別為 IP1、IP2、IP3,使用者真實 IP 為 IP0,那麼按照 XFF 標準,服務端最終會收到以下資訊:

X-Forwarded-For: IP0, IP1, IP2
複製程式碼

Proxy3 直連伺服器,它會給 XFF 追加 IP2,表示它是在幫 Proxy2 轉發請求。列表中並沒有 IP3,IP3 可以在服務端通過 Remote Address 欄位獲得。我們知道 HTTP 連線基於 TCP 連線,HTTP 協議中沒有 IP 的概念,Remote Address 來自 TCP 連線,表示與服務端建立 TCP 連線的裝置 IP,在這個例子裡就是 IP3。

3)HTTP_VIA via 是 HTTP 協議裡面的一個header,記錄了一次 HTTP 請求所經過的代理和閘道器,經過1個代理伺服器,就新增一個代理伺服器的資訊,經過2個就新增2個。

3 代理型別區別

1) 透明代理(Transparent Proxy) 代理伺服器的配置如下:

REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Your IP
複製程式碼

透明代理雖然可以直接“隱藏”客戶端的 IP 地址,但是還是可以從HTTP_X_FORWARDED_FOR來查到客戶端的 IP 地址。

2) 匿名代理(Anonymous Proxy) 代理伺服器的配置如下:

REMOTE_ADDR = proxy IP
HTTP_VIA = proxy IP
HTTP_X_FORWARDED_FOR = proxy IP
複製程式碼

匿名代理能提供隱藏客戶端 IP 地址的功能。使用匿名代理,伺服器能知道客戶端使用用了代理,當無法知道客戶端真實 IP 地址。

3) 混淆代理(Distorting Proxy) 代理伺服器的配置如下:

REMOTE_ADDR = Proxy IP
HTTP_VIA = Proxy IP
HTTP_X_FORWARDED_FOR = Random IP address
複製程式碼

與匿名代理的原理相似,但是會偽裝得更逼真。如果客戶端使用了混淆代理,伺服器還是能知道客戶端在使用代理,但是會得到一個假的客戶端 IP 地址。

2) 高匿代理(Elite Proxy 或 High Anonymity Proxy) 代理伺服器的配置如下:

REMOTE_ADDR = Proxy IP
HTTP_VIA = not determined
HTTP_X_FORWARDED_FOR = not determined
複製程式碼

高匿代理既能讓伺服器不清楚客戶端是否在使用代理,也能保證伺服器獲取不到客戶端的真實 IP 地址。

4 代理的選擇

普通匿名代理能隱藏客戶機的真實 IP,但會改變我們的請求資訊,伺服器端有可能會認為我們使用了代理。不過使用此種代理時,雖然被訪問的網站不能知道客戶端的 IP 地址,但仍然可以知道你在使用代理,當然某些能夠偵測 IP 的網頁仍然可以查到客戶端的 IP。

而高度匿名代理不改變客戶機的請求,這樣在伺服器看來就像有個真正的客戶瀏覽器在訪問它,這時客戶的真實IP是隱藏的,伺服器端不會認為我們使用了代理。

因此,爬蟲程式需要使用到代理 IP 時,儘量選擇普通匿名代理和高匿名代理。另外,如果要保證資料不被代理伺服器知道,推薦使用 HTTPS 協議的代理。

文章參考:

HTTP 請求頭中的 X-Forwarded-For
proxy代理型別:透明代理 匿名代理 混淆代理和高匿代理


本文首發於微信公眾號,原文地址是 。隨時歡迎轉載文章, 轉載請聯絡號主開通白名單,尊重作者的原創。本人微信公眾號「極客猴」,每週分享 Python 原創乾貨。涉及網路爬蟲、資料分析、web 開發等方向。

帶你瞭解代理 IP 那些事

相關文章