Как настроить защиту от сканирования портов Печать

  • защита, protection, Сканирование портов, Port scanning
  • 0

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

Полностью запретить сканирование невозможно. Если сервер доступен через интернет, его 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 включён по умолчанию.


Помог ли вам данный ответ?

« Назад