Администрирование Linux-серверов

OpenSSH Server в Linux: установка, запуск и диагностика sshd

Как установить OpenSSH Server, определить фактический unit, включить запуск при загрузке, проверить listener и разобрать ошибку sshd.

14 минут
абстрактная иллюстрация: удалённое подключение и системная служба Linux
Установите серверный пакет OpenSSH из штатного репозитория пакетов своей ОС, затем найдите units, которые действительно поставил пакет, и управляйте ими через systemctl. Имя службы может быть ssh.service, sshd.service или механизмом сокетной активации, поэтому готовую команду из другой ОС переносить нельзя. Если sshd не запускается, сначала сохраните текст systemctl status и записи journalctl, затем проверьте конфигурацию штатной командой OpenSSH и конкретную причину ошибки.

Не потеряйте удалённый доступ

Перед изменением конфигурации подготовьте локальную, BMC/IPMI/iDRAC/iLO или иную out-of-band-консоль. Не закрывайте текущую SSH-сессию, пока не проверены конфигурация, состояние механизма активации и новое подключение в отдельном терминале. Успешная проверка синтаксиса не гарантирует, что удалённый вход сохранится.

Сначала определите дистрибутив, пакет и units

Пакет, имя systemd unit и механизм запуска зависят от дистрибутива Linux, его выпуска и сборки OpenSSH. Пакет openssh-server используется в перечисленных ниже выпусках, но это не делает одинаковыми их units и способ активации: одни выпуски по умолчанию запускают service unit, другие передают прослушивание порта socket unit. После установки проверьте оба факта на целевом хосте.

Это проверенные примеры выпусков, а не универсальная таблица для всех версий и путей обновления. На целевом хосте найдите установленные unit-файлы и сверьте механизм с документацией выпуска.

ОС и выпускСерверный пакетШтатный механизм по умолчаниюЧто учитывать
Ubuntu Server 22.04 LTSopenssh-serverssh.serviceОбычный service unit; не переносите сюда схему более новых выпусков Ubuntu без проверки.
Ubuntu Server 22.10 и 24.04 LTSopenssh-serverssh.socket, связанный с ssh.service, — для новой установкиНовые установки используют socket activation. Ubuntu 24.04, обновлённая с 22.04 LTS, может сохранить активацию через service unit, поэтому проверьте фактические units. Адреса и порты при socket activation проверяют по socket unit и локальным сокетам.
Debian 12openssh-serverssh.serviceШтатный запуск по умолчанию не следует определять по поведению Ubuntu, даже если имена пакета и service unit совпадают.
RHEL 8/9, Rocky Linux 8/9, AlmaLinux 8/9, CentOS Stream 9openssh-serversshd.serviceШтатная схема использует service unit; имя ssh.service из Debian и Ubuntu сюда не переносят.

Проверить установку и найти фактический механизм запуска

Эти команды не запускают SSH. Они устанавливают факты: есть ли серверный пакет, какие units доступны и какой из них сейчас активен.

  1. 1
    Определите ОС
    Посмотрите /etc/os-release. Это позволит выбрать ветку APT или DNF и не смешивать команды разных пакетных экосистем.
  2. 2
    Проверьте пакет в Debian или Ubuntu
    В DEB-системе запросите статус openssh-server через dpkg -s. Если пакет не установлен, команда завершится ошибкой — это ожидаемый результат проверки.
  3. 3
    Проверьте пакет в RHEL-подобной системе
    В RPM-системе выполните rpm -q openssh-server. Ответ с версией означает, что серверный пакет установлен; сообщение is not installed означает обратное.
  4. 4
    Найдите service и socket units
    Выведите unit-файлы с именами ssh и sshd, затем их текущее состояние. Запишите точное имя найденного service или socket unit: далее вместо <unit> используется именно оно.
  5. 5
    Выберите одну ветку активации
    Если установленный выпуск использует service unit, управляйте service unit. Если документация выпуска и найденные units показывают socket activation, управляйте socket unit. Не включайте одновременно произвольные ssh.service, sshd.service и *.socket только потому, что такие команды встречаются в инструкциях для других выпусков.
Показывает идентификатор и выпуск установленной ОС.
cat /etc/os-release
Проверка серверного пакета в Ubuntu Server или Debian.
dpkg -s openssh-server
Проверка серверного пакета в RHEL, Rocky Linux, AlmaLinux или CentOS Stream.
rpm -q openssh-server
Ищет установленные unit-файлы OpenSSH. Пустой вывод означает, что нужно перепроверить пакет, имя unit и документацию выпуска.
systemctl list-unit-files | grep -E '^(ssh|sshd)\.(service|socket)'
Показывает известные systemd units и их текущие состояния, включая inactive и failed.
systemctl list-units --all 'ssh*' 'sshd*'

Почему встречаются разные имена

Пакет сопровождает дистрибутив, а не сам протокол SSH. Сопровождающий выбирает имена unit-файлов, зависимости и способ активации. При socket activation systemd сначала открывает слушающий сокет, а запуск связанного демона происходит при подключении или по правилам unit. При обычном service unit постоянно работает процесс-демон. Детали следует сверять с официальным руководством именно вашего выпуска OpenSSH и дистрибутива.

Установить OpenSSH Server: ветки APT и DNF

Установка выполняется от имени суперпользователя или через sudo. Не подключайте сторонние репозитории ради OpenSSH, если штатный репозиторий ОС доступен. Подробности работы с APT — в статье «APT в Ubuntu и Debian: установка, обновление, удаление и очистка пакетов», с DNF — в «DNF и YUM: установка, обновление и удаление пакетов».

Установить пакет серверной части OpenSSH

  1. 1
    Ubuntu Server или Debian: обновите индекс и установите пакет
    Выполните sudo apt update, затем sudo apt install openssh-server. Просмотрите план APT до подтверждения, особенно на рабочем сервере.
  2. 2
    RHEL, Rocky Linux, AlmaLinux или CentOS Stream: установите пакет
    Выполните sudo dnf install openssh-server. В некоторых выпусках команда yum совместима с DNF, но предпочтительный интерфейс зависит от документации ОС.
  3. 3
    Повторите проверку пакета и units
    После успешной транзакции снова выполните проверку dpkg -s или rpm -q, затем найдите ssh* и sshd* units. Только после этого переходите к запуску.
Установка в Ubuntu Server и Debian.
sudo apt update && sudo apt install openssh-server
Установка в RHEL, Rocky Linux, AlmaLinux и CentOS Stream.
sudo dnf install openssh-server

Запустить SSH и включить его при загрузке

start меняет состояние сейчас, а enable настраивает автоматическую активацию при будущей загрузке. Одна команда не заменяет другую. Для socket activation аналогично: запускают и включают socket unit, а не предполагаемый service unit. Состояния active, enabled, static и failed описывают разные вещи; подробнее — в «systemd и systemctl: управление службами и автозагрузкой Linux».

Запустить найденный service или socket unit

Подставьте вместо <unit> фактическое имя из предыдущего раздела: например, ssh.service, sshd.service, ssh.socket или sshd.socket, только если оно существует на вашем хосте.

  1. 1
    Проверьте состояние до изменения
    Выполните systemctl status <unit> --no-pager -l. Если unit уже активен, не делайте restart без причины.
  2. 2
    Запустите выбранный механизм
    Для service unit используйте sudo systemctl start <unit>. Для документированного socket unit используйте ту же форму с именем socket: sudo systemctl start <unit>.
  3. 3
    Настройте активацию после загрузки
    Выполните sudo systemctl enable <unit>, затем проверьте результат через systemctl is-enabled <unit>. Включайте тот механизм, который используется в вашей схеме: service либо socket.
  4. 4
    Подтвердите текущее состояние
    Снова посмотрите systemctl status <unit> --no-pager -l. Для socket unit статус socket может быть активным, хотя постоянного процесса sshd в этот момент нет — это зависит от реализации активации.
Шаблон запуска и включения при загрузке. Замените `<unit>` только подтверждённым именем.
sudo systemctl start <unit> && sudo systemctl enable <unit> && systemctl is-enabled <unit>
Показывает состояние unit, последние сообщения и часто — непосредственную причину неудачного старта.
systemctl status <unit> --no-pager -l

Проверить локальный слушающий сокет SSH

Активный unit ещё не означает, что SSH принимает соединения. Проверьте локальный слушающий сокет. Стандартный порт OpenSSH — 22, но это только значение по умолчанию: фактический адрес и порт берут из эффективной конфигурации или параметров socket unit. При socket activation владельцем сокета в выводе может быть systemd, а не sshd.

Показывает локальные TCP-сокеты в состоянии LISTEN и связанные процессы, если информация доступна.
sudo ss -ltnp
Показывает эффективный параметр `Port` для sshd. В socket-активируемой схеме адрес и порт могут задаваться socket unit, поэтому результат сопоставляют с `systemctl cat <socket-unit>` и документацией пакета.
sudo sshd -T | grep '^port '

Локальный слушающий сокет не доказывает доступ с другого компьютера

Если ss показывает состояние LISTEN, а подключение извне не проходит, служба может быть исправна. Отдельно проверяют сетевую связность, маршрут, адрес назначения и правила фильтрации трафика. Настройка firewall и подробная сетевая диагностика находятся за рамками этой статьи.

Применить минимальное изменение конфигурации sshd

Путь к основному файлу конфигурации, включаемым файлам и доступные параметры зависят от сборки и выпуска; часто используется /etc/ssh/sshd_config, но путь нужно подтвердить документацией пакета и выводом установленного sshd. Не заменяйте весь файл шаблоном из интернета. Измените только требуемую строку или штатный drop-in, если он документирован для вашей ОС.

Безопасная последовательность изменения sshd_config

  1. 1
    Сохраните канал возврата
    Оставьте текущую SSH-сессию открытой и подготовьте консольный доступ. Зафиксируйте исходный файл и изменяемый параметр.
  2. 2
    Внесите минимальное изменение
    Редактируйте подтверждённый конфигурационный файл или поддерживаемый include-файл. Не меняйте одновременно порт, адреса прослушивания и параметры аутентификации: это затруднит поиск причины сбоя.
  3. 3
    Проверьте синтаксис до reload или restart
    Запустите sudo sshd -t. Если используется нестандартный путь, применяют документированную опцию -f <файл>. Ненулевой код возврата и текст ошибки означают, что применять изменение не следует.
  4. 4
    При необходимости посмотрите эффективную конфигурацию
    Команда sudo sshd -T печатает эффективные параметры после обработки конфигурации. Для условий Match документирован режим -C с параметрами подключения, например user=, host= и addr=. Проверяйте именно сценарий, который важен для подключения.
  5. 5
    Примените изменение способом, поддерживаемым unit
    Если service unit и его пакет поддерживают reload, используйте systemctl reload <service-unit>. Это можно проверить свойством CanReload. Если reload не поддержан или документация требует новый процесс, нужен restart, что может кратко прервать новые и текущие сеансы. Для socket-активации сверяйте действие с документацией выпуска: socket и service могут иметь разные роли.
  6. 6
    Проверьте после применения
    Проверьте status, listener и выполните новое SSH-подключение в отдельном терминале. Только после успешного нового входа завершайте старую сессию.
Проверяет синтаксис и часть обязательных условий конфигурации sshd. Успех не является проверкой сетевой доступности и не гарантирует, что конкретный пользователь сможет войти.
sudo sshd -t
Выводит эффективную конфигурацию sshd. Включаемые файлы и значения по умолчанию уже учитываются в пределах возможностей установленной версии.
sudo sshd -T
Проверяет эффективную конфигурацию для условий Match. Подставьте реальные параметры тестируемого подключения; поддержка и состав параметров зависят от версии OpenSSH.
sudo sshd -T -C user=<user>,host=<host>,addr=<client-address>
Показывает, заявляет ли service unit возможность reload. Значение не заменяет документацию пакета о способе применения конкретного изменения.
systemctl show -p CanReload --value <service-unit>

reload, restart и daemon-reload — разные операции

reload просит уже работающий демон перечитать конфигурацию, если это поддержано. restart останавливает и запускает его заново. systemctl daemon-reload перечитывает определения systemd и повторно запускает generators, но сам по себе не просит работающий sshd перечитать конфигурацию и не запускает SSH. Обычно он нужен после изменения unit-файла или его drop-in; в некоторых пакетных схемах socket activation генератор также читает отдельные параметры sshd_config. Например, в Ubuntu 24.04 генератор OpenSSH учитывает Port и ListenAddress при формировании настроек ssh.socket, поэтому применяйте такие изменения по документации конкретного выпуска. Собственный unit для SSH-обёртки не создают вместо штатного пакета; это отдельная задача из статьи «Как создать службу systemd для собственного приложения или скрипта».

sshd не запускается: status и просмотр логов systemd

При сообщении Failed to start не начинайте с повторных restart: они меняют состояние и могут смешать исходную ошибку с результатом новых попыток. Сначала соберите status и журнал для того unit, который действительно завершился ошибкой. journalctl читает журнал systemd; ключ -u отбирает записи одного unit, а -b — текущей загрузки.

Разобрать ошибку запуска SSH-службы или socket unit

  1. 1
    Зафиксируйте имя failed unit
    В выводе команды запуска или systemctl --failed найдите точное имя. При socket activation проверьте и socket unit, и связанный service unit: неудачным может быть любой из них.
  2. 2
    Прочитайте развёрнутый status
    Выполните systemctl status <unit> --no-pager -l. Обратите внимание на строку процесса, код завершения, Result и последние сообщения.
  3. 3
    Отберите записи журнала
    Выполните sudo journalctl -b -u <unit> --no-pager. Без sudo системный журнал доступен только пользователю с соответствующими правами. Если ошибка произошла до перезагрузки, уберите -b или задайте период времени.
  4. 4
    Сопоставьте сообщение с причиной
    Ошибка разбора параметра ведёт к sshd -t и изменённой конфигурации. Permission denied требует проверки прав и владельцев нужных файлов. Ошибка bind или address already in use указывает на конфликт адреса или порта. Condition, зависимость или ошибка socket unit относятся к условиям запуска systemd, а не обязательно к синтаксису sshd.
  5. 5
    Исправьте подтверждённую причину и повторите проверку
    После исправления вновь выполните sshd -t, запустите фактический unit и повторно соберите status. Не используйте reset-failed как исправление: оно очищает состояние failed, но не устраняет причину.
Выводит units в состоянии failed и помогает увидеть, какая часть цепочки SSH не запустилась.
systemctl --failed
Первичный источник диагностики: состояние, результат последней попытки и последние строки журнала.
systemctl status <unit> --no-pager -l
Сообщения текущей загрузки только для выбранного service или socket unit.
sudo journalctl -b -u <unit> --no-pager
Журнал unit за ограниченный период. Измените интервал на время фактического сбоя.
sudo journalctl -u <unit> --since '30 minutes ago' --no-pager

Проблема

После изменения конфигурации SSH недоступен

Возможные причины

  • Синтаксическая ошибка, некорректный include или неподходящее условие Match.
  • Недоступный host key, файл конфигурации или каталог с требуемыми правами.
  • Занятый адрес либо порт, ошибка параметров socket unit.
  • Включён не тот service/socket unit или enablement не соответствует механизму запуска.
  • Проблема лежит вне sshd: фильтрация трафика, маршрут, адрес или связность.

Решение

Не закрывая текущий сеанс, проверьте sudo sshd -t, systemctl status <unit> --no-pager -l, journalctl -b -u <unit> --no-pager и sudo ss -ltnp. Верните последнее минимальное изменение, если оно соответствует времени сбоя, и примените конфигурацию документированным способом. Если listener подтверждён локально, не меняйте sshd наугад: переходите к сетевой диагностике.

Как избежать

Держите консольный доступ, меняйте один параметр за раз, проверяйте синтаксис до применения и подтверждайте результат новым отдельным подключением.

Граница базовой настройки SSH

Эта инструкция покрывает жизненный цикл штатной системной службы: установку, активацию, проверку listener и первичную диагностику. Настройка аутентификации, ключей, MFA, ограничений пользователей, root-входа и иных мер hardening требует отдельной политики и проверки совместимости с доступом администраторов. Не применяйте универсальные «защитные» параметры без такого контекста.

Термины в статье

APT — система управления пакетами в Debian-подобных Linux, которая получает пакеты из репозиториев, разрешает зависимости и передаёт установку низкоуровневому менеджеру dpkg.
AlmaLinux — корпоративный дистрибутив Linux, поддерживаемый сообществом и AlmaLinux OS Foundation, ориентированный на совместимость с интерфейсами и экосистемой RHEL.
DNF — менеджер пакетов для RPM-дистрибутивов, разрешающий зависимости и выполняющий операции с репозиториями; в современных системах он заменил классический YUM.
Debian — универсальный дистрибутив Linux с пакетами DEB и системой APT, известный консервативной веткой Stable и разделением репозиториев по веткам разработки.
RHEL — корпоративный дистрибутив Linux от Red Hat с фиксированными основными версиями, сертификационной экосистемой и моделью сопровождения, зависящей от подписки.
Rocky Linux — корпоративный дистрибутив Linux, создаваемый из исходных пакетов экосистемы RHEL и ориентированный на совместимость с RHEL без использования его товарных знаков.
SSH — криптографический сетевой протокол для удалённого доступа и передачи данных, аутентифицирующий стороны и защищающий сеанс от перехвата.
Systemd unit — именованный объект systemd, представляющий отслеживаемый или управляемый ресурс, службу, задачу либо состояние системы.
Ubuntu Server — серверный вариант дистрибутива Ubuntu на базе Debian с APT и типовыми средствами автоматизации, доступный в виде установочных и готовых образов.
journalctl — консольная утилита чтения и фильтрации журнала systemd, выводящая сообщения по времени, юниту, загрузке системы, приоритету и другим полям.
sshd — серверный демон OpenSSH, принимающий SSH-подключения, аутентифицирующий пользователей и запускающий разрешённые удалённые сеансы или команды.
systemctl — командная утилита управления systemd, которая запускает и останавливает юниты, показывает их состояние и настраивает автоматическую активацию.
systemd — система инициализации и менеджер служб Linux, управляющий службами и другими ресурсами как объектами unit, обычно описанными unit-файлами.
Демон — обычно длительно работающий неинтерактивный процесс, который в фоне выполняет системную, сетевую или прикладную функцию.
Дистрибутив Linux — готовая операционная система на базе ядра Linux, включающая набор программ, репозитории, пакетный менеджер и правила обновления и сопровождения.
Менеджер пакетов — средство установки, обновления, удаления и учёта программных пакетов; высокоуровневые менеджеры также работают с репозиториями и разрешают зависимости.
Процесс — экземпляр выполняемой программы в Linux с PID, виртуальным адресным пространством, состоянием и связанными с ним ресурсами.
Репозиторий пакетов — структурированный источник пакетов и метаданных, из которого менеджер пакетов получает версии ПО, зависимости, обновления и информацию о подписях.
Системная служба — программный компонент, которым ОС управляет как логической единицей для фонового выполнения задач или предоставления функций программам и пользователям.
Сокетная активация — запуск службы при активности на заранее открытом диспетчером сокете с передачей службе его файлового дескриптора.

Вопросы по теме

Все вопросы и ответы

Почему SSH не запускается после перезагрузки?

Зависит от того, какой механизм активации используется на хосте. systemctl start запускает unit только сейчас, а для запуска при загрузке нужен systemctl enable именно фактического service- или socket-unit. Не включайте одновременно ssh.service, sshd.service и socket unit: сначала подтвердите имя и схему через systemd.

Что делать при ошибке Failed to start SSH?

При socket activation проверьте не только service, но и связанный socket unit: неудачным может быть любой элемент цепочки. В status важны код завершения, поле Result, строка процесса и последние сообщения. В журнале ищите конкретную ошибку, а не только общий текст Failed to start.

Ошибка разбора параметра, include-файла или условия Match требует проверки изменённой конфигурации командой sudo sshd -t. Сообщение Permission denied указывает на необходимость проверить права и владельцев нужных файлов. Ошибки bind или address already in use означают конфликт адреса либо порта. Conditions, зависимости и ошибки socket unit относятся к механизму systemd и не обязательно означают неверный синтаксис sshd_config.

После исправления подтверждённой причины снова проверьте конфигурацию, запустите фактический unit и повторите status. systemctl reset-failed не исправляет проблему: он только очищает состояние failed.

Где посмотреть логи, если sshd не запускается?

Используйте sudo journalctl -b -u <unit> --no-pager, подставив точное имя проблемного unit. Команда покажет сообщения выбранной службы или socket unit в текущей загрузке. Если сбой произошёл раньше либо нужен ограниченный интервал, используйте sudo journalctl -u <unit> --since '30 minutes ago' --no-pager.

Можно ли заменять ssh.service на sshd.service?

Нет, нельзя подставлять имя unit из инструкции для другой ОС. В Debian и Ubuntu могут использоваться ssh.service или ssh.socket, а в RHEL-подобных системах обычно применяется sshd.service. После установки найдите реальные unit-файлы и их состояние через systemctl, затем управляйте только подтверждённым механизмом.

Почему SSH недоступен, хотя unit active?

Активный unit не гарантирует, что сервер принимает соединения на ожидаемом адресе и порту. Проверьте локальный listener командой sudo ss -ltnp. При socket activation сокетом может владеть systemd, а адрес и порт могут задаваться socket unit. Если listener есть, причину внешней недоступности ищут в маршруте, адресе или фильтрации трафика.

Достаточно ли sshd -t перед закрытием SSH-сеанса?

Нет. sudo sshd -t проверяет синтаксис и часть обязательных условий конфигурации, но не подтверждает сетевую доступность и возможность входа конкретного пользователя. Оставьте текущую сессию открытой, подготовьте консольный доступ, примените изменение поддерживаемым способом и проверьте новое подключение в отдельном терминале.