利用 SSH tunnel mapping 本地與 EC2 的 Port
當 AWS 上的 EC2 架好了,而我們想要從本地端訪問私網域中的 EC2。
這時候我們就需要建立 ssh tunnel,讓我們可以透過公網域的 Bastion 機(跳板)去訪問目標的 Port。
此處同樣以 MongoDB 作為舉例。
目標 1 : 建立 ssh Tunnel
step1 : 不多說,直接下指令連線吧!
ssh -A -i <Bastion.pem 的路徑> -NfL [localhost:]27017:<Mongo-EC2 private ip>:27017 ec2-user@<Bastion-EC2 public ip>
* [ ] 表示可加可不加
* 其中的 private IP 是内網 IP,public IP 則是對外的 IP,這部分都可以從 EC2 的服務中找到
之後本地的 27017 port 就透過 ssh tunnel 跟 mongo-EC2 的 27017 port 連在一起囉。
未來丟資料上 EC2 的時候,只需要訪問本地的 27017 就可以了,不用透過 bastion 進到 mongo-EC2。
(也可以直接透過自己的 27017 看到 mongodb 的狀態)
但是單看這行指令可能不明所以,所以附上一張圖以及介紹一下 ssh 的指令
ssh
-A 讓你帶上 ssh-agent 所挾帶的 pem
-i 挾帶 pem
-N 連線後不執行指令
-f 連線後背景執行
-L 是啟用 SSH Tunnel
-v 啟動 debug
* 各指令詳細的說明,可以在你的 terminal 中鍵入 man ssh 去查看
這邊補充說明,建好連線之後,可以做的簡單操作
操作 1 : 在本地端用 python 建立連線及簡單的 pyMongo 使用。
from pymongo import MongoClient
#make a connection
client = MongoClient('localhost',27017)
#db name
db = client['db_name']
#collection name
collection = db['collection_name']
#insert data
collection.insert({"there":"is"})
操作 2 : 利用圖形化介面管理mongodb
step1 : 下載 mongo GUI:Robo3T
* https://robomongo.org/download
step2 :建立 new connection, address 為 localhost:27017
補充 : 關閉ssh tunnel的方式
Linux
step1 : 連線後下查目前所有聆聽port的指令
netstat -ntulp
會發現 31280 port 就被 ssh 這個程式佔用了。
所以現在連線 localhost 的 31280 port 就等於存取遠端的 <IP>:80。
step2 : 可以下 kill 指令把這個 ssh process 殺掉。
MacOS
* 須利用 lsof 取代 netstat
step1 :
lsof -nP | grep 27017
參考 :
lsof : https://tonydeng.github.io/2016/07/07/use-lsof-to-replace-netstat/
關閉 ssh tunnel 參考 : http://lab.howie.tw/2012/07/disable-encryption-ssh.html