Как я защитил свои серверы от ботов и брутфорса за 3 дня без сна

Всем привет. Хочу поделиться опытом, который стоил мне трёх ночей и пары литров кофе.

Когда я поднял первые два сервера, буквально через несколько минут в логах началось что-то страшное — сотни попыток входа в минуту, боты ломились на SSH со всех сторон. Я не ожидал, что всё произойдёт так быстро. Думал, ну кому нужен мой маленький сервер. Оказалось — всем.

Три дня я почти не спал, читал доки, форумы, пробовал разное. В итоге собрал связку из трёх инструментов, после которых в логах стало тихо.

Что использовал

ufw — файрвол. Закрывает все порты по умолчанию, открываете только то что нужно. Простой и понятный, не нужно разбираться в iptables вручную.

fail2ban — следит за логами и банит IP после нескольких неудачных попыток входа. Боты пытаются подобрать пароль — fail2ban видит это и блокирует адрес на заданное время.

knockd (port knocking) — самое интересное. SSH-порт закрыт для всех. Чтобы его открыть, нужно постучать в определённую последовательность портов в нужном порядке. Бот не знает последовательность — для него порт просто не существует.

Установка

Всё ставится одной командой:

sudo apt update && sudo apt install ufw fail2ban knockd -y

Настройка ufw

Сначала закрываем всё, потом открываем только нужное:

sudo ufw default deny incoming

sudo ufw default allow outgoing

sudo ufw allow 80/tcp

sudo ufw allow 443/tcp

sudo ufw enable

SSH через ufw пока не открываем — этим займётся knockd.

Проверить статус:

sudo ufw status verbose

Смена порта SSH

Первое что нужно сделать — убрать SSH со стандартного порта 22. Боты сканируют именно его.

Открываем конфиг:

sudo nano /etc/ssh/sshd_config

Находим строку Port 22 и меняем на любой нестандартный порт, например 2222 или любой другой от 1024 до 65535. Порт запомните — он понадобится для knockd.

Сохраняем и перезапускаем SSH:

sudo systemctl restart sshd

Важно: не закрывайте текущую сессию пока не убедитесь, что можете подключиться на новом порту.

Настройка knockd

knockd открывает SSH-порт только после того как вы постучите в правильную последовательность портов.

Открываем конфиг:

sudo nano /etc/knockd.conf

Вставляем:

[options]

UseSyslog

[openSSH]

sequence = 7000,8000,9000

seq_timeout = 5 command = /sbin/ufw allow from %IP% to any port 2222 proto tcp tcpflags = syn

[closeSSH]

sequence = 9000,8000,7000 seq_timeout = 5 command = /sbin/ufw delete allow from %IP% to any port 2222 proto tcp tcpflags = syn

Здесь 7000, 8000, 9000 — последовательность стука, 2222 — ваш SSH-порт. Поменяйте оба на свои значения.

Включаем knockd при старте системы:

sudo nano /etc/default/knockd

Меняем START_KNOCKD=0 на START_KNOCKD=1, и в строке KNOCKD_OPTS указываем сетевой интерфейс:

KNOCKD_OPTS="-i eth0" # Сюда вставляете свой интерфейс

Интерфейс можно узнать командой ip a — обычно eth0 или ens3.

Запускаем:

sudo systemctl enable knockd sudo systemctl start knockd

Теперь чтобы подключиться к серверу, сначала стучите:

knock -v your_server_ip 7000 8000 9000

Потом подключаетесь по SSH:

ssh user@your_server_ip -p 2222 # ваш новый порт используете здесь.

После сессии закрываете порт обратно:

knock -v your_server_ip 9000 8000 7000

Утилита knock ставится на локальной машине: sudo apt install knockd или brew install knock на Mac.

Настройка fail2ban

fail2ban — последний рубеж на случай если кто-то всё же узнал последовательность или ломится на другие сервисы.

Создаём локальный конфиг (не трогаем оригинал — он перезапишется при обновлении):

sudo nano /etc/fail2ban/jail.local

Вставляем:

[DEFAULT]

bantime = 1h

findtime = 10m

maxretry = 5

ignoreip = 127.0.0.1/8

[sshd]

enabled = true port = 2222

logpath = /var/log/auth.log maxretry = 3

Здесь maxretry = 3 — три неудачные попытки и IP заблокирован на час. Порт меняйте на свой.

Перезапускаем:

sudo systemctl restart fail2ban

Проверить забаненные IP:

sudo fail2ban-client status sshd

Итог

После настройки этой связки картина меняется полностью. SSH-порт невидим для сканеров, боты не знают последовательность стука, а те кто случайно добрался — получают бан после трёх попыток.

С момента настройки в логах тишина.

Советы которые сэкономят вам время

Не закрывайте текущую SSH-сессию пока не проверите, что новое подключение работает. Один раз закрылся раньше времени — и сервер придётся восстанавливать через консоль провайдера.

Поменяйте стандартную последовательность портов в knockd на свою. Не используйте примеры из интернета — они известны всем.

Сделайте резервный способ входа через VNC или консоль провайдера на случай если что-то пошло не так с knockd.

Проверяйте логи периодически: sudo journalctl -u fail2ban -n 50

Запретите вход по паролю, используйте только ключи SSH. В /etc/ssh/sshd_config строка PasswordAuthentication no — это убирает смысл брутфорса полностью. НО перед этим обязательно пробросьте свой ключ через ssh-copy-id, а то придется лезть в консоль провайдера ;)

2