透過防火牆的 AutoSSH - 網路上許多設備的最佳實務?

透過防火牆的 AutoSSH - 網路上許多設備的最佳實務?

我的團隊正在嘗試找到一種解決方案,以便在多個位置使用自己的防火牆遠端存取和更新防火牆後面的多個 Linux 裝置。傳統上,我們會造訪企業的實體網站並使用從其網路內執行的 Ansible 更新設備,或透過 RDP 和單獨的 SSH 存取進行變更。連接埠轉送不是一種選擇,即使對於堡壘也是如此。

||REMOTE SERVER|| ===> ||LOCATION 1 FIREWALL|| ===> [DEVICE 1, DEVICE 2, ..., DEVICE N]
(executing cmds)  ===> ||LOCATION 2 FIREWALL|| ===> [DEVICE 1, DEVICE 2, ..., DEVICE N]
                  ===> ||LOCATION 3 FIREWALL|| ===> [DEVICE 1, DEVICE 2, ..., DEVICE N]
                  ...
                  ===> ||LOCATION N FIREWALL|| ===> [DEVICE 1, DEVICE 2, ..., DEVICE N]

AutoSSH 的最佳實踐是什麼,或者是否有更適合維護這些設備的替代方案?到目前為止我們有兩種解決方案。

解決方案 1 - 適用於每台設備的 AutoSSH:

- 與每個網路上的每個裝置建立 AutoSSH 連線(每個位置可能有數百個)。為每個設備配置 SSH 存取。

Host loc_1_device_1
        HostName localhost
        Port 6000
        User maintenance
        IdentityFile /home/devops/.ssh/remote_maint

Host loc_1_device_2
        HostName localhost
        Port 6001
        User maintenance
        IdentityFile /home/devops/.ssh/remote_maint
Host loc_1_device_3
        HostName localhost
        Port 6002
        User maintenance
        IdentityFile /home/devops/.ssh/remote_maint

Host loc_2_device_1
        HostName localhost
        Port 7000
        User maintenance
        IdentityFile /home/devops/.ssh/remote_maint

Host loc_2_device_2
        HostName localhost
        Port 7001
        User maintenance
        IdentityFile /home/devops/.ssh/remote_maint

解決方案 2-僅適用於代理/跳轉主機的 AutoSSH:

  • 從我們每個客戶網路上的單一代理程式(可能是作為故障轉移的輔助代理)建立 AutoSSH 連線。配置每個設備對遠端伺服器上連接埠的 SSH 存取。
Host location_1
        HostName localhost
        Port 6000
        User maintenance
        IdentityFile /home/devops/.ssh/remote_maint

Host location_2
        HostName localhost
        Port 6001
        User maintenance
        IdentityFile /home/devops/.ssh/remote_maint

從那裡開始,使用或一些代理命令的 ansible 配置似乎很容易連接。ssh -t location_1 ssh [email protected]

我已經對解決方案 2 進行了概念驗證,從遠端伺服器運行 Ansible 命令,它似乎運作良好,但團隊中的其他成員反對採用解決方案 1,以保持 1-1 的庫存每個設備(這應該是Ansible的全部要點?我對解決方案 1 感到擔憂的是,可能有數千台設備試圖同時維護反向 SSH,這可能會導致不必要的網路開銷。從該網路新增和刪除設備似乎也是不必要的工作。

還有另一種方法可以解決這個問題嗎?我是否走在正確的軌道上,還是我因為認為團隊其他成員都瘋了而瘋了?

答案1

我正在使用您的解決方案 1,但自動分配連接埠號碼。
我不需要單獨配置每個設備。

這是透過多階段過程完成的。如果設備第一次連接,它不知道必須使用哪個連接埠號碼。因此它透過 ssh 連接伺服器,發送它自己的 MAC 位址。
伺服器分配一個空閒連接埠號,儲存它並將該連接埠告訴設備。設備儲存所有未來連接的連接埠號碼。

然後設備重新連接該連接埠號碼。

所有設備都使用相同的“私鑰”,但該金鑰只能用於建置到伺服器的隧道。為了連接設備,我的公鑰儲存在每台設備上。

在伺服器上,authorized_keys 檔案包含該金鑰的一個簡單命令(用於透過 MAC 分配新金鑰的腳本)。隧道必須通過-N

command="/home/tunnel/reverse_server/reverse_server.py",no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa <PUBLIC-KEY-FOR-ALL-DEVICES>

在伺服器上,GatewayPorts no應在 /etc/sshd/sshd_config 中配置該選項,以避免外部連接埠存取。

相關內容