SSD Nodes Learn Hosting plans →
Посібники Matt ConnorВід Matt Connor · Оновлено 2026-09-04

Як змінити SSH-порт у Rocky Linux через SELinux

Покрокова зміна SSH-порту в Rocky Linux і AlmaLinux: налаштуйте firewalld, мітку SELinux та sshd_config у правильному порядку без втрати поточної сесії.

Чому зміна SSH-порту тут потребує трьох кроків

Щоб змінити порт SSH у Rocky Linux, AlmaLinux, CentOS Stream або Fedora, недостатньо відредагувати один файл. Три окремі системи визначають, чи працюватиме підключення через новий порт. firewalld вирішує, чи потрапить пакет на машину. SELinux вирішує, чи дозволено sshd взагалі прив’язати цей номер порту. sshd_config визначає, який порт запитує daemon. Якщо пропустити крок із SELinux, daemon відмовиться запускатися. Якщо пропустити крок із firewalld, він запуститься, почне прослуховувати порт, але підключитися до нього буде неможливо.

В Ubuntu це завдання складається з редагування одного файлу та перезапуску, оскільки Ubuntu використовує AppArmor замість SELinux і не постачається з профілем, який обмежує порти, до яких може прив’язуватися sshd. Якщо там працює ufw, додайте одне правило. У цьому полягає вся різниця. У сімействі RHEL після нової інсталяції firewalld запущений, а SELinux працює в режимі enforcing. Обидві системи враховують номери портів.

Виконайте ці дії в такому порядку, і поточна сесія залишатиметься активною на кожному кроці:

  1. Відкрийте новий порт у firewalld, залишивши порт 22 відкритим на цьому етапі.
  2. Додайте мітку SELinux для нового порту за допомогою semanage.
  3. Задайте порт у конфігурації sshd.
  4. Перезапустіть sshd, а потім увійдіть через новий порт із другого термінала, перш ніж закривати перший.
Перед початком знайдіть вебконсоль свого провайдера (VNC або serial) і перевірте, що можете ввійти через неї. Ця консоль дає змогу відновити доступ, якщо зміна пройде неправильно. Зміна порту є однією з найпоширеніших причин, через які користувач втрачає доступ до сервера, щойно його орендував.

Спочатку встановіть semanage

semanage — це інструмент для редагування параметрів політики SELinux. Мінімальна інсталяція Rocky Linux або AlmaLinux не містить його. Він входить до пакета policycoreutils-python-utils.

sudo dnf install -y policycoreutils-python-utils

Якщо виконати команду до встановлення цього пакета, з’явиться sudo: semanage: command not found. На цьому етапі багато читачів вирішують, що SELinux не встановлено, і пропускають цей крок. SELinux встановлено. Відсутній лише інструмент керування. Якщо синтаксис dnf для вас новий, еквіваленти команд dnf і apt допоможуть зіставити його з уже знайомими командами.

Виберіть порт і перевірте, чи він не зайнятий

Підійде будь-який вільний TCP-порт від 1024 до 65535. Перед вибором виконайте дві перевірки:

sudo ss -tlnp | grep -w 2222
sudo semanage port -l | grep -w 2222

Перша перевірка показує, чи вже прослуховує процес цей номер порту. Друга показує, чи призначає політика SELinux цей порт іншому типу сервісу. Для вільного порту обидві команди не повертають результату. Якщо політика вже використовує цей порт, semanage port -a на кроці 2 завершиться з помилкою ValueError: Port tcp/2222 already defined. У такому разі виберіть інший номер.

У цьому посібнику як приклад використовується порт 2222. Сканер також перевіряє його одним із перших після порту 22, тому на реальному сервері виберіть менш очевидний номер.

Крок 1: відкрийте порт у firewalld

sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports

--permanent записує правило у файл зони на диску й не змінює конфігурацію запущеного firewall. --reload завантажує конфігурацію з диска в запущений firewall. Якщо пропустити reload, правило буде створене, але не діятиме до наступного перезапуску firewalld. Це одна з найпоширеніших причин, через яку вся процедура нібито безпідставно не працює.

Поки що не змінюйте запис сервісу ssh. Саме цей запис залишає порт 22 відкритим. Він буде резервним варіантом під час тестування.

Також перевірте панель керування свого провайдера. Багато хостинг-провайдерів використовують мережевий firewall перед VPS, поза операційною системою. Тому порт, який ви відкрили у firewalld, усе одно може блокуватися на upstream-рівні. Посібник з основ firewalld для VPS пояснює роботу зон і різницю між runtime- та permanent-конфігураціями, якщо ця модель вам ще не знайома.

Крок 2: позначте порт для SELinux

sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh_port_t

-a додає нове призначення порту. -t ssh_port_t — це тип, який використовують порти SSH. Друга команда виводить усі порти, які тепер охоплює ssh_port_t, щоб ви могли перевірити, що ваш номер додано, перш ніж змінювати конфігурацію демона.

Чому SELinux взагалі блокує порт

SELinux (security-enhanced Linux) призначає кожному об’єкту в системі мітку, а номери TCP-портів є такими самими об’єктами. Демон SSH працює в ізольованому домені під назвою sshd_t. Політика дозволяє sshd_t прив’язувати TCP-порти з міткою ssh_port_t, а з коробки єдиним портом із цією міткою є 22. Якщо попросити демон прив’язати порт 2222, ядро перевіряє мітку, визначає загальний тип, призначений політикою цьому номеру, і відхиляє дозвіл name_bind для сокета.

Тому ця помилка не схожа на проблему з firewall. Ядро відхиляє операцію ще до створення сокета, що прослуховує порт, тому sshd повідомляє про помилку та завершує роботу. Проблема з firewall має протилежний вигляд: демон працює нормально, а пакети відкидаються під час вхідного проходження.

getenforce показує, у якому режимі працює система. У режимі Permissive відмову записують у журнал, але не застосовують, тому зміна порту спочатку працює, а потім перестає працювати, коли хтось виконує setenforce 1 або система перезавантажується в режимі enforcing. У будь-якому разі призначте порту правильну мітку. У посібнику Основи SELinux для сервера докладно розглянуто режими, контексти та boolean-параметри. SELinux обмежує не лише порти. Та сама політика не дає контейнеру читати змонтований каталог хоста, доки для цього шляху не буде змінено мітку. Саме тому в посібнику зі встановлення Docker на Rocky Linux або AlmaLinux є крок щодо SELinux, якого немає в посібниках для Ubuntu.

Крок 3: задайте порт у конфігурації sshd

У Rocky Linux 9 і 10, AlmaLinux 9 і 10 та актуальних версіях Fedora файл /etc/ssh/sshd_config починається з директиви include, тому для зміни найкраще використати drop-in-файл. Оновлення пакета не конфліктуватимуть із вашими змінами.

grep -n '^Include' /etc/ssh/sshd_config
echo 'Port 2222' | sudo tee /etc/ssh/sshd_config.d/10-port.conf
sudo sshd -t

Якщо grep не знаходить рядка Include, як у Rocky Linux 8 та інших старіших образах, додайте Port 2222 безпосередньо до /etc/ssh/sshd_config. sshd -t перевіряє всю конфігурацію, включно з drop-in-файлами, і повідомляє про синтаксичні помилки. Виправте всі виявлені помилки до перезапуску, оскільки конфігурація, яку не вдається розібрати, призводить до того, що daemon не запускається знову.

Port може з’являтися кілька разів, і sshd прослуховує кожен указаний порт. На перший день можна залишити Port 22 разом із Port 2222 як простий запасний варіант, але не забудьте видалити його.

Чи запускається ваш sshd через socket unit?

Деякі образи запускають SSH через socket activation systemd, а не як довготривалий сервіс. У такій конфігурації systemd володіє listening socket і передає з’єднання sshd, тому рядок Port у sshd_config повністю ігнорується. Перевірте це, перш ніж щось перезапускати:

systemctl is-enabled sshd.socket

Відповідь enabled означає, що порт задано в socket unit, а не у sshd_config:

sudo systemctl edit sshd.socket
[Socket]
ListenStream=
ListenStream=2222

Окремий ListenStream= є обов’язковим. Значення накопичуються в drop-in-файлах, тому без порожнього присвоєння, яке спочатку очищує список, socket і надалі слухатиме 22, а також 2222. Застосуйте зміни за допомогою sudo systemctl daemon-reload, а потім виконайте sudo systemctl restart sshd.socket. Якщо unit вимкнений або відсутній на вашому сервері, цей розділ вас не стосується.

Крок 4: перезапустіть службу, потім перевірте підключення з другого термінала

sudo systemctl restart sshd
systemctl status sshd
sudo ss -tlnp | grep sshd

Залиште цей термінал відкритим. Не виходьте з нього. Відкрийте другий термінал на власному комп’ютері та підключіться через новий порт:

ssh -p 2222 youruser@203.0.113.10

Закривайте першу сесію лише після успішного входу з другого термінала. Якщо підключення не працює, у вас залишається shell, з якого можна скасувати всі зміни. Ця звичка дає змогу виконати зміну за п’ять хвилин замість тривалого відновлення через консоль провайдера.

Помилка Firewall або заборона SELinux? Як їх розрізнити

Із вашого ноутбука обидві помилки виглядають майже однаково. На сервері вони зовсім різні.

  • Якщо systemctl status sshd показує, що unit завершився з помилкою, daemon не зміг отримати свій socket. Причиною є помилка конфігурації або заборона SELinux.
  • Якщо unit активний, а ss -tlnp показує, що sshd прослуховує новий порт, daemon працює нормально. Проблема пов’язана з мережевим шляхом: firewalld, окремим firewall провайдера або адресою і портом, до яких ви підключаєтеся.

У випадку SELinux перегляньте запис аудиту, а не робіть припущення:

sudo ausearch -m AVC -ts recent
sudo journalctl -u sshd -n 50 --no-pager

Заборона name_bind для класу tcp_socket містить процес у comm="sshd", номер порту в src= і мітку, яку фактично має порт, у tcontext=. Останнє поле містить відповідь. Будь-яке значення, відмінне від ssh_port_t, означає, що крок 2 не було застосовано до порту, який ви використовуєте. Зазвичай причина полягає в помилці в номері або в неправильному протоколі. Встановіть setroubleshoot-server, якщо хочете, щоб sealert перетворив цей запис на зрозуміле речення.

Повідомлення, яке сам sshd записує, коли kernel забороняє прив’язати socket, виглядає так:

error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.

Permission denied на порту вище 1024, для прив’язування до якого не потрібні права root, є характерною ознакою SELinux. Address already in use у цьому самому рядку означає іншу помилку: інший процес уже використовує порт. На стороні клієнта різниця між відмовою в підключенні та перевищенням часу очікування підключення дає змогу розрізнити два мережеві випадки: відмова означає, що пакет досяг хоста, але жоден процес не прослуховував порт, а перевищення часу очікування означає, що відповіді не було.

Закрийте порт 22 і оновіть клієнти

Після кількох успішних підключень через новий порт закрийте 22:

sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

Не змінюйте мітку SELinux для порту 22. Вона визначена базовою політикою і нічого не дає, якщо firewall більше не пропускає вхідні пакети.

Потім виправте налаштування клієнтів, оскільки кожному інструменту, який використовував порт за замовчуванням, тепер потрібно явно вказати новий порт. Один раз додайте його у ~/.ssh/config на власній машині замість того, щоб постійно вводити -p:

Host myvps
  HostName 203.0.113.10
  Port 2222
  User youruser

scp, sftp, rsync та Ansible читають цей файл. Завдання резервного копіювання, перевірки моніторингу та cron-скрипти, у яких порт 22 задано безпосередньо, цього не роблять. Знайдіть і виправте їх, поки причина зміни ще свіжа в пам’яті.

Що дає зміна порту, а чого вона не дає

Це зменшує кількість шуму в журналах. Автоматизовані сканери постійно атакують порт 22, а перенесення SSH з цього порту прибирає більшість таких записів із журналу, завдяки чому легше помічати реальні події. Це не є засобом захисту. Будь-який сканер, який перевіряє весь діапазон портів, знайде ваш daemon і все одно прочитає його банер версії. Розглядайте зміну порту як адміністративне впорядкування, а реальний захист забезпечте автентифікацією лише за ключами та вимкненням входу за паролем. Покроковий опис наведено в посібнику із захисту SSH для VPS.

Усе описане вище однаково працює в обох основних RHEL rebuilds, оскільки вони зібрані з однакових sources. Якщо ви ще обираєте між ними, дивіться порівняння Rocky Linux і AlmaLinux. Є дві майже ідентичні rebuilds для вибору лише тому, що CentOS перестав бути такою системою у 2020 році. Повну історію наведено в матеріалі про шлях від Red Hat через CentOS до Rocky і AlmaLinux. Перед виконанням будь-якого старого посібника перевірте, який саме release вам встановили, за допомогою cat /etc/os-release. Посібники для Rocky Linux 8 досі мають високі позиції в пошуку, а їхні кроки semanage і firewall-cmd залишаються правильними. Однак у Rocky 8 немає рядка sshd_config.d include і немає socket unit, який потрібно враховувати. Тому частина таких посібників про sshd не відповідає поточній системі.

fail2ban потрібно повідомити про новий порт

fail2ban немає в базових репозиторіях. Він постачається через EPEL (додаткові пакети для Enterprise Linux):

sudo dnf install -y epel-release
sudo dnf install -y fail2ban fail2ban-firewalld

Підпакет fail2ban-firewalld змушує fail2ban застосовувати блокування через firewalld. Це потрібний варіант на сервері, де firewalld керує набором правил.

Стандартний jail sshd задає port = ssh, а це ім’я через /etc/services перетворюється на 22. Після зміни jail відстежує порт, який ніхто не атакує, тому він нікого не блокує, хоча невдалі спроби входу накопичуються на 2222. Вкажіть порт числом у /etc/fail2ban/jail.local:

[sshd]
enabled = true
port = 2222
backend = systemd
maxretry = 5
bantime = 3600

backend = systemd читає невдалі спроби з journal, а не з /var/log/secure. Це безпечніший варіант для мінімальної інсталяції, де rsyslog може бути відсутній. Запустіть його за допомогою sudo systemctl enable --now fail2ban і перевірте jail командою sudo fail2ban-client status sshd. Синтаксис jail такий самий, як у налаштуванні fail2ban для SSH в Ubuntu 24.04. Відрізняються лише джерело пакета та дія блокування.

Патчі важливіші за порт

Сервер зі зміненим портом SSH і чотирма місяцями невстановлених оновлень безпеки перебуває в гіршому стані, ніж сервер на порту 22, який щоночі встановлює оновлення автоматично. Увімкніть автоматичні оновлення в тому самому сеансі, поки ви вже працюєте від імені root: автоматичні оновлення dnf у Rocky Linux і AlmaLinux описує налаштування таймера та вибір між завантаженням оновлень і їхнім встановленням. Встановлене оновлення не перезапускає демони, які вже виконують старий код, тому щоразу, коли під час оновлення встановлюється openssh-server або бібліотека, від якої він залежить, варто витратити хвилину на перевірку того, що ще потребує перезапуску або перезавантаження.

FAQ

Чому sshd не запускається після зміни порту в Rocky Linux?

Майже завжди причина полягає у відсутній мітці порту SELinux. sshd працює в обмеженому домені sshd_t, а політика дозволяє йому прив’язуватися лише до портів із міткою ssh_port_t. За замовчуванням це лише порт 22. Ядро відхиляє прив’язування, тому демон завершує роботу, а не починає прослуховувати порт. У journalctl -u sshd з’являється рядок такого формату: error: Bind to port 2222 on 0.0.0.0 failed: Permission denied.. Виконайте sudo semanage port -a -t ssh_port_t -p tcp 2222, вказавши власний номер порту, а потім перезапустіть сервіс. Якщо semanage не знайдено, спочатку встановіть policycoreutils-python-utils.

Чи потрібен semanage, якщо SELinux працює в режимі permissive?

Так. У режимі permissive відмова реєструється, але прив’язування все одно дозволяється, тому здається, що зміна спрацювала. Мітка все ще відсутня. Щойно хтось виконає setenforce 1 або система завантажиться з SELINUX=enforcing у /etc/selinux/config, sshd перестане запускатися на цьому порту. Додавання мітки потребує однієї команди й усуває проблему, яка інакше могла б виникнути через кілька тижнів без очевидної причини.

Порт має мітку, sshd працює, то чому підключення завершується тайм-аутом?

Працюючий демон означає, що SELinux не блокує підключення. Отже, пакет відкидається десь на шляху до сервера. Перевірте sudo firewall-cmd --list-ports для свого порту та переконайтеся, що виконали firewall-cmd --reload після правила --permanent, оскільки саме постійне правило не змінює конфігурацію активного firewall. Потім перевірте панель керування хостинг-провайдера на наявність окремого мережевого firewall перед VPS. Це друге місце, де підключення часто блокується, і операційна система нічого про це не покаже.

Який порт використовувати замість 22?

Будь-який вільний TCP-порт від 1024 до 65535. Не використовуйте 2222 і 22222 на реальному сервері, оскільки сканери перевіряють їх одразу після 22. Переконайтеся, що номер вільний, за допомогою sudo ss -tlnp. Перевірте, що політика SELinux ще не використовує його, за допомогою sudo semanage port -l. Також не вибирайте порт, призначений сервісу, який ви можете встановити пізніше. Великий номер, який складно запам’ятати, підходить, оскільки ви один раз запишете його в ~/.ssh/config і більше не вводитимете вручну.