目前,我們有一些實驗室,除了 Bastion VM 之外,所有實例都位於私有子網路中。因此,開發人員應該創建一個從筆記型電腦到 Bastion 的 SSH 隧道,並創建另一個從 Bastion 到某些微服務的隧道,以便他們可以存取 UI。
過程如下所示:
ssh -i <key>.pem -L <port x>:localhost:<port x> user@<hostname of Bastion>
User logged in to Bastion VM.
ssh -i <key>.pem -L <port x>:<hostname of microservice>:<port of microservice> user@<hostname of microservice>
Now they are able to access UI at http://localhost:<port x>
現在,這對於日常使用來說是相當複雜/耗時的任務,因此我正在考慮設定可以配置為一鍵執行相同操作的軟體。
我發現保護管道,但不確定如何將其用於我的目的。有人可以建議使用其他軟體來實現上述目標的替代方案嗎?
答案1
它很複雜,因為你正在以複雜的方式來做這件事。 OpenSSH 已經有簡化這種頻繁連線的機制。 (筆記:這篇文章假設開發者擁有私鑰兩個都本機上的連接,即堡壘主機不保存一些不可複製的憑證。
首先找到一種方法將其壓縮為一個 SSH 命令。這實際上稍微逆轉了隧道,因為堡壘主機現在中繼 SSH 連線而不是 Web 連線。
ssh -i <key>.pem -o ProxyCommand="ssh -i <key>.pem -W %h:%p user@<bastion>" -L <portX>:<microservice>:<mport> user@<hostname>
在最新的 OpenSSH 版本中,可以使用-J
/JumpHost
代替手動 ProxyCommand 進一步簡化:
ssh -i <key>.pem -J user@<bastion> -L <portX>:<microservice>:<mport> user@<hostname>
現在將其轉換為 ~/.ssh/config 選項 - 確定連接到堡壘主機本身所需的選項、適用於服務主機的選項以及所有這些主機通用的選項(“主機”部分接受多個名稱甚至通配符):
Host <bastion>
User <user>
IdentityFile <key>.pem
Host <hostname>
User <user>
IdentityFile <key>.pem
#JumpHost <bastion>
ProxyCommand ssh -W %h:%p <bastion>
有了這個(可以集中部署),您的命令就變成了:
ssh -L <portX>:<microservice>:<mport> <hostname>
(還有一種方法可以自動附加公司網域,例如,如果伺服器名稱為 svc1.dev.example.com,則Hostname %h.dev.example.com
或CanonicalDomains dev.example.com
會讓您運行ssh svc1
。)
這與通用方法一樣簡單 - 其餘四個參數本質上是可變的(取決於每個開發人員的需求),因此即使您在頂部添加圖形 UI,用戶也需要提供相同數量的信息。 (它可以在任何作業系統上與 OpenSSH 搭配使用。)
也就是說,如果相同的每次都建立隧道,也可以在~/.ssh/config中編碼(-L
對應LocalForward),開發者只需執行即可ssh <hostname>
。
(實際上,任何能夠運行 OpenSSH 的作業系統也支援腳本,通常以 sh/bash 和/或命令別名編寫。)