SSH Tunnel 簡單粗暴的翻牆

SSH 全名稱為 Secure Shell 。乍看之下不容易懂他的意思,但比較熟悉作業系統的人會知道, shell 作為術語,通常指的是使用者用指令與作業系統溝通的介面,常見的例子有 bash, zsh 之類的。

SSH 可以用來對某台機器遠端登入,遠端傳檔。今天要介紹的是 SSH Tunneling ,可以把原本用目前機器發出的網路封包,透過用一台 SSH server 轉發,又稱為 SSH port forwarding 。通常用到這東西的理由是,因為某些特殊原因,目前裝置無法存取某個網路位置,但是另一台 SSH server 有能力訪問這個位置,就可以利用 SSH tunnel 讓客戶端用 SSH server 作為中轉站。有點像是開個後門讓原本無法存取的客戶端變得可以存取。舉例來說,可以用來看某些因為國家限制阻擋的網站。有點像是翻牆,但技術上不是用 VPN 。

https://www.ssh.com/academy/ssh/protocol

Local Forwarding

Local Forwarding 可以將本地的某個 port 被本地的 SSH client 監聽,並會把所有送到該 port (如上圖的 port 8080) 送到 SSH server 的 Target:80 去。

預設參數可以設定在 ~/.ssh/config 的 LocalForward 設定。

Remote Forwarding

Remote port forwarding
ssh -R 8080:localhost:80 user@server

如果想要讓 server 上面的 8080 對應到本地的 localhost:80 ,可以用上面的指令。這樣連打包推上 server 的功夫都省了,感覺適合拿來測試。這個指令就可以把 SSH server 所在機器的某個 port 接到本地機器。別人訪問 server 的時候,實際上會透過 SSH Tunnel 訪問你的機器。

Remote Forwarding 通常也用來開後門。假設我是某公司員工,有公司某台機器的權限,我可以用公司機器 Remote Forwarding 打通到我自己的私人機器上。如此一來就可以在我的機器上存取內部公司機密,並且流量還偽裝的很像是公司機器往外面 SSH 的正常連線。

一些設定檔的參數

GatewayPorts 可以決定是否允許外部的連線用這個 SSH tunnel 來做轉發。舉例來說,有時候 A 跟 B 打通了 SSH tunnel ,但是後來 C 機器遠端連過來使用這個 tunnel 就可以有機會被阻止。

AllowTcpForwarding 可以決定要不要允許 port forwarding 。

SOCKS

以上的做法都還跟 VPN 有一段差距,如果要做到類似 VPN 的效果,可以用 ssh -D 在本地建立一個 SOCKS server ,並且在瀏覽器設定將流量導到這個 Localhost (127.0.0.1) 的 SOCKS server 。以下指令在 127.0.0.1:1337 建立一個 SOCKS server 用於轉發流量至 SSH server。

ssh -D 1337 username@remote_host

你可以透過瀏覽器用 ipinfo.io 測試自己目前的 ip 是哪個。並且確認請求確實是透過本地的 SOCKS proxy 送出。


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *