🔒 Безопасность сервера
Несколько несложных шагов заметно повышают защиту VPS: закрывают его от перебора паролей и автоматических сканеров. Делать всё сразу не обязательно — начните с базового минимума, остальное добавите, когда будет время.
Порядок имеет значение
Идите по разделам сверху вниз. Особенно важно: перед закрытием доступа по паролю и перед включением файрвола убедитесь, что новый способ входа работает — проверяйте в новом окне терминала, не закрывая текущее.
1. Обновления
Актуальные пакеты закрывают известные уязвимости:
sudo apt update && sudo apt upgrade -yЧтобы обновления безопасности ставились сами:
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades2. Отдельный пользователь с правами sudo
Постоянно работать под root небезопасно. Создадим обычного пользователя с правами администратора — вместо alex подставьте своё имя латиницей:
adduser alex
usermod -aG sudo alex
echo "alex ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/alex
su - alexДальше все команды выполняются от этого пользователя с приставкой sudo.
3. Смена стандартного порта SSH
Порт 22 круглосуточно сканируют бот-неты. Перевод на нестандартный порт (от 1024 до 65535) резко снижает поток попыток входа.
sudo nano /etc/ssh/sshd_configНайдите строку #Port 22, уберите # и укажите свой порт, например Port 2222. Сохраните: Ctrl+O → Enter → Ctrl+X. Затем откройте порт и перезапустите службу:
sudo ufw allow 2222/tcp
sudo systemctl restart ssh # на очень старых системах: sudo systemctl restart sshdПроверьте, что сервер действительно слушает новый порт:
sudo ss -tlnp | grep -E ':(22|2222)\s'Подключение теперь выглядит так: ssh -p 2222 alex@IP_СЕРВЕРА
Проверьте доступ заранее
Не закрывая текущую сессию, откройте новое окно терминала и убедитесь, что вход по новому порту работает. Иначе можно остаться без доступа к серверу.
Порт остался 22 — дело в ssh.socket
В Ubuntu 22.10 и новее (включая 24.04) SSH по умолчанию запускается через сокет systemd. В этом случае порт задаёт сам сокет, а параметр Port из sshd_config игнорируется — команды выполняются без ошибок, но сервер продолжает слушать 22. Признак: в выводе ss -tlnp рядом с портом 22 указан не sshd, а systemd.
Проверить, включена ли активация через сокет:
systemctl is-enabled ssh.socketОтвет enabled — порт нужно менять в сокете, одним из двух способов.
Вариант А — задать порт в сокете:
sudo systemctl edit ssh.socketОткроется редактор (обычно nano). В пустой области между строками-комментариями впишите:
[Socket]
ListenStream=
ListenStream=2222Пустая строка ListenStream= обязательна: она сбрасывает унаследованный порт 22, иначе сервер будет слушать оба порта. Сохраните (Ctrl+O → Enter → Ctrl+X) и примените:
sudo systemctl daemon-reload
sudo systemctl restart ssh.socketВариант Б — отключить сокет и вернуться к обычной службе. Тогда порт берётся из sshd_config, как в старых версиях:
sudo systemctl disable --now ssh.socket
sudo systemctl enable --now ssh.service
sudo systemctl restart sshПосле любого из вариантов снова проверьте порт командой sudo ss -tlnp | grep -E ':(22|2222)\s' и, не закрывая текущую сессию, зайдите на сервер из нового окна терминала.
Важно для AmneziaVPN
Если сервер добавлен в приложение, укажите там новый порт — иначе установка протоколов не пройдёт. Приложение не умеет редактировать сохранённые реквизиты: сервер придётся удалить и добавить заново, а протоколы не переустанавливать, а найти кнопкой «Проверить сервер на наличие ранее установленных сервисов Amnezia». Подробнее — Ошибки 30x.
4. Вход по SSH-ключу вместо пароля
Ключ надёжнее пароля: публичный ключ лежит на сервере («замок»), приватный — только у вас («ключ»).
Создать ключи на своём компьютере
Windows (встроенный SSH — рекомендуемый способ), в командной строке:
cd /D %USERPROFILE%\.ssh && ssh-keygen -f id_ed25519 -C "amnezia" -N "" -q -t ed25519| Флаг | Значение |
|---|---|
-f id_ed25519 | имя файла приватного ключа — сделайте его индивидуальным |
-C "amnezia" | метка для идентификации ключа |
-N "" | без пароля |
-q | тихий режим |
-t ed25519 | тип ключа ED25519 |
Появится пара: id_ed25519 (приватный, никому не передавайте) и id_ed25519.pub (публичный).
macOS и Linux:
ssh-keygen # на все вопросы можно нажимать Enter
ssh-copy-id -p 2222 alex@IP_СЕРВЕРАДобавить публичный ключ на сервер вручную
mkdir -p ~/.ssh && nano ~/.ssh/authorized_keysВставьте содержимое .pub-файла и сохраните: Ctrl+O → Enter → Ctrl+X.
Если пользуетесь PuTTY
Ключ в формате .ppk подходит только для самой PuTTY: в её настройках путь указывается в Connection → SSH → Auth → Credentials, поле Private key file for authentication. Для приложения AmneziaVPN ключ нужно экспортировать в OpenSSH-формат — как это сделать, описано в Ошибках 30x.
Отключить вход по паролю
Сначала проверьте вход по ключу
Откройте новое окно терминала и убедитесь, что сервер пускает вас без пароля. Только после этого продолжайте.
sudo nano /etc/ssh/sshd_configНайдите PasswordAuthentication yes и замените на PasswordAuthentication no. Заодно можно запретить вход самому root: строку #PermitRootLogin yes привести к виду PermitRootLogin no. Сохраните и перезапустите службу:
sudo systemctl restart ssh5. Файрвол UFW
Закрываем всё, кроме нужного:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp # КРИТИЧЕСКИ ВАЖНО: ваш SSH-порт
sudo ufw allow 443/tcp # например, XRay по TCP
sudo ufw allow 51820/udp # например, AmneziaWG / WireGuard по UDP
sudo ufw enable && sudo ufw statusНе закройте себе SSH
Порт SSH нужно разрешить до включения файрвола. Если этого не сделать, доступ к серверу пропадёт.
Правило при смене протоколов: добавили новый протокол в AmneziaVPN или сменили порт — откройте его в UFW (sudo ufw allow ПОРТ). Ненужные старые порты закройте (sudo ufw delete allow ПОРТ) и перезагрузите файрвол (sudo ufw reload). Порт панели 3X-UI тоже нужно открыть — см. Панель 3X-UI.
6. Защита от перебора пароля: fail2ban
fail2ban блокирует адреса после серии неудачных попыток входа.
sudo apt install fail2ban -y
sudo nano /etc/fail2ban/jail.localВставьте настройки:
[sshd]
ignoreip = 127.0.0.1
bantime = 7200s
findtime = 1d
maxretry = 3| Параметр | Значение |
|---|---|
ignoreip | доверенные адреса, которые никогда не блокируются — например, внешний IP вашего дома или офиса |
bantime | срок блокировки адреса |
findtime | период, за который считаются неудачные попытки |
maxretry | сколько попыток допустимо до блокировки |
Примеры ignoreip:
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 10.0.0.0/8
ignoreip = 127.0.0.1/8 ::1 93.184.216.34 198.51.100.42
ignoreip = 127.0.0.1/8 172.16.0.0/12 82.202.15.115 myhome.ddns.netСуффиксы времени для bantime и findtime: s или без суффикса — секунды, m — минуты, h — часы, d — дни, w — недели, mo — месяцы, y — годы.
Сохраните файл и перезапустите службу:
sudo systemctl restart fail2banПолезные команды fail2ban
| Задача | Команда |
|---|---|
| Список заблокированных адресов | sudo iptables -L -n -v | grep fail2ban |
| Статус защиты SSH | sudo fail2ban-client status sshd |
| Разблокировать адрес вручную | sudo fail2ban-client set sshd unbanip IP-АДРЕС |
| Логи за день | sudo awk -v d="$(date -d '1 day ago' +'%Y-%m-%d')" '$1 >= d' /var/log/fail2ban.log |
| Логи за неделю | sudo awk -v d="$(date -d '7 days ago' +'%Y-%m-%d')" '$1 >= d' /var/log/fail2ban.log |
Забанили сами себя
Так бывает, ничего страшного: подключитесь из другой сети и снимите бан командой выше, а свой домашний адрес добавьте в ignoreip. Если доступа нет совсем — напишите нам, поможем: Обращение в поддержку.
7. Надёжный пароль root
passwd # сменить пароль
openssl rand -base64 18 # сгенерировать стойкийПодробнее о том, какой пароль где используется, — Как сменить пароль root.
8. Мониторинг
| Задача | Команда |
|---|---|
| Активные сетевые подключения | ss -tulpn |
| Кто сейчас в системе | who |
| Последние входы | last -n 20 |
| Нагрузка и процессы | htop |
| Свободное место на диске | df -h |
Меньше сервисов — меньше риска
Не устанавливайте лишнее ПО и панели, если они не нужны для работы VPN. Чем меньше открытых сервисов, тем меньше поверхность для атаки.
