SOCKS5實現代理服務器(C++)

代理服務器的簡介

  • 就拿翻牆作爲一個例子,當我們搜索谷歌的時候,我們中國的牆(在此稱爲牆)檢測到我們發出的請求中有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.客戶端連接到服務器,併發送一個版本標識符/方法選擇消息

  • 格式如下

image

2.服務器從方法中給定的方法中選擇一個方法,METHOD設置0x00
返回給客戶端表示不需要身份驗證,返回0xff的時候,客戶端必須關閉這個連接
這裏我們直接返回0x00即可,因爲我們是測試,不需要這麼複雜

image

第二步:SOCKS請求 (客戶端–>代理服務器)

  • 也就是代理服務器拿着客戶端發過來的網址去訪問網站

SOCKS的請求格式

image

  • VER 版本
  • CMD
    • 0x01 代表連接
    • 0x02 代表綁定
    • 0x03
  • RSV 保留的一個字節
  • ATYP 表示使用後面的(目標服務器的地址)DST.ADDR是什麼類型
    • 0x01 IPV4的IP
    • 0x03 表示是一個域名
    • 0x04 IPv6的IP
  • DST,ADDR 目標IP或者域名 (長度根據類型而定)
  • DST.PORT 目標服務器的端口號

第三步:響應 (代理服務器–>客戶端)

  • 也就是代理服務器拿着網址訪問網址對應的服務器後,得到響應,然後把這個響應再轉發給客戶端(瀏覽器)

請求格式

SOCKS請求信息由客戶端在發送完之後立即發送
建立到SOCKS服務器的連接,並完成
身份驗證的談判。服務器評估請求,並且
返回如下形式的回覆:

image

  • 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服務器只是對數據包進行了轉發
  • 解析數據包的時候可以使用抓包工具幫助測試
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章