SSH 命令的三種代理功能(-L/-R/-D)
日常開發中,資料庫沒有對外授權,只對特定伺服器(伺服器A,B,C)進行了授權,因此只能通過伺服器A,B,C作為跳板訪問資料庫;但是通過在伺服器A/B/C上進行埠對映,就可以變相實現外部環境訪問此隱私資料庫
1、SSH命令的三種代理功能(-L/-R/-D)
ssh 命令除了登陸外還有三種代理功能:
- 正向代理(-L):相當於 iptable 的 port forwarding
- 反向代理(-R):相當於 frp 或者 ngrok
- socks5 代理(-D):相當於 ss/ssr
如要長期高效的服務,應使用對應的專用軟體。如沒法安裝軟體,比如當你處在限制環境下想要訪問下某個不可達到的目標,或者某個臨時需求,那麼 ssh 就是你的兜底方案。
1.1、正向代理:
所謂“正向代理”就是在本地啟動埠,把本地埠資料轉發到遠端。
用法1:遠端埠對映到其他機器
HostB 上啟動一個 PortB 埠,對映到 HostC:PortC 上,在 HostB 上執行:
HostB$ ssh -L 0.0.0.0:PortB:HostC:PortC user@HostC
這時訪問 HostB:PortB 相當於訪問 HostC:PortC(和 iptable 的 port-forwarding 類似)。
用法2:本地埠通過跳板對映到其他機器
HostA 上啟動一個 PortA 埠,通過 HostB 轉發到 HostC:PortC上,在 HostA 上執行:
HostA$ ssh -L 0.0.0.0:PortA:HostC:PortC user@HostB
這時訪問 HostA:PortA 相當於訪問 HostC:PortC。
兩種用法的區別是,第一種用法本地到跳板機 HostB 的資料是明文的,而第二種用法一般本地就是 HostA,訪問本地的 PortA,資料被 ssh 加密傳輸給 HostB 又轉發給 HostC:PortC。
1.2、反向代理:
所謂“反向代理”就是讓遠端啟動埠,把遠端埠資料轉發到本地。
HostA 將自己可以訪問的 HostB:PortB 暴露給外網伺服器 HostC:PortC,在 HostA 上執行:
HostA$ ssh -R HostC:PortC:HostB:PortB user@HostC
那麼連結 HostC:PortC 就相當於連結 HostB:PortB。使用時需修改 HostC 的 /etc/ssh/sshd_config,新增:
GatewayPorts yes
相當於內網穿透,比如 HostA 和 HostB 是同一個內網下的兩臺可以互相訪問的機器,HostC是外網跳板機,HostC不能訪問 HostA,但是 HostA 可以訪問 HostC。
那麼通過在內網 HostA 上執行 ssh -R
告訴 HostC,建立 PortC 埠監聽,把該埠所有資料轉發給我(HostA),我會再轉發給同一個內網下的 HostB:PortB。
同內網下的 HostA/HostB 也可以是同一臺機器,換句話說就是內網 HostA 把自己可以訪問的埠暴露給了外網 HostC。
按照前文《韋易笑:內網穿透:在公網訪問你家的 NAS》中,相當於再 HostA 上啟動了 frpc,而再 HostC 上啟動了 frps。
1.3、本地 socks5 代理
在 HostA 的本地 1080 埠啟動一個 socks5 服務,通過本地 socks5 代理的資料會通過 ssh 連結先發送給 HostB,再從 HostB 轉發送給遠端主機:
HostA$ ssh -D localhost:1080 HostB
那麼在 HostA 上面,瀏覽器配置 socks5 代理為 127.0.0.1:1080,看網頁時就能把資料通過 HostB 代理出去,類似 ss/ssr 版本,只不過用 ssh 來實現。
2、使用優化
為了更好用一點,ssh 後面還可以加上:-CqTnN
引數,比如:
$ ssh -CqTnN -L 0.0.0.0:PortA:HostC:PortC user@HostB
其中 -C
為壓縮資料,-q
安靜模式,-T
禁止遠端分配終端,-n
關閉標準輸入,-N
不執行遠端命令。此外視需要還可以增加 -f
引數,把 ssh 放到後臺執行。
這些 ssh 代理沒有短線重連功能,連結斷了命令就退出了,所以需要些指令碼監控重啟,或者使用 autossh 之類的工具保持連結。
3、功能對比
正向代理(-L)的第一種用法可以用 iptable 的 port-forwarding 模擬,iptable 效能更好,但是需要 root 許可權,ssh -L 效能不好,但是正向代理花樣更多些。反向代理(-R)一般就作為沒有安裝 frp/ngrok/shootback 時候的一種代替,但是資料傳輸的效能和穩定性當然 frp 這些專用軟體更好。
socks5 代理(-D)其實是可以代替 ss/ssr 的,區別和上面類似。所以要長久使用,推薦安裝對應軟體,臨時用一下 ssh 挺順手。
4、正向代理—遠端埠對映到其他機器示例
1、檢視所有ssh程序
$ ps -ef | grep ssh
2、MySQL和伺服器資訊
- MySQL庫連線資訊如下:
伺服器地址: am-xxxxx.ads.aliyuncs.com
埠:3306
使用者名稱: bx_dsp 密碼: xxxxxx#$vVqoyNHXgsxxxx
- 跳轉伺服器是雙網絡卡:
伺服器的內網IP為 172.xxx.xxx.169
伺服器的外網IP為 123.xxx.xxx.240
3、在跳板機伺服器上配置埠轉發命令
該庫只能在 123.xxx.xxx.240 上進行訪問,所以為了方便外網訪問,需要進行埠轉發,在 123.xxx.xxx.240 配置如下命令,設定轉發埠
ssh -NCfg -L 18001: am-xxxxx.ads.aliyuncs.com:3306 [email protected]