動態埠轉發:安裝帶有 SSH 的 SOCKS 伺服器
在上一篇文章(通過 SSH 實現 TCP / IP 隧道(埠轉發):使用 OpenSSH 可能的 8 種場景)中,我們看到了處理埠轉發的所有可能情況,不過那只是靜態埠轉發。也就是說,我們只介紹了通過 SSH 連接來訪問另一個系統的埠的情況。
在那篇文章中,我們未涉及動態埠轉發,此外一些讀者沒看過該文章,本篇文章中將嘗試補充完整。
當我們談論使用 SSH 進行動態埠轉發時,我們說的是將 SSH 伺服器轉換為 SOCKS 伺服器。那麼什麼是 SOCKS 伺服器?
你知道 Web 代理是用來做什麼的嗎?答案可能是肯定的,因為很多公司都在使用它。它是一個直接連接到互聯網的系統,允許沒有互聯網訪問的內部網客戶端讓其瀏覽器通過代理來(儘管也有透明代理)瀏覽網頁。Web 代理除了允許輸出到 Internet 之外,還可以緩存頁面、圖像等。已經由某客戶端下載的資源,另一個客戶端不必再下載它們。此外,它還可以過濾內容並監視用戶的活動。當然了,它的基本功能是轉發 HTTP 和 HTTPS 流量。
一個 SOCKS 伺服器提供的服務類似於公司內部網路提供的代理伺服器服務,但不限於 HTTP/HTTPS,它還允許轉發任何 TCP/IP 流量(SOCKS 5 也支持 UDP)。
例如,假設我們希望在一個沒有直接連接到互聯網的內部網上通過 Thunderbird 使用 POP3 、 ICMP 和 SMTP 的郵件服務。如果我們只有一個 web 代理可以用,我們可以使用的唯一的簡單方式是使用某個 webmail(也可以使用 Thunderbird 的 Webmail 擴展)。我們還可以通過 HTTP 隧道來起到代理的用途。但最簡單的方式是在網路中設置一個 SOCKS 伺服器,它可以讓我們使用 POP3、ICMP 和 SMTP,而不會造成任何的不便。
雖然有很多軟體可以配置非常專業的 SOCKS 伺服器,但用 OpenSSH 設置一個只需要簡單的一條命令:
Clientessh $ ssh -D 1080 user@servidorssh
或者我們可以改進一下:
Clientessh $ ssh -fN -D 0.0.0.0:1080 user@servidorssh
其中:
- 選項
-D
類似於選項為-L
和-R
的靜態埠轉發。像那些一樣,我們可以讓客戶端只監聽本地請求或從其他節點到達的請求,具體取決於我們將請求關聯到哪個地址:
-D [bind_address:] port
在靜態埠轉發中可以看到,我們使用選項 -R
進行反向埠轉發,而動態轉發是不可能的。我們只能在 SSH 客戶端創建 SOCKS 伺服器,而不能在 SSH 伺服器端創建。
- 1080 是 SOCKS 伺服器的典型埠,正如 8080 是 Web 代理伺服器的典型埠一樣。
- 選項
-N
防止實際啟動遠程 shell 互動式會話。當我們只用ssh
來建立隧道時很有用。 - 選項
-f
會使ssh
停留在後台並將其與當前 shell 分離,以便使該進程成為守護進程。如果沒有選項-N
(或不指定命令),則不起作用,否則互動式 shell 將與後台進程不兼容。
使用 PuTTY 也可以非常簡單地進行埠重定向。與 ssh -D 0.0.0.0:1080
相當的配置如下:
對於通過 SOCKS 伺服器訪問另一個網路的應用程序,如果應用程序提供了對 SOCKS 伺服器的特別支持,就會非常方便(雖然不是必需的),就像瀏覽器支持使用代理伺服器一樣。作為一個例子,如 Firefox 或 Internet Explorer 這樣的瀏覽器使用 SOCKS 伺服器訪問另一個網路的應用程序:
注意:上述截圖來自 IE for Linux :如果您需要在 Linux 上使用 Internet Explorer,強烈推薦!
然而,最常見的瀏覽器並不要求 SOCKS 伺服器,因為它們通常與代理伺服器配合得更好。
不過,Thunderbird 也支持 SOCKS,而且很有用:
另一個例子:Spotify 客戶端同樣支持 SOCKS:
需要關注一下名稱解析。有時我們會發現,在目前的網路中,我們無法解析 SOCKS 伺服器另一端所要訪問的系統的名稱。SOCKS 5 還允許我們通過隧道傳播 DNS 請求( 因為 SOCKS 5 允許我們使用 UDP)並將它們發送到另一端:可以指定是本地還是遠程解析(或者也可以兩者都試試)。支持此功能的應用程序也必須考慮到這一點。例如,Firefox 具有參數 network.proxy.socks_remote_dns
(在 about:config
中),允許我們指定遠程解析。而默認情況下,它在本地解析。
Thunderbird 也支持參數 network.proxy.socks_remote_dns
,但由於沒有地址欄來放置 about:config
,我們需要改變它,就像在 MozillaZine:about:config 中讀到的,依次點擊 工具 → 選項 → 高級 → 常規 → 配置編輯器(按鈕)。
沒有對 SOCKS 特別支持的應用程序可以被 sock 化 。這對於使用 TCP/IP 的許多應用程序都沒有問題,但並不是全部。「sock 化」 需要載入一個額外的庫,它可以檢測對 TCP/IP 堆棧的請求,並修改請求,以通過 SOCKS 伺服器重定向,從而不需要特別編程來支持 SOCKS 便可以正常通信。
在 Windows 和 Linux 上都有 「Sock 化工具」。
對於 Windows,我們舉個例子,SocksCap 是一種閉源,但對非商業使用免費的產品,我使用了很長時間都十分滿意。SocksCap 由一家名為 Permeo 的公司開發,該公司是創建 SOCKS 參考技術的公司。Permeo 被 Blue Coat 買下後,它停止了 SocksCap 項目。現在你仍然可以在互聯網上找到 sc32r240.exe
文件。FreeCap 也是面向 Windows 的免費代碼項目,外觀和使用都非常類似於 SocksCap。然而,它工作起來更加糟糕,多年來一直沒有缺失維護。看起來,它的作者傾向於推出需要付款的新產品 WideCap。
這是 SocksCap 的一個界面,可以看到我們 「sock 化」 了的幾個應用程序。當我們從這裡啟動它們時,這些應用程序將通過 SOCKS 伺服器訪問網路:
在配置對話框中可以看到,如果選擇了協議 SOCKS 5,我們可以選擇在本地或遠程解析名稱:
在 Linux 上,如同往常一樣,對某個遠程命令我們都有許多替代方案。在 Debian/Ubuntu 中,命令行:
$ Apt-cache search socks
的輸出會告訴我們很多。
最著名的是 tsocks 和 proxychains。它們的工作方式大致相同:只需用它們啟動我們想要 「sock 化」 的應用程序就行。使用 proxychains
的 wget
的例子:
$ Proxychains wget http://www.google.com
ProxyChains-3.1 (http://proxychains.sf.net)
--19: 13: 20-- http://www.google.com/
Resolving www.google.com ...
DNS-request | Www.google.com
| S-chain | - <- - 10.23.37.3:1080-<><>-4.2.2.2:53-<><>-OK
| DNS-response | Www.google.com is 72.14.221.147
72.14.221.147
Connecting to www.google.com | 72.14.221.147 |: 80 ...
| S-chain | - <- - 10.23.37.3:1080-<><>-72.14.221.147:80-<><>-OK
Connected.
HTTP request sent, awaiting response ... 200 OK
Length: unspecified [text / html]
Saving to: `index.html '
[<=>] 6,016 24.0K / s in 0.2s
19:13:21 (24.0 KB / s) - `index.html 'saved [6016]
要讓它可以工作,我們必須在 /etc/proxychains.conf
中指定要使用的代理伺服器:
[ProxyList]
Socks5 clientessh 1080
我們也設置遠程進行 DNS 請求:
# Proxy DNS requests - no leak for DNS data
Proxy_dns
另外,在前面的輸出中,我們已經看到了同一個 proxychains
的幾條信息性的消息, 非 wget
的行是標有字元串 |DNS-request|
、|S-chain|
或 |DNS-response|
的。如果我們不想看到它們,也可以在配置中進行調整:
# Quiet mode (no output from library)
Quiet_mode
via: https://wesharethis.com/2017/07/15/dynamic-port-forwarding-mount-socks-server-ssh/
作者:Ahmad 譯者:firmianay 校對:jasminepeng
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive