
Моя команда пытается найти решение для удаленного доступа и обновления нескольких устройств 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 для команды proxy.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, чтобы избежать доступа к внешнему порту.