SSH Tunnel (Port Forwarding) 速記法


好像好久沒有更新了,回來刷一下存在感。

最近一直遇到需要打 ssh tunnel 的情境,然而,網路上那些圖解的 SSH Tunnel 對我來說是越看越ㄇㄤ QQ,可能我對於圖像的理解有一點點小障礙吧,以下是我自己對於 SSH Local, Remote 以及 Dynamic Forwarding 的速記法。

首先是一個定則就是 目標:原始IP:原始Port

Local Forwarding

顧名思義, Local 就是要把遠端的東西「打回我們 Local」。

舉例來說,遠端機器有開了一個 3000 Port 在 127.0.0.1,我們希望在我們本機上面把它接出來,接到我們家的 5000 Port,那麼需要這樣下。

ssh -L 5000:127.0.0.1:3000 user@host

-L 是打回我們自己的Host, 127.0.0.1:3000 是遠端的 IP 跟 Port

另外假設,遠端的機器摸得到 192.168.87.8:80 ,而我們機器也希望可以摸到的話,可以輸入以下指令,透過 host 機器把 192.168.87.8:80 轉到我們 Local 的 127.0.0.1:9487。

ssh -L 9487:192.168.87.8:80 user@host

Remote Forwarding

顧名思義, Remote 就是要把我們家的東西「送過去 Remote」。

假設我們在本地開了一個 127.0.0.1:7414 , 而我們希望把這個東西給轉去遠端的機器的 127.0.0.1:9453 上,則可以使用

ssh -R 9453:127.0.0.1:7414 user@host

這邊的 127.0.0.1:7414 是我們機器上的 IP 跟 Port,而 9453 則是遠端機器的 Port,也就是打過去的目標。

在預設狀況下,透過 -R 打的機器都會在遠端的 127.0.0.1 上面,如果希望可以打到遠端的 0.0.0.0,則需要修改 /etc/ssh/sshd_config

GatewayPorts yes

Dynamic Forwarding

動態是最簡單又最好理解的東西,假設我們希望直接把遠端機器做為跳板,開一個 Socket 5 Server,則我們可以輸入

ssh -D 8787 user@host

這個 8787 Port 會開在我們本機的 127.0.0.1 上面,我們可以直接去瀏覽器設定 socks5 ,或是掛 Proxychains 來做下一步的事情。

應用

假設我在內網裡面有一台可以聯外的機器,它沒有固定 IP,但我們希望可以使用它的 RDP 服務,而我們在外網備了一台 VPS 或其他有固定 IP 的 Server host,則我們可以在該內網機器上輸入

ssh -R 3000:127.0.0.1:3389 user@host

這個時候, host 機器上的 127.0.0.1:3000 就已經是我們內網機器的 3389 了,可以透過前面敘述方法,使用 ssh_config 方法開在 host 的 0.0.0.0。但這樣並不是一個安全的方法,對外的 RDP 很容易被外面的人亂打,所以安全的做法是可以套用 Local Port Forwarding。

我們在我們自己的電腦上,想要透過 host 機器摸到內網機器的 3389,目前這個 RDP 已經被我們打到 host 的 127.0.0.1 的 3000 了,所以我們只需要透過 Local Forwarding 的方法把 3000 打到我們自己電腦就好。

舉例來說,在自己電腦上輸入

ssh -L 4000:127.0.0.1:3000 user@host

此時,我們就會把遠端機器 host 的 3000 Port,也就是內網機器的 3389 給轉到我們自己電腦的 4000 Port,這個時候只需要在我們自己的電腦上 RDP 127.0.0.1:4000 就可以直接摸到內網的電腦!

至於想要永久恆定的使用 ssh , 一直穩定的把 Port 打出去的話,斷線自動重連,則可以使用 autossh 這個工具,參數的話,直接把它當普通 ssh 使用即可。


發表迴響