MySQL 在內網不能連?開 1 個洞吧!autossh Reverse Tunnel 教學
這篇躺在草稿區好久了,小蛙一直偷懶沒有寫,今天朋友遇到這個問題,小蛙幫忙處理了一下,趁著還有印象,趕快來把 SSH Reverse Tunnel 教學記下來。
有接觸過 Linux 的人都知道 SSH,但應該也有很多人跟小蛙一樣不知道有一個東西叫做 ssh reverse tunnel,可以透過 SSH 打出一個外部可以連進來的「洞」。這樣講很難懂,小蛙每次看完、做完就忘記了 … >< 這篇記錄一下流程。
環境 & 目的
小蛙有以下兩台機器,兩台都是 Ubuntu
- A:必須要透過 FortiClient VPN 才能經由內網 IP 進入的主機
- B:一台外部機器
小蛙的需求是要讓 B 可以連線到 A 的 MySQL,小蛙平常要連上 VPN 之後透過內部 IP 才連到的 A,因此從外部機器 B 沒辦法直接連到 A,小蛙接著要透過 SSH 打出一個反向的通道,這樣就可以讓外部機器 B 經由這個打出的通道,連進去 A 的 MySQL 裡。這就是這篇最主要的目的~
前處理
打洞之前需要做一些前處理
- 設定連線免輸入密碼(可參考這篇,最下方「設置公鑰」章節)
- 安裝 autossh:apt-get install autossh
前處理這樣就算結束了~
開洞囉!SSH Reverse Tunnel 教學
其實用 ssh 加一些設定就可以做到了,但是小蛙 survey 了一些文章後發現 autossh 可以很輕鬆做到這件事情,因此選擇了使用 autossh 來協助。
autossh -M 12345 -NfR 33306:localhost:3306 account@server -p112233 參數介紹 -M 12345 : 用來監聽 ssh 有沒有斷線的 port -NfR : N 不運行遠端指令、f 連線後背景執行、R 將遠端 port 對應到本地端 port 33306:localhost:3306 : 把遠端的 33306 對應到本機的 3306 account@server : 用來登入遠端 SSH 的帳號 -p112233 : 如果遠端 SSH 不是 22 port,可透過 -p 來指定 port
這樣看完還是霧沙沙,簡單的說因為 B 沒辦法連到 A,小蛙要從 A 執行上述指令,這樣就會連到 B,並且讓 B 可以透過 33306 port 連過來,而且連過來的時候對應到 A 的 3306 port。
前處理的時候已經設定登入免密碼,讓 A 在打 reverse tunnel 的時候不用再輸入密碼,而 autossh 又會在 ssh 斷線後自動重新連接。
小蛙很容易弄錯的點是 -R 後面參數的設定,也就是上面 33306:localhost:3306 的部份(這裡常常記反),但其實只要記
- 從內網主機 or 沒辦法透過外部連線、要打洞的主機下指令
- -R 的參數,前面的是對方 port,後面才是 localhost 本機自己的
測試
從 A 打反向通道到 B 之後,接著我們就要到 B 去測試到底能不能連上 A 啦~連上 B 後,小蛙要測試的是 MySQL,這邊可以直接用 mysql 的指令來做測試
mysql -umysql_account -p -h127.0.0.1 -P33306
噹啷~順利連上啦!
在 A 上面下 netstat -utln
可以看到多聆聽了 12345,在 B 上面下 netstat -utln
則會多聆聽 12345 及上面設定的 33306。
注意事項
ssh reverse tunnel 畢竟是在系統上面開洞,安全性上面多少會有一些影響,使用時要特別小心。
如果要關閉通道的話,只要下 ps -Al
1 S 0 23025 1 0 80 0 - 1092 pause ? 00:00:00 autossh
接著 kill 23025 就可以刪掉 ssh reverse tunnel 囉!
與 Ubuntu 相關的文章
- Ubuntu 安裝及設定 vsftp
- W: GPG error: 由於無法取得它們的公鑰,以下簽章無法進行驗證: NO_PUBKEY 4EB27DB2A3B88B8B
- Certbot error: ACMEv1 is deprecated and you can …
- SoftEther VPN 架設記錄
- MariaDB Replication 設定
- Ubuntu 使用 ssmtp 透過 Gmail 發送 email
- curl 的詭異問題 – Vultr DNS 設定
- Ubuntu 16.04 設定 Apache VirtualHost
- SSH 遠端登出後繼續執行
- Ubuntu 16.04 – phpmyadmin Deprecation Notice with PHP 7