1. 程式人生 > >SSH -R 反向埠轉發

SSH -R 反向埠轉發

反向埠轉發:例子1

相信很多人都會有這樣的需求:我實驗室的機器和宿舍的機器都處在區域網中,但我需要在宿舍訪問實驗室的機器,或者反過來。這個時候,你需要一臺處在公網的機器,如果沒有的話,可以考慮騰訊雲或者阿里雲的學生優惠。

假設現在你有一臺處在公網的機器 jumpbox,這臺機器是在任何地方都能訪問到的;你在實驗室也有一臺機子 lab,這臺機子只能在實驗室內部訪問,但他可以訪問公網,你希望能在任何地方都能訪問這臺機器。使用 ssh -R 可以輕鬆地做到這個事情。

lab$ ssh -R 10022:localhost:22 jumpbox
jumpbox$ ssh [email protected]
-p 10022 lab$

如果上面這個過程成功了,就說明在你執行 ssh -R 10022:localhost:22 jumpbox 之後,你成功地將 lab 上的 22 埠反向轉發到了 jumpbox 的 10022 埠。只要保持這個 ssh 不斷,任何一臺機器都可以首先連線到 jumpbox,然後通過 ssh [email protected] -p 10022 連回到 lab。可以看到,這裡 jumpbox 起到了一個跳板的作用,所以我們把它稱作跳板機。

不過上面這麼做並不穩健,如果因為網路波動導致 ssh -R 那個連線斷了,那麼從 jumpbox 就完全失去了到 lab 的控制。萬幸的是,有一個叫做 autossh 的軟體,可以自動的檢測斷線,並在斷線的時候重連。在 Ubuntu 上你可以使用 sudo apt-get install autossh 來安裝,在 Mac 上則是 brew install autossh。

lab$ autossh -NfR 10022:localhost:22 jumpbox

上面這句話裡面 -N 表示非不執行命令,只做埠轉發;-f 表示在後臺執行,也就是說,這句話執行之後 autossh 就在後臺默默工作啦;-R 10022:localhost:22 就是把本地的22埠轉發到遠端的10022埠。

現在,任何一臺電腦先連上跳板機,就可以連回內網的機子啦!

你甚至可以將這句話設定為開機時執行:在 /etc/rc.local 裡面 exit 0 這句話之前加上

su - user -c autossh -NfR 10022:localhost:22 jumpbox

其中 user 是你的使用者名稱。需要注意的是,如果你需要開機時執行 autossh,你需要配置公鑰登入,因為開機執行的時候是沒有互動介面讓你來輸入密碼的。

這裡順帶說一句,你可以繫結1024到65535之間的任意埠,只要這個埠之前沒有程式在用就行。

反向埠轉發:例子2

還是反向埠轉發,再舉一個很常見的例子:我在本地跑了一個網站,我想臨時把我的網站發給朋友看看。你可以很容易的復現這個實驗:在本地執行 python -m SimpleHTTPServer 即可在本地的8000埠啟動一個網站,你可以在瀏覽器中通過 http://localhost:8000/ 看到。下面我們想讓遠方的朋友看到這個網站。

local$ ssh -NR 0.0.0.0:18000:localhost:8000 jumpbox

遠方的朋友即可通過 http://jumpbox:18000/ 看到了。注意到這裡和上面的命令有一個小小的不同,就是多了 0.0.0.0,這告訴 ssh,要把18000埠繫結在遠端的所有IP上。如果像之前那樣省略的話,預設值是隻繫結在 localhost,也就是隻有在 jumpbox 本機才可以訪問,而其他人都不能訪問。

反向埠轉發:例子3

比方說在本地的127.0.0.1:1080運行了HTTP代理服務,現在我想讓另一臺機子 remote 也能夠使用這個HTTP代理。

local$ ssh -NR 11080:localhost:1080 remote
local$ ssh remote
remote$ export http_proxy=http://127.0.0.1:11080/
remote$ export https_proxy=http://127.0.0.1:11080/
remote$ curl http://ifconfig.co

看看返回的IP,是不是 remote 也用上了代理?