文章目錄
代理服務器的簡介
- 就拿翻牆作爲一個例子,當我們搜索谷歌的時候,我們中國的牆(在此稱爲牆)檢測到我們發出的請求中有google的字眼,它會直接給我一個錯誤請求或者乾脆返回給我們一個錯誤的網站
- 我們中國的牆實際上並不是把國外所有的網站都封鎖了,而是把那些富有交流性的東西封鎖,比如facebook
回到重點:
假設需要訪問facebook,做一個翻牆服務器,首先我們要有一個能夠訪問facebook的服務器A,同時我們自己的電腦也可以開始訪問服務器A,通過服務器A,幫助我們訪問facebook,然後把訪問內容返回給我們。
- 當我們在瀏覽器輸入網址並按下確認鍵後,瀏覽器把數據封裝成socks5的格式,然後發送給服務器A
- 服務器A得到數據後,將收到的數據進行解析,判斷socks5格式是否合法,並返回一個應答信號,這個過程服務器A實際上在模擬socks5的通信格式
- 服務器A成功與瀏覽器端口身份驗證完成後,服務器A再解析出瀏覽器發過來的url信息,通過url信息再與對應的服務器建立連接
- 建立連接後,瀏覽器發過來的消息,服務器A就轉發給facebook的服務器端,facebook服務器接收到請求,然後返回響應給服務器A,服務器A再把響應的結果轉發給瀏覽器。如此就實現了請求和響應的過程。
我們需要藉助的SOCKS協議
SOCKS簡單介紹
- SOCKS是一種網絡傳輸協議,主要用於客戶端與外網服務器之間的通訊的中間傳遞。SOCKS是 "SOCKETS"的縮寫
- 目前最新的版本是socks5
- 版本4和5的區別在於5增加支持UDP,驗證,以及IPv6,根據OSI模型,SOCKS是會話層的協議,位於表示曾和傳輸層之間
- 想要模擬socks的與瀏覽器進行通信,我們必須要了解SOCKS的允許機制
SOCKS運作過程
第一步:身份驗證(authentication)
1.客戶端連接到服務器,併發送一個版本標識符/方法選擇消息
- 格式如下
2.服務器從方法中給定的方法中選擇一個方法,METHOD設置0x00
返回給客戶端表示不需要身份驗證,返回0xff的時候,客戶端必須關閉這個連接
這裏我們直接返回0x00即可,因爲我們是測試,不需要這麼複雜
第二步:SOCKS請求 (客戶端–>代理服務器)
- 也就是代理服務器拿着客戶端發過來的網址去訪問網站
SOCKS的請求格式
- VER 版本
- CMD
- 0x01 代表連接
- 0x02 代表綁定
- 0x03
- RSV 保留的一個字節
- ATYP 表示使用後面的(目標服務器的地址)DST.ADDR是什麼類型
- 0x01 IPV4的IP
- 0x03 表示是一個域名
- 0x04 IPv6的IP
- DST,ADDR 目標IP或者域名 (長度根據類型而定)
- DST.PORT 目標服務器的端口號
第三步:響應 (代理服務器–>客戶端)
- 也就是代理服務器拿着網址訪問網址對應的服務器後,得到響應,然後把這個響應再轉發給客戶端(瀏覽器)
請求格式
SOCKS請求信息由客戶端在發送完之後立即發送
建立到SOCKS服務器的連接,並完成
身份驗證的談判。服務器評估請求,並且
返回如下形式的回覆:
- VER 版本號
- REP 回覆字段
- 0x00 成功了
- 0x01 不通SOCKS服務器故障
- 0x02 連接不被規則集允許
- 0x03 網絡無法連接
- 0x04 主機無法連接
- 0x05 連接被拒絕
- 0x06 TTL過期
- 0x07 命令不支持
- 0x08 地址類型不支持
- 0x09和0xff還沒有被分配
- RSV 保留字節
- ATYP 後面的地址類型
- 0x01 IPV4的IP
- 0x03 表示是一個域名
- 0x04 IPv6的IP
- BND.ADDR 服務器綁定的地址
- BND.PORT 服務器綁定的端口號
SOCKS5資料參考網址
https://www.ietf.org/rfc/rfc1928.txt
如何使用SOCKS5進行IP代理
- 首先我們要明白,如果我們直接訪問國外的目標服務器,我們的輸入的網址將會被GFW攔截(GFW是中國防火牆),之所以我們不能訪問外網,就是因爲有GFW,就比如我們上不了谷歌的首頁,因爲我們的請求中有關於谷歌的字眼,被GFW識別後就會直接丟棄或者返回一個錯誤的網頁給我們。
- 其次,我們也必須知道並不是所有國外的網站我們都訪問不了,有些網站還是允許訪問了。
現在說說原理
- 一般情況下,從瀏覽器輸入網址後,瀏覽器經過域名解析,得到網址對應的IP和端口號,然後向目標服務器發送請求,這個過程中都是明文傳輸,傳輸的內容中肯定有關於目標服務器的信息,如果目標服務器是不允許訪問的,我們就會被攔截。
- 所以我們可以把請求先發送給一個國外允許我們訪問的服務器==,讓國外的服務器幫助我們訪問目標服務器==,然後把訪問的結果返回給我們,這個過程中的數據一定要加密
- 一定要加密,一定要加密,那怎麼加密呢?
1.我們輸入網址後我們讓瀏覽器SOCKS5協議向我們的本地自己搭建的SOCKS5服務器發送SOCKS5數據包
2.SOCKS5的數據包中包含了,瀏覽器要訪問的目標服務器的域名或者IP信息
3.我們本地的SOCKS5服務器對這數據進行加密,因爲要發送給到國外的服務器,所以要加密處理,防止被解析出來,然後導致被攔截掉。
4。本地的SOCKS5服務器加密數據後,轉發給國外的SOCKS5服務器
5.國外的SOCKS5解密數據包,然後從SOCKS5數據包中提取出目標服務器的域名或者是IP,還有端口號
6.國外的SOCKS5服務器幫助我們訪問目標服務器,然後得到目標服務器的響應
7.國外的SOCKS5服務器對響應進行加密處理,然後發送給我們本地的SOCKS5服務器
8.本地的服務器對響應進行解密,把解密後的響應發給瀏覽器
9.瀏覽器得到響應,解析頁面
原理圖
小結
- 在講述原理的過程中,整個執行過程如上圖
- 兩個服務器可以分開來寫,先寫處理SOCKS請求的國外的服務器
- 本地的SOCKS5服務器只是對數據包進行了轉發
- 解析數據包的時候可以使用抓包工具幫助測試