Может ли sshd быть настроен для поддержки нескольких подключений при самостоятельной работе?

Вопрос или проблема

Я пытаюсь создать 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-сервера.

Оцените материал
Добавить комментарий

Капча загружается...