
Не меняется порт sshd после правки файла sshd_config в Ubuntu
Приветствую!
Короткое предисловие: в ходе своей деятельности я чаще всего имею дело с дистрибутивами Debian и RHEL/Centos.
Поэтому как-то я упустил изменения в последних версиях дистрибутива Ubuntu, описанные ниже🫣
Подписывайтесь на наш телеграм @r4ven_me📱, чтобы не пропустить новые публикации на сайте😉. А если есть вопросы или желание пообщаться по тематике – заглядывайте в Вороний чат @r4ven_me_chat🧐.
Теперь сам кейс💼
Недавно при написании плейбука для прошлой заметки столкнулся с таким нюансом работы демона sshd в Ubuntu 24: после изменения порта прослушивания сервера в файле /etc/ssh/sshd_config
и перезапуска сервиса:
systemctl restart ssh
Порт прослушивания не менялся. Т.е.
ss -tln
Система все ещё слушала 22 порт:
tcp LISTEN 0 4096 *:22 *:*
С этим вопросом я вышел в интернет🧐

Оказывается в Ubuntu, начиная с версии, если не ошибаюсь, 22/23.10 демон ssh использует сокетную модель для подключения клиентов к серверу. Поэтому привычный перезапуска сервиса не возымеет действия😐
Не зная этого нюанса можно не плохо так опростоволоситься, например, при настройке сервера, если после правки конфига и такого “перезапуска” закрыть старый порт фаерволом😬
Расскажу чуть подробнее про такое поведение уебунты😡
Условно если подключиться к консоли сервера (не ssh) и выполнить:
pgrep -af ssh
Обнаружиться, что сервиса ssh то и нет🤷♂️
Но при этом:
tcp LISTEN 0 4096 *:22 *:*
Механизм тут следующий: вместо привычного systemd юнита ssh.service
по умолчанию активен юнит сокета – ssh.socket
. Суть этой модели в том, чтобы не держать процесс демона ssh в активном состоянии постоянно, цитата: “с целью экономии ресурсов”🧏♂️
В случае сокетной модели, при обращении к заданному порту (по умолчанию 22), запрос попадает на сокет systemd, который уже в свою очередь запускает сервис ssh.service
для активации демона и установки клиентского подключения🙄
Если посмотреть на содержимое юнита сокета:
systemctl cat ssh.socket
Увидим, что тут указан порт прослушивания:
[Socket]
ListenStream=22
Теперь о том, как быть в таком случае💀
После изменения номера порта в файле sshd_config
, например, на 2222
для применения изменений необходимо перечитать конфигурацию системы инициализации и перезапустить юнит(!) сокета:
systemctl daemon-reload
systemctl restart ssh.socket
# проверяем
ss -tln
Порт прослушивания должен измениться:
tcp LISTEN 0 4096 *:2222 *:*
Теперь смотрим конфиг юнита сокета:
systemctl cat ssh.socket
И видим новый порт:
[Socket]
ListenStream=
ListenStream=2222
Готово✔️
Если необходимо вернуться к классической модели работы sshd, то вот шаги, описанные на официальном сайте Ubuntu:
# отключаем сокет
systemctl disable --now ssh.socket
# удаляем конфиги сокета
rm -f /etc/systemd/system/ssh.service.d/00-socket.conf
rm -f /etc/systemd/system/ssh.socket.d/addresses.conf
# перечитываем конфигурацию
systemctl daemon-reload
# запускаем/активируем сервис
systemctl enable --now ssh.service
Для меня такое поведение оказалось неожиданным. За всем не уследишь🤷♂️