KVM VPS - сменить порт ssh для Ubuntu 24.04 - bash скрипт - 2026
Bash-скрипт для смены стандартного порта SSH (22) на произвольный на Ubuntu 24.04 (KVM VPS) с поддержкой socket-based activation (ssh.socket) и автоматической настройкой UFW.
Код скрипта
#!/usr/bin/env bash
set -e
if [[ $EUID -ne 0 ]]; then
echo "Запустите скрипт от root."
exit 1
fi
read -p "Введите новый SSH порт: " PORT
if ! [[ "$PORT" =~ ^[0-9]+$ ]] || ((PORT < 1 || PORT > 65535)); then
echo "Некорректный порт."
exit 1
fi
CONFIG="/etc/ssh/sshd_config"
BACKUP="/etc/ssh/sshd_config.bak.$(date +%F_%H-%M-%S)"
cp "$CONFIG" "$BACKUP"
if grep -Eq '^[#[:space:]]*Port[[:space:]]+' "$CONFIG"; then
sed -Ei "s|^[#[:space:]]*Port[[:space:]]+.*|Port ${PORT}|g" "$CONFIG"
else
echo "Port ${PORT}" >> "$CONFIG"
fi
echo
echo "Проверка конфигурации..."
if ! sshd -t; then
echo "Ошибка в конфигурации. Восстанавливаю резервную копию."
cp "$BACKUP" "$CONFIG"
exit 1
fi
if systemctl is-enabled ssh.socket >/dev/null 2>&1 || systemctl is-active ssh.socket >/dev/null 2>&1; then
echo "Обнаружен ssh.socket"
mkdir -p /etc/systemd/system/ssh.socket.d
cat >/etc/systemd/system/ssh.socket.d/override.conf <<EOF
[Socket]
ListenStream=
ListenStream=${PORT}
EOF
systemctl daemon-reload
systemctl restart ssh.socket
else
systemctl restart ssh.service
fi
if command -v ufw >/dev/null 2>&1; then
if ufw status | grep -q "Status: active"; then
ufw allow ${PORT}/tcp
fi
fi
echo
echo "========================================"
echo "Настройки SSH:"
echo
sshd -T | grep '^port'
echo
echo "Слушаемые порты:"
ss -tlnp | grep ssh || true
IP=$(hostname -I | awk '{print $1}')
echo
echo "Подключение:"
echo "ssh -p ${PORT} root@${IP}"
echo
echo "Резервная копия:"
echo "$BACKUP"
echo
echo "Не закрывайте текущую SSH-сессию, пока не убедитесь, что вход через новый порт работает."
echo "========================================"
Что делает скрипт
- Проверяет, что запущен от root (UID 0)
- Запрашивает у пользователя новый номер порта
- Валидирует порт: только число в диапазоне 1–65535
- Создаёт резервную копию /etc/ssh/sshd_config с меткой времени
- Находит и заменяет директиву Port в sshd_config (или добавляет, если её нет)
- Проверяет корректность конфигурации командой sshd -t
- Восстанавливает резервную копию при ошибке и завершает работу
- Определяет, используется ли ssh.socket (socket-based activation в systemd)
- Если да — создаёт drop-in override для ListenStream и перезапускает сокет
- Если нет — перезапускает ssh.service как обычно
- При активном UFW открывает новый порт в фаерволе
- Выводит итоговую конфигурацию, слушаемые порты, строку подключения и путь к резервной копии
Особенности Ubuntu 24.04
Начиная с Ubuntu 22.04+ SSH-демон может использовать socket-based activation. Вместо ssh.service напрямую запускается ssh.socket, который слушает порт и активирует ssh.service при входящем соединении.
Простая смена Port в sshd_config и перезапуск ssh.service в этом случае не сработает, потому что сокет продолжает слушать старый порт. Скрипт корректно обрабатывает этот сценарий:
- Создаёт /etc/systemd/system/ssh.socket.d/override.conf
- Переопределяет ListenStream
- Вызывает daemon-reload и перезапуск ssh.socket
Использование
Сохраните скрипт в файл, например change-ssh-port.sh:
chmod +x change-ssh-port.sh sudo ./change-ssh-port.sh
Следуйте инструкциям:
- Введите желаемый номер порта
- Дождитесь завершения
- Откройте вторую SSH-сессию с новым портом и проверьте подключение
- Если всё работает — закройте старую сессию
Важно
- Не закрывайте текущую SSH-сессию, пока не проверите подключение по новому порту — при ошибке вы потеряете доступ к серверу
- Резервная копия sshd_config сохраняется в ту же директорию
- Скрипт проверяет конфигурацию перед перезапуском — при ошибке автоматически откатывает изменения
Резюме
Скрипт автоматизирует смену SSH-порта на Ubuntu 24.04, учитывая особенности socket-based activation и фаервола UFW. Включает валидацию ввода, резервное копирование, проверку конфигурации и автоматический откат при ошибке.
Ссылки
- OpenSSH: https://www.openssh.com/
- systemd socket activation: https://www.freedesktop.org/software/systemd/man/latest/systemd.socket.html
- Документация UFW: https://help.ubuntu.com/community/UFW
