Вопрос или проблема
Я пытаюсь создать Docker-образ SSH-сервера, который может устанавливать несколько одновременных подключений:
- Сервер
> sudo /usr/sbin/sshd -Ddp 1234
- Клиент 1
> ssh user@server -p 1234
user@server's password:
...
- Клиент 2
> ssh user@server -p 1234
ssh: connect to host server port 1234: Connection refused
Та же самая серверная машина, на которой демон sshd запущен через systemd, позволяет устанавливать несколько подключений.
Есть ли способ настроить sshd
для работы в автономном режиме, то есть без службы как systemd, или sshd
по своей сути предназначен для обработки только одного соединения, а параллельность обеспечивается управляющим процессом? Если да, то что делает systemd для обеспечения параллельных подключений, если он только сообщает ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
(не похоже, чтобы SSHD_OPTS
где-то устанавливался)?
Я думаю, что -d
мешает. Из man 8 sshd
:
sshd
слушает подключения от клиентов. […] Он форкает новый демон для каждого входящего соединения. […]
И далее [упоминается особо]:
-d
Режим отладки. Сервер отправляет подробный отладочный вывод в стандартную ошибку и не переводит себя в фоновый режим. Сервер также не будет форкать и обработает только одно соединение. […]
Мои тесты показывают, что sshd -d
ведет себя как вы описали. Когда я запускаю его без -d
, он способен правильно обрабатывать несколько подключений.
Отладка sshd для нескольких подключений может быть выполнена с помощью:
/usr/sbin/sshd -Deo LogLevel=DEBUG3
Это объединяет эти три флага:
-D
: Запускает sshd в первом плане-e
: Пишет отладочные логи в стандартную ошибку вместо системного журнала-o LogLevel=DEBUG3
устанавливает максимальный уровень подробности
Вместе это предоставляет ту же функциональность, что и запуск /usr/bin/sshd -ddd
, но без ограничения на одно соединение.
.
Ответ или решение
Конфигурация sshd
для поддержки нескольких подключений при отдельно стоящем выполнении, без управления системой, такой как systemd, является интересной и актуальной темой для профессионалов в области информационных технологий. В этой статье мы рассмотрим, как sshd
функционирует, какие параметры влияют на его поведение, и как добиться многопоточности.
Теория
sshd
(SSH Daemon) — это серверная часть протокола SSH, которая отвечает за управление входящими соединениями от SSH-клиентов. Он изначально разработан для поддержки многопользовательской работы. Когда sshd
работает в нормальном режиме, он по умолчанию слушает порт, ожидая подключения, и затем порождает новый процесс для каждого входящего соединения. Это позволяет серверу обрабатывать несколько соединений одновременно.
Параметры запуска:
-D
: Данный флаг запускает демона в переднем плане, то есть он работает как процесс, не переходя в фоновый режим.-d
: Включает режим отладки, выводя подробную информацию о процессах работы демона. Однако, как указано в документации, этот флаг ограничивает демон одним соединением, так как он не создает новые процессы для дополнительных подключений.
Пример
В предоставленном примере вы запускаете sshd
с параметрами -Ddp 1234
. Ключ -p
указывает порт, на котором сервер должен слушать соединения. Однако, включение -d
ограничивает сервер одной сессией. Это отвечает на ваш вопрос о том, почему следующий клиент получает сообщение "Connection refused".
Применение
Если вы хотите, чтобы sshd
мог обслуживать несколько подключений одновременно в режиме standalone, без использования systemd
или аналогичного менеджера процессов, вам нужно отказаться от флага -d
. Это позволит серверу автоматически порождать дочерние процессы для каждого нового подключения. Таким образом, корректная команда для запуска может выглядеть так:
sudo /usr/sbin/sshd -Dp 1234
При этом конфигурация сервера станет аналогичной конфигурации, используемой системами процесс-менеджерами, такими как systemd
.
Дебаггинг без ограничения
Если вам нужно проводить отладку, сохраняя возможность обработки нескольких подключений, стоит использовать комбинацию флагов -D
, -e
и -o LogLevel
:
/usr/sbin/sshd -Deo LogLevel=DEBUG3 -p 1234
Эти параметры позволяют выводить подробные отладочные сообщения без ограничения соединений. -e
направляет вывод на стандартную ошибку, -o LogLevel=DEBUG3
задает максимальный уровень подробности логов, а -D
позволяет оставаться в переднем плане.
Заключение
Конечно, sshd
предназначен для работы в многопользовательском режиме, и его правильная конфигурация является ключом к обеспечению множества соединений. Важно помнить, что хотя systemd
и другие сервис-менеджеры могут предлагать полезные функции управления, такие как автоматический перезапуск и управление зависимостями, сами по себе они не влияют на базовую способность sshd
к многопоточности.
Оптимальная настройка sshd
в ручном режиме позволяет сохранить контроль и гибкость конфигурации, которые могут быть важны для конкретных нужд вашего проекта по созданию Docker-изображения для SSH-сервера.