Защита Minecraft-сервера от сканирования портов

Защита Minecraft-сервера от сканирования портов

Ваш Minecraft-сервер виден в интернете, и автоматизированные инструменты сканирования постоянно проверяют диапазоны IP-адресов в поисках открытых портов. Если порт 25565 доступен, ваш сервер может быть обнаружен, идентифицирован и атакован -- часто без вашего ведома.

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

Как обнаруживают ваш сервер

Каждый сетевой сервис работает на определенном порту. SSH на 22, MySQL на 3306, HTTP на 80, а Minecraft Java Edition по умолчанию на 25565. Bedrock Edition использует UDP-порт 19132.

Автоматизированные инструменты сканирования обходят огромные диапазоны IP-адресов и проверяют, какие порты открыты. Когда они находят порт 25565, он отмечается как Minecraft-сервер. По одному открытому порту можно узнать версию сервера, количество игроков, установленные плагины и многое другое.

Такие сканирования происходят непрерывно. Специализированные сервисы индексации интернета каталогизируют каждый открытый порт, сохраняя результаты в доступных базах данных. Ваш Minecraft-сервер, скорее всего, уже проиндексирован в одной или нескольких таких системах.

Это означает, что нельзя полагаться на неизвестность. Даже если вы нигде не рекламировали сервер, он уже обнаружен. Защита должна быть проактивной.

Какую информацию раскрывает сервер

Minecraft-сервер по умолчанию очень общителен. При подключении к порту 25565 (даже без полного логина) сервер раскрывает значительный объем информации:

Server List Ping (SLP). Когда клиент добавляет сервер в список, он отправляет SLP-запрос. Сервер отвечает JSON с версией, MOTD, иконкой, количеством игроков и даже сэмплом имен онлайн-игроков.

Query Protocol. Если включен порт query (по умолчанию тот же 25565 на UDP), сервер раскрывает еще больше: список плагинов, тип мира, версия софта, максимальное количество игроков.

# server.properties — НАСТРОЙКА ПО УМОЛЧАНИЮ (небезопасная)
enable-query=true
query.port=25565

Ответ query раскрывает такие данные:

hostname: SurvivalCraft Network
gametype: SMP
version: 1.21.4
plugins: Paper 1.21.4: Essentials 2.20, WorldGuard 7.0.9, Vault 1.7.3
numplayers: 47
maxplayers: 200

Имея эту информацию, атакующий знает ваш точный стек технологий и может искать известные уязвимости в конкретных версиях плагинов.

Favicon и сэмпл игроков

SLP-ответ также включает иконку сервера (favicon) в формате base64. Если на ней изображен узнаваемый логотип сети или сообщества, сервер сразу идентифицируется.

Еще более опасен сэмпл игроков. Сервер по умолчанию отдает список из нескольких онлайн-игроков в формате UUID + имя. Эти данные могут быть использованы для:

  • Определения никнеймов активных игроков и аккаунтов администраторов
  • Отслеживания паттернов активности игроков
  • Определения пиковых часов и периодов низкой активности
  • Сбора UUID для потенциальных атак на сессии

На маленьких серверах эти данные показывают, когда админ онлайн и когда сервер наиболее уязвим. Защита этой информации -- ваша первая линия обороны.

Типы сканирования (чтобы от них защититься)

Для настройки эффективной защиты нужно понимать, какие типы зондирования должен обрабатывать ваш файрвол:

SYN-зонды (полуоткрытые). Самый распространенный тип. Зонд отправляет TCP SYN-пакет; если порт открыт, сервер отвечает SYN-ACK. Зонд тут же отправляет RST, не завершая рукопожатие. Многие базовые файрволы не логируют полуоткрытые соединения, поэтому они могут проходить незамеченными.

FIN, NULL и XMAS-зонды. Эти типы используют нестандартные комбинации TCP-флагов специально для обхода простых файрволов. FIN-зонд отправляет пакет с флагом FIN, NULL -- пакет без флагов, XMAS -- пакет с несколькими флагами одновременно. Многие базовые файрволы настроены блокировать только SYN-пакеты и пропускают эти типы зондов. Ваши правила файрвола должны учитывать все это.

UDP-зонды. Используются для обнаружения Bedrock-серверов (порт 19132) и query-порта Minecraft Java. Raknet-протокол Bedrock отвечает характерным unconnected pong, по которому безошибочно определяется сервер. Отключение ненужных UDP-сервисов критически важно.

Fingerprinting сервисов. Продвинутые зонды отправляют специфичные для протокола запросы (например, SLP-рукопожатие), чтобы определить конкретный сервис и его версию, независимо от номера порта. Именно поэтому смена порта сама по себе не является достаточной защитой.

Обнаружение сканирования

Логирование через iptables

Первый шаг -- узнать, что вас сканируют. Настройте логирование подозрительных подключений:

# Логировать новые подключения к MC порту
iptables -A INPUT -p tcp --dport 25565 -m state --state NEW \
  -m recent --set --name MC_SCAN

# Логировать IP, которые подключаются слишком часто
iptables -A INPUT -p tcp --dport 25565 -m state --state NEW \
  -m recent --update --seconds 60 --hitcount 10 --name MC_SCAN \
  -j LOG --log-prefix "MC-SCAN-DETECT: " --log-level 4

Ищите паттерны: один IP обращается к множеству портов за короткое время, или быстрые повторные подключения к вашему порту Minecraft.

Fail2ban

Fail2ban умеет парсить логи и автоматически банить подозрительные IP-адреса.

Создайте фильтр для обнаружения сканирования:

# /etc/fail2ban/filter.d/portscan.conf
[Definition]
failregex = MC-SCAN-DETECT:.*SRC=<HOST>
ignoreregex =

И jail:

# /etc/fail2ban/jail.d/portscan.conf
[portscan]
enabled  = true
filter   = portscan
logpath  = /var/log/kern.log
maxretry = 5
findtime = 60
bantime  = 3600
action   = iptables-allports[name=portscan]

Теперь если один IP сделает больше 5 подключений за 60 секунд, он будет заблокирован на час.

PSAD (Port Scan Attack Detector)

PSAD анализирует логи iptables в реальном времени и определяет паттерны сканирования. Он умеет различать разные типы зондов и автоматически блокировать IP-адреса источников.

apt install psad

PSAD интегрируется с iptables и обеспечивает автоматическое реагирование на сканирование в реальном времени.

Анализ логов вручную

Даже без специализированных инструментов можно обнаружить сканирование, анализируя логи. Характерные признаки:

  • Множество подключений с одного IP к разным портам за короткий период
  • Подключения к заведомо закрытым портам (если кто-то стучится в порт 23, 445 или 8443, которые вы не используете -- это разведка)
  • Серии SYN-пакетов без завершения handshake
  • Подключения в нетипичное время (3-5 утра по часовому поясу целевой аудитории)
# Посмотреть последние подключения к порту MC
journalctl -k | grep "MC-SCAN-DETECT" | tail -20

# Или через iptables счетчики
iptables -L INPUT -v -n | grep 25565

Регулярная проверка логов поможет заметить подготовку к атаке до ее начала.

Уменьшение видимости сервера

Отключите Query Protocol

Если вам не нужен внешний мониторинг через query (а вам скорее всего не нужен), отключите его:

# server.properties
enable-query=false

Это сразу убирает утечку информации о плагинах, типе мира и других деталях.

Скройте версию сервера и количество игроков

Плагины типа MiniMOTD или ServerListPlus позволяют кастомизировать ответ SLP:

# MiniMOTD config
server-list:
  hide-player-count: true
  version-name: " "

Это не полноценная защита, но значительно уменьшает объем информации, доступной автоматизированным инструментам.

Rate limiting с iptables

Ограничьте частоту подключений к порту Minecraft:

# Ограничить новые подключения: максимум 3 в секунду на IP
iptables -A INPUT -p tcp --dport 25565 -m state --state NEW \
  -m recent --set --name MC_CONN

iptables -A INPUT -p tcp --dport 25565 -m state --state NEW \
  -m recent --update --seconds 1 --hitcount 4 --name MC_CONN \
  -j DROP

Для защиты SSH:

# Максимум 3 попытки подключения к SSH за 60 секунд
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
  -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
  -m recent --update --seconds 60 --hitcount 4 --name SSH \
  -j DROP

Подробнее о настройке файрвола читайте в нашем гайде по iptables для Minecraft.

Port Knocking

Port knocking -- это продвинутая техника, при которой порт остается закрытым до тех пор, пока клиент не "постучит" в определенную последовательность портов.

Принцип работы: ваш Minecraft-порт 25565 закрыт для всех. Чтобы его открыть, нужно последовательно подключиться к портам 7000, 8000, 9000 (секретная последовательность). После правильного "стука" файрвол открывает порт 25565 для этого IP.

# /etc/knockd.conf
[openMinecraft]
  sequence    = 7000,8000,9000
  seq_timeout = 5
  command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 25565 -j ACCEPT
  tcpflags    = syn

[closeMinecraft]
  sequence    = 9000,8000,7000
  seq_timeout = 5
  command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 25565 -j ACCEPT
  tcpflags    = syn

Проблема: port knocking неудобен для публичных серверов. Каждый игрок должен сначала "постучать", что сложно автоматизировать для Minecraft-клиента. Это решение больше подходит для администраторского SSH или приватных серверов.

Honeypots: ловушки для сканеров

Honeypot (горшочек с медом) -- это сервис-приманка, который имитирует реальный сервер для обнаружения и отслеживания атакующих. Вы можете запустить фейковый Minecraft-сервер на стандартном порту 25565, который логирует все попытки подключения, а реальный сервер работает на другом порту.

Простой honeypot на Python:

import socket
import json
import time
import logging

logging.basicConfig(filename='honeypot.log', level=logging.INFO)

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('0.0.0.0', 25565))
sock.listen(5)

while True:
    conn, addr = sock.accept()
    logging.info(f"{time.strftime('%Y-%m-%d %H:%M:%S')} - Probe from {addr[0]}:{addr[1]}")
    conn.close()

Собранные IP-адреса можно добавлять в черный список iptables или использовать для анализа угроз. Более продвинутый подход -- использовать готовые решения вроде HoneyMC или развернуть honeypot в Docker-контейнере. Honeypot с реалистичным MOTD привлечет больше зондов и даст более полную картину угроз.

Для автоматической блокировки обнаруженных сканеров:

# Простой скрипт для бана IP из honeypot лога
tail -f /var/log/honeypot.log | while read line; do
  IP=$(echo "$line" | grep -oP '\d+\.\d+\.\d+\.\d+')
  if [ -n "$IP" ]; then
    iptables -A INPUT -s "$IP" -j DROP
    echo "Banned scanner: $IP"
  fi
done

Смена порта: помогает, но недостаточно

Перенос Minecraft-сервера с дефолтного 25565 на нестандартный порт (например, 38742) снижает количество автоматических сканов. Большинство скриптов и ботов проверяют именно стандартные порты.

# server.properties
server-port=38742

Но это не серьезная защита сама по себе:

  1. Полное сканирование портов все равно найдет сервер -- автоматизированные инструменты просканируют все 65535 портов за считанные минуты
  2. Сервисы индексации интернета каталогизируют все порты, не только стандартные
  3. Fingerprinting сервисов работает по сигнатуре ответа, а не по номеру порта

Смена порта -- это "security through obscurity". Полезно как дополнительный слой, но не как единственная мера.

SRV-записи для удобства

Если вы меняете порт, игрокам не нужно его запоминать. Используйте SRV-запись в DNS:

_minecraft._tcp.play.example.com. 86400 IN SRV 0 5 38742 mc.example.com.

Теперь игроки подключаются к play.example.com, а DNS автоматически указывает на нужный порт.

Как наша DDoS-защита скрывает сервер

Самый надежный способ спрятать сервер от сканеров -- не показывать его реальный IP вообще.

Когда вы используете MineGuard, игроки подключаются к IP нашего прокси. Реальный IP вашего сервера знаем только мы. Сканер видит прокси и не может найти настоящий сервер.

Что это дает:

  • Сканирование прокси бесполезно -- атакующий не узнает реальный IP
  • На реальном сервере можно закрыть все порты кроме SSH и соединения с прокси
  • Даже если атакующий атакует прокси, мы фильтруем трафик до того, как он дойдет до вашего сервера
  • Сервисы индексации интернета каталогизируют IP нашего прокси, а не ваш

При этом критически важно не раскрыть реальный IP другими способами. DNS-история (некоторые сервисы хранят все прошлые DNS-записи), утечки через email-заголовки, прямые подключения к API без прокси или даже случайное упоминание IP в публичных чатах могут свести на нет всю защиту.

Некоторые атакующие используют исторические данные DNS для поиска реальных IP. Если ваш домен когда-то указывал напрямую на сервер, а потом вы подключили прокси, старый IP уже проиндексирован. Решение -- сменить IP сервера одновременно с подключением защиты.

Подробнее об этом читайте в нашей статье о сокрытии IP.

Конфигурация файрвола при использовании нашего прокси

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

# Разрешить Minecraft только с IP прокси
iptables -A INPUT -p tcp --dport 25565 -s PROXY_IP -j ACCEPT
iptables -A INPUT -p tcp --dport 25565 -j DROP

# Разрешить SSH только с вашего IP
iptables -A INPUT -p tcp --dport 22 -s YOUR_IP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

Теперь даже полное сканирование всех 65535 портов не покажет ничего интересного. Сервер выглядит как пустой хост.

Комплексная стратегия защиты

Никакая одна мера не даст полной защиты. Нужен многоуровневый подход:

  1. Используйте DDoS-прокси для сокрытия реального IP
  2. Закройте все ненужные порты через iptables
  3. Отключите Query Protocol в server.properties
  4. Скройте версию и количество игроков через плагины
  5. Настройте rate limiting для ограничения частоты подключений
  6. Установите fail2ban для автоматической блокировки сканеров
  7. Перенесите сервер на нестандартный порт (дополнительно к другим мерам)
  8. Не раскрывайте IP через DNS-историю, email-заголовки или другие каналы
  9. Регулярно проверяйте, какую информацию ваш сервер раскрывает наружу

Для полного чеклиста безопасности загляните в наш чеклист безопасности Minecraft-сервера на 2026 год.

Сканирование портов -- это первый шаг любой целевой атаки. Уменьшив видимость сервера и выстроив правильную защиту, вы делаете этот шаг бесполезным. Атакующий не может атаковать сервер, который он не может найти -- а с правильной настройкой ваш сервер остается невидимым.


Sunucunuzu DDoS Saldırılarından Koruyun

5 dakikada kurulumla ücretsiz koruma. 1 TB bant genişliği dahil.

Ücretsiz Deneyin


İlgili Makaleler