sshd: смена порта не действует из-за ssh.socket
В части дистрибутивов ssh работает через сокет-активацию: порт слушает ssh.socket, а не сам sshd. Тогда параметр порта в sshd_config не применяется, и правки в нём ничего не меняют.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Активна сокет-активация
При активном ssh.socket адрес открывает systemd и передаёт готовое соединение sshd. Настройка порта в конфигурации sshd в этом случае не используется.
-
Порт занят прежним экземпляром sshd
Если после правки порта служба не перезапускалась, прежний процесс продолжает слушать старый порт. Новый порт при этом нигде не открыт.
-
Одновременно включены и служба, и сокет
Тогда порт занимает то, что стартовало первым, а поведение меняется от перезагрузки к перезагрузке.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Активна ли сокет-активация и какой адрес слушается.
systemctl status ssh.socket --no-pager | head -8Что думает о порте сам sshd.
sudo sshd -T | grep -i "^port"Кто фактически слушает порт: systemd или sshd.
sudo ss -tlnp | grep sshРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- При активном ssh.socket адрес открывает systemd и передаёт готовое соединение sshd. Настройка порта в конфигурации sshd в этом случае не используется.
- Как проверить
-
Посмотрите состояние сокета и фактический адрес.
systemctl status ssh.socket --no-pager | head -8 sudo ss -tlnp | grep -E ":(22|2222)\s"
- Как исправить
-
Меняйте порт в переопределении сокета: сбросьте прежний адрес и задайте новый.
sudo systemctl edit ssh.socket # [Socket]\nListenStream=\nListenStream=2222 sudo systemctl restart ssh.socket
- Почему происходит
- Если после правки порта служба не перезапускалась, прежний процесс продолжает слушать старый порт. Новый порт при этом нигде не открыт.
- Как проверить
-
Посмотрите процессы sshd и открытые порты.
pgrep -a sshd | head sudo ss -tlnp | grep ssh
- Как исправить
- Перезапустите службу или сокет, в зависимости от способа работы, и убедитесь, что новый порт открыт. Старую сессию до проверки не закрывайте.
- Почему происходит
- Тогда порт занимает то, что стартовало первым, а поведение меняется от перезагрузки к перезагрузке.
- Как проверить
-
Посмотрите состояния включения.
systemctl is-enabled ssh.service ssh.socket
- Как исправить
- Выберите один способ: либо сокет-активация, либо обычная служба со своим портом.
Пример вывода
Порт изменён в конфигурации, но слушает systemd на прежнем. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ sudo grep -i "^Port" /etc/ssh/sshd_config
Port 2222
$ sudo ss -tlnp | grep :22
LISTEN 0 4096 *:22 *:* users:(("systemd",pid=1,fd=110))
Связанные ошибки
- Служба не получает сокет при сокет-активации Сокет активен, служба запускается, но не находит переданный дескриптор. Разбор: Accept, FileDescriptorName, соответствие имён.
- Сокет и служба включены одновременно: конфликт при загрузке При сокет-активации в автозапуск включена и служба, и сокет. Порт занимает то, что стартовало первым.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- MySQL: Can't connect to local server through socket Клиент не находит unix-сокет MySQL: сервер не запущен, путь к сокету другой, каталог в /run не создан.
- sshd: Bad configuration option и отказ запуска sshd не запускается из-за ошибки в sshd_config: неизвестный параметр, устаревшая настройка, ошибка в include.
- sshd: отказ аутентификации из-за прав на файлы Вход по ключу не работает: слишком широкие права на домашний каталог или authorized_keys. Разбор через журнал sshd.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- Apache: Invalid command — не включён модуль Apache не запускается: директива требует модуль, который не подключён. Как найти нужный модуль и включить.
Где встречается чаще всего
Источники
-
systemd.socket(5)
Сокет-активация и переопределение адреса прослушивания. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на Ubuntu 24.04 с включённым ssh.socket: порт из sshd_config не применяется.