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 相關的文章

    發佈留言

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

    這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料