Сканирование портов само по себе не является атакой. Это обычный способ определить, какие сетевые службы доступны на сервере. Проблема начинается тогда, когда злоумышленник использует результаты сканирования для поиска уязвимых сервисов, старых версий программ или открытых административных портов.
Полностью запретить сканирование невозможно. Если сервер доступен через интернет, его IP-адрес можно проверить снаружи. Задача защиты — не пытаться «спрятать» сервер, а уменьшить количество доступных сервисов, ограничить доступ к ним и не давать сканированию превращаться в подбор паролей или эксплуатацию уязвимостей.
Что нужно сделать перед настройкой защиты
Перед установкой дополнительных правил сначала проверьте, какие порты действительно используются сервером.
Выполните:
sudo ss -tulpn
Для внешней проверки можно использовать Nmap с другого компьютера:
nmap SERVER_IP
Не стоит закрывать порты только потому, что они выглядят незнакомыми. Сначала определите, какая служба их использует.
Например:
22 SSH
80 HTTP
443 HTTPS
51820 WireGuard
Если сервис вам не нужен, лучше отключить сам сервис и закрыть его порт в firewall.
Основной принцип защиты
Для обычного VPS или выделенного сервера достаточно придерживаться нескольких правил:
-
открывать только необходимые порты;
-
ограничивать доступ к административным сервисам;
-
не выставлять базы данных напрямую в интернет;
-
использовать firewall;
-
ограничивать частоту новых соединений там, где это действительно необходимо;
-
защищать SSH от перебора паролей;
-
следить за логами;
-
регулярно обновлять операционную систему и серверное ПО.
Один только перенос SSH с порта 22 на другой порт не является полноценной защитой. Он может уменьшить количество автоматического мусора в логах, но не мешает сканеру найти новый порт.
Защита с помощью UFW
Если на сервере используется UFW, сначала посмотрите текущие правила:
sudo ufw status numbered
Перед включением firewall обязательно разрешите SSH-порт.
Для стандартного SSH:
sudo ufw allow 22/tcp
Для другого порта:
sudo ufw allow 2222/tcp
Если сервер используется как веб-сервер:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
После этого включите UFW:
sudo ufw enable
Проверить результат:
sudo ufw status verbose
По умолчанию входящие подключения можно запретить:
sudo ufw default deny incoming
sudo ufw default allow outgoing
Теперь будут доступны только те порты, которые вы явно разрешили.
Ограничение количества SSH-подключений
UFW умеет ограничивать частоту новых подключений к SSH.
Для стандартного порта:
sudo ufw limit 22/tcp
Для SSH на порту 2222:
sudo ufw limit 2222/tcp
Такое правило помогает снизить количество быстрых повторных подключений к SSH.
Однако UFW limit не заменяет полноценную защиту от перебора паролей. Если SSH доступен из интернета, лучше дополнительно использовать SSH-ключи и Fail2Ban.
Защита SSH с помощью Fail2Ban
Fail2Ban анализирует логи сервисов и временно блокирует IP-адреса, с которых происходят подозрительные попытки входа.
Установка на Ubuntu и Debian:
sudo apt update
sudo apt install fail2ban
Запустите службу:
sudo systemctl enable --now fail2ban
Проверить состояние:
sudo fail2ban-client status
Для SSH:
sudo fail2ban-client status sshd
В зависимости от версии системы и конфигурации jail может называться ssh, а не sshd.
Fail2Ban особенно полезен в том случае, если SSH разрешает вход по паролю.
Лучше использовать SSH-ключи
Если сервер доступен из интернета, рекомендуется использовать авторизацию по SSH-ключу.
После проверки работы ключа можно отключить вход по паролю в конфигурации SSH:
PasswordAuthentication no
После изменения конфигурации сначала проверьте её:
sudo sshd -t
Если ошибок нет, перезапустите SSH:
sudo systemctl restart ssh
На некоторых системах:
sudo systemctl restart sshd
Не закрывайте текущую SSH-сессию, пока не убедитесь, что вход с нового соединения работает.
Ограничение доступа к SSH по IP
Если вы подключаетесь к серверу только с одного постоянного IP-адреса, можно разрешить SSH только для него.
Например, с UFW:
sudo ufw allow from 198.51.100.25 to any port 22 proto tcp
После проверки убедитесь, что общее правило для SSH не оставляет доступ открытым для всех:
sudo ufw status numbered
Если общий доступ больше не нужен, удалите соответствующее правило.
Такой вариант значительно уменьшает количество случайных сканирований SSH, но подходит только тогда, когда ваш внешний IP действительно стабилен.
Как ограничить доступ к административным портам
Панели управления, базы данных, Redis, Docker API и другие административные сервисы не должны быть открыты всему интернету без необходимости.
Например, если PostgreSQL нужен только приложению на том же сервере, нет смысла открывать:
5432/tcp
для всех внешних адресов.
То же относится к:
3306 MySQL
5432 PostgreSQL
6379 Redis
9200 Elasticsearch
27017 MongoDB
Если сервис используется локально, предпочтительнее привязать его к 127.0.0.1.
Например:
127.0.0.1:3306
значительно безопаснее, чем:
0.0.0.0:3306
Второй вариант означает, что приложение слушает все IPv4-интерфейсы. Доступ из интернета при этом всё равно зависит от firewall, но оставлять такие сервисы публичными без необходимости не стоит.
Защита через firewalld
На AlmaLinux, Rocky Linux, CentOS Stream и других RHEL-подобных системах часто используется firewalld.
Посмотреть текущую конфигурацию:
sudo firewall-cmd --list-all
Разрешить SSH:
sudo firewall-cmd --permanent --add-service=ssh
Разрешить HTTP и HTTPS:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
Применить изменения:
sudo firewall-cmd --reload
Проверить открытые порты:
sudo firewall-cmd --list-ports
Если определённый порт больше не нужен:
sudo firewall-cmd --permanent --remove-port=8080/tcp
sudo firewall-cmd --reload
Защита через nftables
На современных Linux-системах firewall может работать через nftables.
Посмотреть текущие правила:
sudo nft list ruleset
Если nftables используется непосредственно, правила нужно настраивать с учётом существующей конфигурации.
Не рекомендуется просто копировать готовый набор правил из интернета на рабочий сервер. Ошибка в firewall может заблокировать SSH, веб-сервер или другие необходимые службы.
Ограничение количества новых соединений
В некоторых случаях имеет смысл ограничивать количество новых соединений к определённому порту.
Например, это может быть полезно для административных сервисов, которые не должны получать большое количество новых соединений за короткий период.
Однако слишком агрессивные ограничения могут создать проблемы для обычных пользователей. Например, веб-сервер может обслуживать большое количество легитимных соединений, и блокировать их только из-за частоты запросов не стоит.
Поэтому такие ограничения нужно подбирать под конкретный сервис, а не устанавливать одинаковые значения для всех портов.
Почему нельзя просто блокировать все сканирования
Попытка определить сканер и автоматически блокировать каждый IP, который проверяет несколько портов, не всегда является хорошей идеей.
Причина простая: обычные пользователи, поисковые роботы, системы мониторинга и различные сетевые сервисы также могут выполнять большое количество соединений.
Кроме того, сканирование может выполняться:
-
с большого количества IP-адресов;
-
через IPv6;
-
через распределённые сети;
-
с постоянно меняющихся адресов.
Поэтому намного эффективнее правильно настроить саму сетевую поверхность сервера.
Что делать с портами, которые не используются
Если служба не нужна, сначала остановите её.
Например:
sudo systemctl stop service-name
Отключите автоматический запуск:
sudo systemctl disable service-name
Затем проверьте список прослушиваемых портов:
sudo ss -tulpn
После этого закройте ненужный порт в firewall.
Такой подход лучше, чем просто блокировать порт, оставляя ненужную службу запущенной.
Проверка результата
После настройки firewall проверьте сервер локально:
sudo ss -tulpn
Затем выполните внешнее сканирование с другого сервера:
nmap SERVER_IP
Для полного TCP-сканирования:
nmap -p- SERVER_IP
Если необходимо проверить UDP:
sudo nmap -sU SERVER_IP
Сравните результат с тем, какие сервисы действительно должны быть доступны.
Например, для обычного веб-сервера может быть достаточно:
22/tcp
80/tcp
443/tcp
Если SSH работает на другом порту, вместо 22 будет использоваться ваш порт.
Как проверить попытки сканирования
На Linux информация о сетевых соединениях и попытках доступа может находиться в системных журналах.
Для SSH:
sudo journalctl -u ssh
или:
sudo journalctl -u sshd
Если используется Fail2Ban:
sudo fail2ban-client status sshd
Также можно посмотреть заблокированные IP-адреса, если соответствующий jail настроен.
Для анализа большого количества соединений удобно использовать:
sudo ss -ant
Команда покажет текущие TCP-соединения и их состояния.
Что делать, если сервер постоянно сканируют
Если вы видите большое количество попыток подключения к разным портам, не стоит сразу воспринимать это как целевую атаку.
Публичные IP-адреса постоянно сканируются автоматическими ботами. Это обычная ситуация для серверов, подключённых к интернету.
В первую очередь проверьте:
-
какие порты открыты;
-
какие службы их используют;
-
какие из них действительно нужны;
-
разрешён ли доступ к административным сервисам;
-
используется ли авторизация по SSH-ключам;
-
работает ли Fail2Ban;
-
правильно ли настроен firewall.
Если открытых портов минимум, ненужные службы отключены, а административный доступ ограничен, обычное автоматическое сканирование обычно не представляет серьёзной проблемы.
Практический вариант для обычного VPS
Для стандартного VPS с сайтом можно использовать следующую схему:
SSH → только необходимый доступ
HTTP → открыт
HTTPS → открыт
MySQL → только localhost
Redis → только localhost
Другие → закрыты
В firewall разрешаются только необходимые порты.
Например, для UFW:
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
Если SSH работает на порту 2222:
sudo ufw allow 2222/tcp
Перед включением firewall обязательно убедитесь, что разрешён именно тот SSH-порт, через который вы подключаетесь.
Важный момент для IPv6
Если сервер имеет IPv6, не ограничивайтесь настройкой IPv4.
Например, вы можете закрыть порт 3306 через IPv4 firewall, но оставить доступ через IPv6 из-за неправильно настроенных правил.
Проверьте наличие IPv6-адреса:
ip -6 addr
И убедитесь, что firewall применяет правила и к IPv6.
Это особенно важно для VPS, на которых IPv6 включён по умолчанию.