直入正題,先來一條命令:
ssh -N -D 9000 -f root@host.com
屬性解釋一下:
-D
這個屬性很神奇,關鍵的那句話是“and the application protocol is then used to determine where to connect to from the remote machine”,翻譯為”接下來應用程式協議就會決定去連哪”,應用程式協議指的是TCP/UDP。
它不僅僅是簡單連接埠轉寄,當資料到達伺服器端的這個連接埠後,ssh會嘗試解析這個請求,並進行TCP或者UDP請求(當然也就包括http請求),將得來的結果從這個連接埠再回傳到用戶端。
9000
代表指定本地的socks代理連接埠。
root@host.com
這是ssh標準常用命令~ 指定socks伺服器在哪,但這不代表監聽就一定開在伺服器,這取決於這條命令在哪執行。
-N
這是個輔助屬性,一般ssh連好以後就進入shell,可以讓你打命令了,我只要做連接埠轉寄,所以我不需要執行命令。
-f
這同樣是個輔助屬性,如果沒有它,只有-D和-N,那麼這個進程會在前台運行,阻塞後續操作,現象就是一個游標不停地在閃。用了它當前ssh進程就進後台運行了。
總結:
如果在伺服器上執行這條命令,譬如 ssh -N -D 9000 -f root@localhost,那麼伺服器就開好socks監聽連接埠了。
那麼這個連接埠轉寄可以被其他機器使用嗎?比如通過其他用戶端來直接連接 伺服器 的 9000 連接埠?答案是不行的,在主流 SSH 實現中,本地連接埠轉寄綁定的是 lookback 介面,這意味著只有 localhost 或者 127.0.0.1 才能使用原生連接埠轉寄 , 其他機器發起的串連只會得到“ connection refused. ”。好在 SSH 同時提供了 GatewayPorts 關鍵字,我們可以通過指定它與其他機器共用這個本地連接埠轉寄。
ssh-g -N -D 9000 -f root@host.com
如果在客戶機上執行,遠程連root@remotehost,那麼相當於在本地開了一個socks代理監聽,socks伺服器就是本機,但通過remotehost來處理請求。
網上有很多翻牆教程說要一個myentunnel通過ssh實現本地socks代理,其實如果你自己有ssh的vps,執行命令的許可權,直接在遠程主機上執行就開好socks代理了,那麼這軟體也不用運行了。