Вопрос или проблема
Как запустить SSH-демон на порту, отличном от стандартного 22?
Я напортачил с конфигурацией SSH на облачной виртуальной машине, из-за чего теперь SSH всегда запрашивает пароль. Мои первые попытки исправить это заблокировали меня, и я был вынужден размонтировать диск, смонтировать его внутри работающей виртуальной машины и исправить файлы до известного рабочего состояния. Однако он все еще требует ввода пароля.
Я хотел бы обновить свой /etc/ssh/sshd_config
и перезапустить основной ssh-демон, который я могу протестировать, при этом оставив другой демон работающим с старой конфигурацией, чтобы я мог восстановить конфигурацию, если первый заблокирует меня. Как бы я сделал это, особенно на Ubuntu?
Вы не указали версию Ubuntu, так что я не уверен, какую систему инициализации вы используете.
Если это systemd, у вас может быть файл /etc/systemd/system/sshd.service
. Вы могли бы сделать его копию как /etc/systemd/system/sshd_alt.service
. Далее измените строку ExecStart
и добавьте -p 22000
или что-то подобное. После этого выполните systemctl enable sshd_alt
и systemctl start sshd_alt
. Вы также можете указать совершенно другой файл конфигурации.
Вы также можете просто вручную запустить копию в screen или что-то подобное, если это однократное дело. Просто запустите screen и выполните что-то вроде /usr/sbin/sshd -D -p 22200
. Вы запустите запасной sshd-демон, пока не сможете переподключиться к этому screen и убить процесс.
Или, как сказал @EEAA. Просто не отключайтесь, используйте вторую сессию, чтобы протестировать, можете ли вы переподключиться.
Вы можете запустить sshd на альтернативном порту с помощью этой команды:
sshd -p 12345
Замените 12345 на ваш любимый номер порта. Если sshd
не в вашем PATH
, вам может понадобиться использовать полный путь в команде, например /usr/sbin/sshd
.
Просто оставьте одну сессию SSH активной и используйте другую, чтобы внести изменения в конфигурацию. Ваша оригинальная сессия останется подключенной и доступной для возврата изменений, если ваши изменения конфигурации что-то сломают.
Я только что нашел решение для систем на базе Debian. Надеюсь, вы сможете сделать то же самое на любой другой Unix-системе.
Создайте файл service-unit /etc/systemd/system/extra-sshd.service, где Alias удален, и для ExecStart добавлен ключ -f с новым путем конфигурации, в моем примере это -f /etc/ssh/extra_sshd_config
[Unit]
Description=Extra SSH server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -f /etc/ssh/extra_sshd_config -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=extra-sshd
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
Клонируйте /etc/ssh/sshd_config в /etc/ssh/extra_sshd_config, затем отредактируйте там Port, PidFile и все, что вам нужно. Например, я разрешил порт 22 только для пользователя git, чтобы позволить запросы gitlab pull-push и переместил основную конфигурацию на другой кастомный порт.
Пример отредактированных/добавленных строк ниже
Дополнительная конфигурация /etc/ssh/extra_sshd_config
Port 22
AllowUsers git
PidFile /var/run/extra-sshd.pid
Основная конфигурация /etc/ssh/sshd_config
Port 2222
После того, как все подготовлено, перезагрузите демон systemd и попытайтесь запустить и проверить статус службы
systemctl daemon-reload
systemctl restart extra-sshd
systemctl status extra-sshd
Должен быть ответ Active (Running) как ниже
● extra-sshd.service - Extra SSH server
Loaded: loaded (/etc/systemd/system/extra-sshd.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2025-02-14 14:58:48 UTC; 9s ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 1328991 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 1329004 (sshd)
Tasks: 1 (limit: 9456)
Memory: 1.2M
CGroup: /system.slice/extra-sshd.service
└─1329004 sshd: /usr/sbin/sshd -f /etc/ssh/extra_sshd_config -D [listener] 0 of 10-100 startups
Feb 14 14:58:48 gitlab-1 systemd[1]: Starting Extra SSH server...
Feb 14 14:58:48 gitlab-1 sshd[1329004]: Server listening on 0.0.0.0 port 22.
Feb 14 14:58:48 gitlab-1 sshd[1329004]: Server listening on :: port 22.
Feb 14 14:58:48 gitlab-1 systemd[1]: Started Extra SSH server.
Если все прошло успешно, вы можете включить автозапуск нового дополнительного ssh-демона, который будет запускать его при каждом загрузке/перезагрузке системы
systemctl enable extra-sshd
.
Ответ или решение
Если у вас возникла необходимость запустить временный второй SSH сервер на другом порту, это может быть связано с различными проблемами, такими как внесение изменений в конфигурацию текущего SSH сервера, которые могут привести к потере доступа, или отладке конфигурации без вмешательства в основной сервер. Рассмотрим пошагово, как это сделать на примере Ubuntu с использованием systemd.
Теория
SSH (Secure Shell) — это сетевой протокол, который позволяет безопасно управлять сетевыми сервисами на уровне приложений. Обычно SSH сервер слушает на стандартном порту 22. Запуск дополнительного SSH сервера на другом порту позволяет проводить изменения в конфигурации и тестирование без риска потерять доступ к системе в случае ошибки.
Пример
Подготовка
-
Резервное копирование текущей конфигурации: всегда начинайте с создания резервной копии текущей конфигурации SSH, чтобы иметь возможность вернуться к предыдущему рабочему состоянию.
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
-
Создание альтернативного файла конфигурации: скопируйте текущий файл конфигурации SSH в новый, где будем вносить изменения.
sudo cp /etc/ssh/sshd_config /etc/ssh/extra_sshd_config
-
Изменение конфигурации нового SSH сервера: в файле
/etc/ssh/extra_sshd_config
измените параметры, такие как номер порта и добавьте уникальный идентификатор PID файла.Пример изменений:
Port 2222 PidFile /var/run/extra-sshd.pid
Применение
-
Создание нового unit-файла для systemd: создайте файл службы для управления новым SSH процессом.
sudo nano /etc/systemd/system/extra-sshd.service
Вставьте в него следующую конфигурацию:
[Unit] Description=Extra SSH server Documentation=man:sshd(8) man:sshd_config(5) After=network.target auditd.service ConditionPathExists=!/etc/ssh/sshd_not_to_be_run [Service] EnvironmentFile=-/etc/default/ssh ExecStartPre=/usr/sbin/sshd -t ExecStart=/usr/sbin/sshd -f /etc/ssh/extra_sshd_config -D $SSHD_OPTS ExecReload=/usr/sbin/sshd -t ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartPreventExitStatus=255 Type=notify RuntimeDirectory=extra-sshd RuntimeDirectoryMode=0755 [Install] WantedBy=multi-user.target
-
Запуск и проверка работы нового SSH сервера: После создания конфигурации, выполните перезагрузку конфигурации systemd и запустите новую службу.
sudo systemctl daemon-reload sudo systemctl start extra-sshd sudo systemctl status extra-sshd
Убедитесь, что новый SSH сервер запущен и активен. Если все прошло успешно, вы увидите строки с подтверждением успешного запуска.
-
Включение автозагрузки для нового SSH сервера: если вы планируете использовать его долгое время, активируйте автозагрузку.
sudo systemctl enable extra-sshd
Заключение
Запуская дополнительный SSH сервер на отдельном порту, вы обеспечиваете себе запасной путь для восстановления системы в случае ошибок при внесении изменений в основной SSH сервер. Это особенно важно для удаленных серверов и виртуальных машин в облаке, где физический доступ к оборудованию невозможен.
Такая практика не только повышает безопасность ваших операций, но и снижает риск полного отказа системы, предоставляя возможность тестирования и отладки в реальных условиях. Всегда помните о соблюдении мер безопасности: используйте сложные пароли и, по возможности, ключи SSH для аутентификации.