前言
近期碰到了一個需要連接主機A的數據庫的需求,但是主機A是在內網中,無法直接連接到,也就無法訪問到數據庫。但是這里也有另一台主機B,和主機A同處一個內網中,但是連接主機B需要通過跳板機C。我的服務器是yyy。通過這次經歷我發現我對ssh連接的命令以及正反向代理的理解不是很充分,最終在rhh的幫助下才解決了問題。
主機 | 主機IP |
---|---|
A | 47.168.127.1 |
B | 47.168.127.2 |
yyy | 47.168.20.2 |
C | 47.168.127.43 |
思路
由於我無法直接連接主機A,但主機A和主機B在同一內網下,所以我可以通過主機B作為代理轉發主機A的3306端口到我的服務器yyy的3308端口即可。這樣我就可以直接在yyy上連接數據庫。所以此時只需要連接主機B即可,而連接主機B可以通過跳板機C代理連接。、
解決
ssh -o Proxycommand='ssh root@47.628.127.43 -P 123 -W %h:%p' root@47.168.127.2
ssh -R 3308:47.168.127.1:3306 root@47.168.20.2
這樣只需要在yyy的3308端口就可以連接到主機A的數據庫了
mysql -h 127.0.0.1 -P 3308 -u root -p
SSH命令
正向代理 ssh -fCNL
反向代理 ssh -fCNR
-f 后台執行ssh指令
-C 允許壓縮數據
-N 連接后不取得shell
-C 啟動壓縮,加快速度
正向代理(L)
將中間主機可訪問的主機指定端口鏡像到本地指定端口
ssh -L 本地IP:本地端口:中間主機可訪問的IP:中間主機可訪問的IP的端口 root@中間主機
反向代理(R)
將本地可訪問的主機的指定端口鏡像到遠程指定端口
ssh -R 遠程IP:遠程端口:本地可訪問IP:本地可訪問IP的端口 root@遠程主機
端口動態轉發
當訪問internet時,本機的1080端口作為代理服務器(socks5代理),訪問請求被轉發到ssherver上,由sshserver代替之訪問internet
ssh -fCND 1083 root@x.x.x.x
ssh -fN -D 0.0.0.0:1083 root@x.x.x.x
執行之后 使用本地1083的socks5代理,流量顯示為服務器x.x.x.x的ip