← К библиотеке
Безопасность Практика

Базовая защита сервера: ssh, фаервол, fail2ban

Прежде чем ставить панель и ноды, сервер надо закрыть. Это база, которую я прогоняю на каждом свежем VPS за пять минут: фаервол, ssh по ключу, fail2ban. Без неё любой чистый сервер за сутки собирает тысячи попыток брутфорса из интернета.

Свежий VPS с белым IP — это не «чистый лист», а сервер, который уже через час начнут сканировать и перебирать. Базовая защита — это три фронта: фаервол (что вообще торчит наружу), ssh (как ты заходишь) и fail2ban (что делать с теми, кто ломится). Прогоняем по порядку.

Фаервол: закрыть всё лишнее

Правило простое — по умолчанию запрещаем входящее, открываем только то, что реально нужно. На Ubuntu/Debian это ufw:

bash
ufw default deny incoming      # всё входящее — закрыто
ufw default allow outgoing     # исходящее — свободно
ufw allow 22/tcp               # SSH
ufw allow 443/tcp              # рабочий порт inbound
ufw --force enable

На ноде добавляется правило под порт демона, открытый только для IP панели:

bash
# порт демона ноды — принимаем только с сервера панели
ufw allow from PANEL_IP to any port 2222 proto tcp

Смысл в том, чтобы наружу торчал минимум. Всё внутреннее — панель, БД, страница подписки — слушает 127.0.0.1 и не видно из интернета. Меньше открытых портов — меньше поверхность атаки.

SSH: только по ключу

Пароль на ssh брутфорсят круглосуточно. Переводим вход на ключ и вырубаем пароль совсем.

Сначала на своей машине заводим ключ (если ещё нет) и копируем на сервер:

bash
# на СВОЁМ компьютере
ssh-keygen -t ed25519 -C "server-admin"
ssh-copy-id root@SERVER_IP

Теперь на сервере отключаем парольный вход и рутовый логин по паролю:

bash
sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
systemctl restart ssh

Критично: проверь вход по ключу в новом окне терминала, не закрывая текущую сессию. Если что-то пошло не так с ключом, а пароль ты уже выключил, — запрёшь себя снаружи, и придётся лезть в консоль хостера.

fail2ban: банить перебор автоматически

Даже с выключенным паролем лог забивается попытками входа. fail2ban читает лог и временно банит тех, кто ломится:

bash
apt -y install fail2ban
cat >/etc/fail2ban/jail.d/local.conf <<'EOF'
[sshd]
enabled = true
maxretry = 4
bantime = 1h
findtime = 10m
EOF
systemctl enable --now fail2ban

Логика правил: четыре неудачных попытки за десять минут — бан на час. Значения можно ужесточить, но не увлекайся: слишком агрессивный бан рискует отрезать тебя самого при опечатке.

Проверить, что fail2ban живой и кого-то уже ловит:

bash
# статус джейла и список забаненных IP
fail2ban-client status sshd

Держать систему свежей

Половина взломов — это не хитрые атаки, а непропатченные дыры в старом софте. Регулярное обновление закрывает их бесплатно:

bash
apt update && apt -y upgrade

На проде имеет смысл включить автоматические security-обновления (unattended-upgrades), чтобы критичные патчи прилетали без твоего участия. Ноду и панель обновляй отдельно, читая их changelog.

Чеклист

  • [ ] ufw включён, по умолчанию deny incoming.
  • [ ] Наружу открыты только нужные порты, внутреннее — на 127.0.0.1.
  • [ ] Порт демона ноды открыт только для IP панели.
  • [ ] SSH по ключу, пароль и рутовый парольный вход выключены.
  • [ ] fail2ban поднят и ловит перебор.
  • [ ] Система обновлена, автопатчи включены.

Это фундамент под любой сервер сервиса. Дальше, когда на нём стоит панель, её закрывают отдельным слоем — reverse-proxy, allowlist, скрытый сабдомен — про это в статье «Харднинг панели: закрываем доступы».

Следующий гайд Детект шеринга ключей: как ловят раздачу → Не понравилась статья или что-то непонятно? Напишите мне — помогу или поправлю. @notrealvpn →
Материал носит образовательный характер и посвящён инженерии сетевой инфраструктуры. Вы отвечаете за соблюдение законов своей юрисдикции.