Как я защитил свои серверы от ботов и брутфорса за 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, а то придется лезть в консоль провайдера ;)