洋蔥網路學習紀錄

今天與公司的資深同事討論了爬蟲突破 IP 封鎖的技術,學習了有一個叫做洋蔥網路 (TOR) 的厲害技巧,是除了一般使用付費 proxy IP 外另一種突破 IP 封鎖的方式,以下紀錄我學習的心得。

TOR 的全名為 The Onion Project,發源至美國海軍開發的一個匿名交流網路。用戶端使用這種網路不會直接與要存取的目標電腦連線,而是會在兩者間隨機挑選多個中繼站當節點,形成一條連線路徑。而且每一個中繼結點間都會層層加密,只有目的地節點可以解密看到最終的內容,如此特性有如洋蔥多層的結構一樣複雜所以稱之,示意圖如下圖所示。

而 TOR 這種複雜的隨機多重代理特性,使得其難以追蹤使用者真實的來源IP,因此成為暗網活動最好的平台。python 也剛好有支援發送 TOR 請求的套件,以下為一個簡單的 tor 請求存取程式建立步驟。

首先,參考此篇安裝範例安裝 TOR 相關套件及設定,這裡我使用 docker Ubuntu 的 container 作為安裝環境,首先安裝 TOR。

1
2
sudo apt-get update
sudo apt-get install tor

安裝完成後接著就可以試著啟動 TOR 服務了。

1
2
service tor start 
* Starting tor daemon... [ OK ]

接著可以進一步的去設定 TOR,這裏利用--hash-password設定了一組密碼以防本機被其他外部代理所存取,輸出為得到了一個 hash 碼。

1
2
tor --hash-password <enter your password here>
16:ED2893D8EC97801C60DF4A72249CBCCD8B97B3B01A15C923DC49A0E500

接著到設定檔所在位置 /etc/tor/torrc 設定密碼以及 ControlPort

1
2
3
4
5
ControlPort 9051
HashedControlPassword <your hashed passsword obtained earlier here>
CookieAuthentication 1

### This section is just for location-hidden services ###

最後重啟服務來完成設定。

1
2
pidof tor | xargs kill
service tor start

以上設定都完成後,就可以安裝 TOR 的 python wrapper torrequest 來進行程式開發了。程式為使用一般的請求以及 TOR 請求到 http://ipecho.net/plain 來觀察自己的 IP 位址有無變化。

1
2
3
4
5
6
7
8
9
10
11
import requests
from torrequest import TorRequest

res = requests.get('http://ipecho.net/plain')
print("my original ip:", res.text)

for i in range(5):
with TorRequest() as tr:
response = tr.get('http://ipecho.net/plain')
print("New ip:", response.text)
tr.reset_identity()

程式執行的結果如下所示,可以發現每次 reset TOR 連線路徑後所獲得的來源 IP 都不一樣了!不過可惜的是就是速度太慢了,本實驗每次建立 tor 連線都要花上近 10 秒左右,要實際上給爬蟲使用效果很有限,但也學到新的一招就是了。

1
2
3
4
5
6
my original ip: 1.162.217.109
New ip: 185.220.101.21
New ip: 85.202.163.127
New ip: 199.87.154.255
New ip: 178.17.166.147
New ip: 104.244.76.13

reference

  1. https://www.scrapehero.com/make-anonymous-requests-using-tor-python/
  2. https://gist.github.com/DusanMadar/8d11026b7ce0bce6a67f7dd87b999f6b
  3. https://github.com/erdiaker/torrequest