Як правильно поміняти порт SSH

на Ubuntu Server 24.04

Одне з правил безпеки сервера - змінити стандартний порт доступу по протоколу SSH.

Краще це робити до того, як буде встановлено firewall, щоб не підправляти порт ще й там.

Логинимося sudo-користувачем на сервер, отримуємо права root.

Додай новий порт до sshd_config

У файлі /etc/ssh/sshd_config (увага! не ssh_config, а sshd_...!) знаходимо рядок "#Port 22" розкоментовуємо, і вказуємо бажаний нестандартний порт, наприклад:

Port 2202

Рядок "#PubkeyAuthentication yes" - також розкоментуємо, хоч це ні на що не вплине, адже за замовчуванням дозвіл на з'єднання по ключу і так дозволено, просто щоб позбутися двозначності.

Якщо firewall вже встановлено - дозволь новий порт у firewall

Якщо ти використовуєш iptables, додай правило:

iptables -A INPUT -p tcp --dport 2202 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 2202 -j ACCEPT

🔒 Не видаляй порт 22, поки не переконаєшся, що 2202 працює.


Перезапусти SSH-демон

systemctl restart ssh

Перевір, що все працює

Не закривай свою SSH-сесію! В іншому вікні термінала спробуй зайти на сервер:

ssh -p 2202 olex@<ip_або_домен>

І швидше за все - воно НЕ працює:

ssh: connect to host 178.159.43.44 port 2202: Connection refused

Перейди в ту сессію термінала, що ще залогінена на сервері, перевір:

systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/usr/lib/systemd/system/ssh.service; disabled; preset: enabled)
     Active: active (running) since Fri 2025-07-04 10:03:28 UTC; 11s ago
TriggeredBy: ● ssh.socket
       Docs: man:sshd(8)
             man:sshd_config(5)
    Process: 19502 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
   Main PID: 19505 (sshd)
      Tasks: 1 (limit: 4051)
     Memory: 1.2M (peak: 2.5M)
        CPU: 79ms
     CGroup: /system.slice/ssh.service
             └─19505 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
Jul 04 10:03:28 alligator systemd[1]: Starting ssh.service - OpenBSD Secure Shell server...
Jul 04 10:03:28 alligator sshd[19505]: Server listening on :: port 22.
Jul 04 10:03:28 alligator systemd[1]: Started ssh.service - OpenBSD Secure Shell server.
Jul 04 10:03:33 alligator sshd[19506]: banner exchange: Connection from 3.143.33.63 port 36588: invalid format

Бачимо, що sshd досі слухає порт 22, а не 2202:

Server listening on :: port 22.

попри те, що:

sshd -T | grep port
port 2202

Проблема: sshd запускається через ssh.socket, а не напряму

Ось ключовий рядок:

TriggeredBy: ● ssh.socket

Це означає, що sshd запускається через systemd socket activation, тобто ssh.socket слухає порт 22, і передає з'єднання в sshd. Сам sshd при цьому не слухає самостійно.


Рішення: відключити ssh.socket, запускати sshd напряму

  1. Зупини socket:

systemctl stop ssh.socket
  1. Вимкни socket назавжди:

systemctl disable ssh.socket
  1. Увімкни sshd напряму:

systemctl enable ssh
  1. Запусти службу:

systemctl restart ssh
  1. Перевір:

ss -tuln | grep 2202
tcp   LISTEN 0      128                 0.0.0.0:2202      0.0.0.0:*          
tcp   LISTEN 0      128                    [::]:2202         [::]:*          

Якщо встановлений firewall

Зберігаємо наш порт у правилах iptables:

iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

Ще раз тестуємо вхід:

Спробуй ще раз залогінитися у паралельному терміналі, де було "Connection refused".

Якщо ок - для надійності можна перезавантажити сервер і перевірити, чи все ок після цього.

Last updated