Как безопасно сменить порт SSH и пароль root на Linux VPS
Перенос SSH с порта 22 не остановит целенаправленную атаку, но уберёт из логов большую часть автоматического сканирования, а смена пароля root — первое, что стоит сделать на новом сервере. В этой инструкции показано, как сменить порт SSH и пароль root на Linux VPS без потери доступа: правка sshd_config, метка SELinux для порта в Rocky Linux и AlmaLinux, правила файрвола, юнит ssh.socket в Ubuntu 22.10 и 24.04 и откат через VNC-консоль, если что-то пошло не так. Подходит для Debian, Ubuntu, CentOS 7 и Rocky/AlmaLinux 8 и 9 на облачных и выделенных серверах JUSTG.
Шаг 1: Смените пароль root
Сделайте это сразу, пока подключение работает как обычно. Именно этот пароль root понадобится во VNC-консоли при восстановлении, поэтому сохраните его в менеджере паролей. Используйте не менее 16 случайных символов.
# Generate a random 24-character password (optional)
openssl rand -base64 18
# Set the new root password (type it twice)
passwd root
Чтобы сменить пароль другой учётной записи, выполните passwd имя_пользователя.
Шаг 2: Выберите новый порт SSH
Возьмите свободный порт в диапазоне 1024–49151, например 2222 или 22022, и убедитесь, что его не занимает другая служба. Ниже в примерах используется 2222.
# Nothing should be listening on the new port yet
ss -tlnp | grep ':2222' || echo "port 2222 is free"
Шаг 3: Добавьте новый порт в sshd_config
Сделайте резервную копию и настройте sshd слушать оба порта — старый и новый. Пока порт 22 открыт, ошибка на следующих шагах не лишит вас доступа.
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F)
nano /etc/ssh/sshd_config
# Replace the "#Port 22" line with BOTH ports during the change:
Port 22
Port 2222
Шаг 4: Разрешите порт SSH в SELinux (Rocky Linux / AlmaLinux / CentOS)
В системах на базе Red Hat SELinux разрешает sshd слушать только порты с меткой ssh_port_t. Без этого шага sshd не запустится на новом порту с ошибкой bind «Permission denied». В Debian и Ubuntu SELinux по умолчанию не используется — шаг можно пропустить.
# Rocky Linux / AlmaLinux 8, 9
dnf install -y policycoreutils-python-utils
# CentOS 7
yum install -y policycoreutils-python
semanage port -a -t ssh_port_t -p tcp 2222
semanage port -l | grep ssh_port_t
Шаг 5: Откройте новый порт SSH в файрволе
# Debian / Ubuntu with UFW
ufw allow 2222/tcp
ufw status
# CentOS / Rocky / AlmaLinux with firewalld
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload
firewall-cmd --list-ports
Шаг 6: Перезапустите SSH (и учтите ssh.socket в Ubuntu 22.10+ и 24.04)
Проверьте синтаксис и перезапустите службу. Текущая сессия не оборвётся.
sshd -t # syntax check, no output = OK
# Debian, Ubuntu 22.04 and older
systemctl restart ssh
# CentOS / Rocky / AlmaLinux
systemctl restart sshd
# Confirm sshd is listening on both ports
ss -tlnp | grep sshd
Начиная с Ubuntu 22.10 SSH запускается через socket activation systemd: порт слушает ssh.socket, поэтому перезапуск одной службы ssh порт не меняет. Выберите вариант для своей версии:
# Is socket activation in use?
systemctl is-active ssh.socket
# Ubuntu 24.04 (and 23.10+): the Port lines in sshd_config are read
# by a systemd generator, so reload and restart the socket
systemctl daemon-reload
systemctl restart ssh.socket
# Ubuntu 22.10 / 23.04: add the ports to a socket override instead
mkdir -p /etc/systemd/system/ssh.socket.d
cat > /etc/systemd/system/ssh.socket.d/listen.conf <<'EOF'
[Socket]
ListenStream=
ListenStream=22
ListenStream=2222
EOF
systemctl daemon-reload
systemctl restart ssh.socket
# Alternative on any of these Ubuntu releases: go back to the classic service
systemctl disable --now ssh.socket
systemctl enable --now ssh.service
Шаг 7: Проверьте новый порт SSH во второй сессии
# From a SECOND terminal on your computer
ssh -p 2222 [email protected]
# Optional ~/.ssh/config entry so you can just type "ssh myvps"
Host myvps
HostName 203.0.113.40
Port 2222
User root
«Connection timed out» обычно означает, что порт всё ещё закрыт файрволом. «Connection refused» — sshd не слушает этот порт: проверьте SELinux, ssh.socket и вывод ss -tlnp.
Шаг 8: Закройте порт 22
Когда новый порт работает, удалите старый из конфигурации SSH и из файрвола, ещё раз перезапустите службу и повторите проверку из нового терминала.
# Remove "Port 22" from sshd_config (and from listen.conf on Ubuntu 22.10/23.04)
sed -i '/^Port 22$/d' /etc/ssh/sshd_config
sshd -t && systemctl restart sshd # use "ssh" on Debian/Ubuntu
# Ubuntu 22.10+ with ssh.socket: systemctl daemon-reload && systemctl restart ssh.socket
# UFW
ufw delete allow 22/tcp
ufw delete allow OpenSSH
# firewalld
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload
Шаг 9: Откат через VNC-консоль
Если доступ потерян, VNC-консоль всё равно работает, так как не зависит от сети и SSH. Войдите в личный кабинет JUSTG → Мои продукты и услуги → выберите VPS → панель управления и откройте консоль; если не нашли её, создайте тикет. Войдите как root с паролем из шага 1 и верните настройки:
# In the VNC console, logged in as root
cp /etc/ssh/sshd_config.bak.* /etc/ssh/sshd_config # or re-add "Port 22"
ufw allow 22/tcp # Debian / Ubuntu
firewall-cmd --add-service=ssh # CentOS / Rocky / AlmaLinux (runtime)
systemctl restart ssh || systemctl restart sshd
Частые вопросы
Смена порта SSH делает сервер защищённым?
Она уменьшает шум от ботов в логах, но сама по себе защитой не является. Для полноценной защиты сочетайте её с входом по ключу, отключённым входом по паролю и файрволом.
Почему Ubuntu 24.04 по-прежнему слушает порт 22 после правки sshd_config?
Порт удерживает ssh.socket. Выполните systemctl daemon-reload, затем systemctl restart ssh.socket, либо отключите сокет и используйте ssh.service, как в шаге 6.
После смены порта sshd не запускается в Rocky Linux. В чём дело?
Почти всегда в SELinux. Выполните journalctl -u sshd -n 20; если видите ошибку bind, добавьте порт командой semanage port -a -t ssh_port_t -p tcp 2222 и перезапустите службу.
Если после смены порта SSH подключиться не удаётся, создайте тикет по адресу https://www.justg.com/submitticket.php — техническая поддержка JUSTG поможет.