我的团队正在尝试寻找一种解决方案,以远程访问和更新多个位置防火墙后面的多个 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 中配置该选项,以避免外部端口访问。