埠轉發和SOCKS代理
起因
在蚯蚓構思之初,我在網上集中搜集過socks代理的知識,發現網上的很多資料都把 “Socks代理”和”socket埠轉發”混為一談。於是我決定寫這樣一篇文章,來辨析一下它們之間的異同。
Socket埠轉發
lcx.exe 就是一個基於 socket 套接字實現的埠轉發工具,它是從 linux 下的htran 工具移植到windows平臺的。
一條正常的socket隧道必具備兩端,一側為服務端,它會監聽一個埠等待客戶端連線;
另一側為客戶端,通過傳入服務端的ip和埠,才能主動連線到伺服器。
而埠轉發工具(lcx.exe/htran)的工作原理其實是將兩條 socket 隧道對接起來,打造一條可“非同步雙向通訊”的轉接隧道。由於合法的socket隧道有兩種介面分別對應服務端和客戶端,根據數學中的排列組合可計算出埠轉發供具有4種工作狀態,它們是:
1.“客戶端” 接 “客戶端”
2.“客戶端” 接 “服務端”
3.“服務端” 接 “客戶端”
4.“服務端” 接 “服務端”
又由於埠轉發為“非同步雙向通訊”隧道,隧道轉接不分先後,所以狀態2和狀態3 是相同的,合併之後,便分別對應了lcx的三種工作模式,如下所示:
1、slave “客戶端” 接 “客戶端”
2、tran “服務端” 接 “客戶端”
3、listen “服務端” 接 “服務端”
於是便可理解lcx工具的三種命令引數的格式為何是以下的樣子了:
–listen ConnectPort TransmitPort
–tran ConnectPort TransmitHost TransmitPort
–slave ConnectHost ConnectPort TransmitHost TransmitPort
Socks代理
Socks 代理從名字中的“代理”二字就可以瞭解它的功能核心:那就是幫他人完成socket訪問網路。
有過翻牆經歷的同學大概知道瀏覽器(IE/Chrome/FireFox等)有設定socks代理的配置項,可用來訪問網路的能力。當我們通過代理伺服器訪問一個網址時,socks伺服器其實是起到了一箇中間人的身份,他分別與兩方(瀏覽器/被訪問的網站)通訊然後將獲取到的結果告知另一方。
在使用代理服務的過程中我們會發現,只要配置好socks代理後,就不再需要指定被訪問目標,直接在瀏覽器的位址列輸入地址就能訪問任意網站。這是由於socks代理中有一個互動協議,當我們準備訪問一個網站並敲擊回車時,瀏覽器會先發送一個被訪問目標的基本資訊(URL和服務埠)給socks服務端,socks服務端解析了這個資訊後,會代替瀏覽器去訪問目標網站,並將訪問結果回覆給瀏覽器端。這便是socks代理的工作原理了。
通過這段對socks代理的描述,可知socks代理其實可理解為一個增強版的 lcx -tran 它在服務端監聽一個服務埠(ConnectPort),當有新的連線請求時會從socks協議中解析出訪問目標的URL(TransmitHost)的目標埠(TransmitPort),再開始執行lcx -tran 的具體功能。
兩者的異同
1.socket埠轉發無需通訊協議支援,而socks代理需要socks協議支援。
2.socket埠轉發有三種工作方式,而socks代理僅有一種工作方式。
3.如果說socks是幫他人訪問網路(一對多),那麼埠轉發就是幫他人訪問主機的某個埠(一對一)。
一句話總結:
這篇筆記從“socket埠轉發”和 “socks代理” 兩者的工作原理出發,介紹了兩者的區別。