將 SSH 和 Squid 用作代理時,它們有什麼區別?
很長一段時間(幾年),我一直在我的一台伺服器上使用 Squid 作為透明代理。
基本上,我在客戶端和 ssh + Squid 伺服器之間創建了一個 SSH 隧道,這樣做:
ssh -T -N -x -C -L3128:127.0.0.1:3128 cedric@xxx
然後我會啟動我的網路瀏覽器(鉻),在 127.0.0.1 埠 3128 上給它一個代理伺服器。
這在很長一段時間內都執行良好,但後來我開始在許多網站(論壇、使用 Google 作為登錄權限的 stackexchange 等)上出現日誌記錄問題。有些繼續正常工作(如 GMail 和所有 GMail 服務)。我不知道是什麼導致了登錄問題:我認為這是由於我在升級伺服器的作業系統和軟體時出現了一些 Squid 配置問題。
所以我考慮建立一個 VPN,但是通過閱讀一篇名為“SSH 作為窮人的 VPN”的文章,我意識到我可以使用 SSH 並簡單地從客戶端執行此操作:
ssh -D 5222 cedric@xxx -N
然後將我的瀏覽器配置為使用 127.0.0.1 作為埠 5222 上的 SOCKS 主機。
現在一切正常:所有登錄問題似乎都已解決,我什至不再需要伺服器上的 Squid。
但是我不明白它是如何工作的。從各種“我的 ip 是什麼”網站,我看到了我的伺服器地址(這就是我想要的)。此外,這些站點似乎沒有檢測到正在執行的 SSH“隧道”。
基本上我的問題是:從技術上講,使用 Squid 作為透明代理與使用“SSH -D … -N”和使用 VPN 之間的區別是什麼?
從我正在訪問的網站的角度來看,有什麼不同嗎?
另外我想知道我正在訪問的網站在使用“SSH -D … -N”時是否能夠檢測到我的真實IP?這在技術上是可行的,還是瀏覽器根本無法獲得該資訊?
- Squid 是 http 和 https 流量的特殊代理。因為它知道這個協議,它可以提供一些高級功能,如記憶體、過濾、重寫規則、dns 解析。所有網路瀏覽器都知道如何處理 http 代理,因為它是該協議規範的一部分。
此外,Squid 可以充當透明代理,您無需將 Web 瀏覽器配置為使用它,但防火牆會將流量重定向到代理。瀏覽器不知道它正在使用代理,這在這種情況下是透明的意思。從這個意義上說,您的舊設置並不透明。
- ssh -D 充當與協議無關的 SOCKS 代理。它只是接收所有進入隧道本地端的 socks 埠的流量,提取有效負載並將其發送到未修改和未檢查的遠端端,然後將其發送到真正的目的地。為了使 SOCKS 代理工作,客戶端程序必須特別支持它,因為從客戶端發送到 socks 代理的每個包都必須更改(封裝),以便 socks 代理知道將其發送到哪裡。我不知道是否所有的網路瀏覽器都支持它,但原則上它適用於許多協議,而不僅僅是 http。
3)您的舊命令行
ssh -T -N -x -C -L3128:127.0.0.1:3128 ...
只打開了一個簡單的隧道,所有進入本地埠 3128 的流量都未經修改地發送到預定義的目的地 127.0.0.1:3128。這可以用於任何客戶端,因為不需要修改已發送的包,但您只有一個固定的目的地。除了代理之外,ssh 始終使用加密隧道,因此您的數據在通過隧道時不會被窺探。
您的舊設置結合了方法 1 和 3,但原則上它們可以單獨工作,具體取決於具體情況。
- 使用 VPN,您還可以創建從本地主機到“代理”伺服器的加密隧道。在這種情況下,它不僅限於一個客戶端程序,而是您的作業系統會將所有非本地網路流量發送到您的代理,然後將其轉發到目的地。要管理它,您需要 root/管理員權限,因此設置起來可能不那麼容易。
在所有四種情況下,數據首先發送到遠端主機,然後遠端主機創建到目標 Web 伺服器的真實連接並發送您的請求。答案首先返回到遠端主機,該主機在一些內部數據中查找真正的目的地,然後將其發送回原始客戶端。顯示您的 IP 的網站只能看到遠端主機,不知道您的隧道/代理。
編輯:
如果一個網站真的想知道你的 IP,可能有一些可能性是通過網頁中的 javascript 或外掛,它們在你的瀏覽器中執行程式碼,可能會使用一些錯誤。如果您絕對需要隱藏您的真實 IP 地址,則必須禁用 javascript 和外掛。
編輯2:
添加了 VPN