방화벽을 통한 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

거기에서 연결 또는 프록시 명령에 대한 일부 가능한 구성을 사용하면 연결이 충분히 쉬워 보입니다.ssh -t location_1 ssh [email protected]

원격 서버에서 Ansible 명령을 실행하여 솔루션 2에 대한 개념 증명을 수행했는데 잘 작동하는 것 같지만 팀의 다른 구성원이 솔루션 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에서 옵션을 구성해야 합니다.

관련 정보