通过防火墙的 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 中配置该选项,以避免外部端口访问。

相关内容