Ochrona serwera Minecraft przed skanowaniem portów

Ochrona serwera Minecraft przed skanowaniem portów

Twój serwer Minecraft jest widoczny w internecie, a zautomatyzowane narzędzia skanujące nieustannie sprawdzają zakresy adresów IP w poszukiwaniu otwartych portów. Jeśli port 25565 jest dostępny, twój serwer może być wykryty, zidentyfikowany i zaatakowany -- często bez twojej wiedzy.

W tym artykule rozkminiamy, jakie informacje twój serwer ujawnia domyślnie, jak wykryć skanowanie i jak zbudować wielopoziomową ochronę, która sprawi, że twój serwer stanie się praktycznie niewidoczny dla atakujących.

Jak wykrywany jest twój serwer

Każdy serwis sieciowy działa na określonym porcie. SSH na 22, MySQL na 3306, HTTP na 80, a Minecraft Java Edition domyślnie na 25565. Bedrock Edition używa portu UDP 19132.

Zautomatyzowane narzędzia skanujące przechodzą przez ogromne zakresy adresów IP i sprawdzają, które porty są otwarte. Gdy znajdują port 25565, oznaczają go jako serwer Minecraft. Po jednym otwartym porcie można poznać wersję serwera, liczbę graczy, zainstalowane pluginy i wiele więcej.

Takie skanowania dzieją się nieustannie. Specjalizowane serwisy indeksujące internet katalogują każdy otwarty port, zapisując wyniki w dostępnych bazach danych. Twój serwer Minecraft najprawdopodobniej już jest zindeksowany w jednym lub kilku takich systemach.

To znaczy, że nie można polegać na niewiedzy. Nawet jeśli nigdzie nie reklamowałeś serwera, został już wykryty. Ochrona musi być proaktywna.

Jakie informacje ujawnia serwer

Serwer Minecraft domyślnie jest bardzo gadatliwy. Przy połączeniu z portem 25565 (nawet bez pełnego logowania) serwer ujawnia sporą porcję informacji:

Server List Ping (SLP). Kiedy klient dodaje serwer do listy, wysyła zapytanie SLP. Serwer odpowiada JSON-em z wersją, MOTD, ikoną, liczbą graczy, a nawet samplem imion graczy online.

Query Protocol. Jeśli włączony jest port query (domyślnie ten sam 25565 na UDP), serwer ujawnia jeszcze więcej: listę pluginów, typ świata, wersję softu, maksymalną liczbę graczy.

# server.properties - USTAWIENIE DOMYŚLNE (niebezpieczne)
enable-query=true
query.port=25565

Odpowiedź query ujawnia takie dane:

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

Mając te informacje, atakujący zna twój dokładny stack technologiczny i może szukać znanych luk w konkretnych wersjach pluginów.

Favicon i sample graczy

Odpowiedź SLP zawiera też ikonę serwera (favicon) w formacie base64. Jeśli widnieje na niej rozpoznawalne logo sieci lub community, serwer od razu się identyfikuje.

Jeszcze groźniejszy jest sample graczy. Serwer domyślnie oddaje listę kilku graczy online w formacie UUID + imię. Dane te mogą być użyte do:

  • Ustalenia nicków aktywnych graczy i kont administratorów
  • Śledzenia wzorców aktywności graczy
  • Wyznaczania godzin szczytu i okresów niskiej aktywności
  • Zbierania UUID do potencjalnych ataków na sesje

Na małych serwerach te dane pokazują, kiedy admin jest online i kiedy serwer jest najbardziej podatny. Ochrona tej informacji to twoja pierwsza linia obrony.

Typy skanowania (żeby się przed nimi bronić)

Do konfiguracji skutecznej ochrony trzeba rozumieć, jakie typy sondowania musi obsługiwać twój firewall:

Sondy SYN (półotwarte). Najpopularniejszy typ. Sonda wysyła pakiet TCP SYN; jeśli port jest otwarty, serwer odpowiada SYN-ACK. Sonda od razu wysyła RST, nie kończąc handshake. Wiele podstawowych firewalli nie loguje półotwartych połączeń, więc mogą przechodzić niezauważone.

Sondy FIN, NULL i XMAS. Te typy używają niestandardowych kombinacji flag TCP specjalnie do omijania prostych firewalli. Sonda FIN wysyła pakiet z flagą FIN, NULL - pakiet bez flag, XMAS - pakiet z wieloma flagami naraz. Wiele podstawowych firewalli jest skonfigurowanych do blokowania tylko pakietów SYN i przepuszcza te typy sond. Twoje reguły firewall muszą uwzględniać wszystko to.

Sondy UDP. Używane do wykrywania serwerów Bedrock (port 19132) i portu query Minecraft Java. Protokół Raknet Bedrock odpowiada charakterystycznym unconnected pong, po którym bezbłędnie rozpoznaje się serwer. Wyłączenie zbędnych usług UDP jest krytyczne.

Fingerprinting usług. Zaawansowane sondy wysyłają specyficzne dla protokołu zapytania (na przykład handshake SLP), żeby ustalić konkretną usługę i jej wersję, niezależnie od numeru portu. Dlatego właśnie zmiana portu sama w sobie nie jest wystarczającą ochroną.

Wykrywanie skanowania

Logowanie przez iptables

Pierwszy krok - dowiedzieć się, że cię skanują. Skonfiguruj logowanie podejrzanych połączeń:

# Logować nowe połączenia do portu MC
iptables -A INPUT -p tcp --dport 25565 -m state --state NEW \
  -m recent --set --name MC_SCAN

# Logować IP, które łączą się zbyt często
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

Szukaj wzorców: jedno IP odwołuje się do wielu portów w krótkim czasie, albo szybkie powtórzenia połączeń do twojego portu Minecraft.

Fail2ban

Fail2ban potrafi parsować logi i automatycznie banować podejrzane adresy IP.

Stwórz filtr do wykrywania skanowania:

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

I 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]

Teraz, jeśli jedno IP wykona więcej niż 5 połączeń w 60 sekund, zostanie zablokowane na godzinę.

PSAD (Port Scan Attack Detector)

PSAD analizuje logi iptables w czasie rzeczywistym i wykrywa wzorce skanowania. Potrafi rozróżniać różne typy sond i automatycznie blokować adresy IP źródłowe.

apt install psad

PSAD integruje się z iptables i zapewnia automatyczne reagowanie na skanowanie w czasie rzeczywistym.

Ręczna analiza logów

Nawet bez specjalizowanych narzędzi można wykryć skanowanie, analizując logi. Charakterystyczne oznaki:

  • Wiele połączeń z jednego IP do różnych portów w krótkim okresie
  • Połączenia do z góry zamkniętych portów (jeśli ktoś puka do portu 23, 445 lub 8443, których nie używasz -- to rekonesans)
  • Serie pakietów SYN bez dokończenia handshake
  • Połączenia w nietypowym czasie (3-5 rano w strefie czasowej targetu)
# Zobacz ostatnie połączenia do portu MC
journalctl -k | grep "MC-SCAN-DETECT" | tail -20

# Lub przez liczniki iptables
iptables -L INPUT -v -n | grep 25565

Regularne sprawdzanie logów pomoże zauważyć przygotowania do ataku przed jego startem.

Zmniejszanie widoczności serwera

Wyłącz Query Protocol

Jeśli nie potrzebujesz zewnętrznego monitoringu przez query (a najprawdopodobniej nie potrzebujesz), wyłącz go:

# server.properties
enable-query=false

To od razu eliminuje wyciek informacji o pluginach, typie świata i innych szczegółach.

Ukryj wersję serwera i liczbę graczy

Pluginy typu MiniMOTD lub ServerListPlus pozwalają dostosować odpowiedź SLP:

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

To nie pełna ochrona, ale znacząco zmniejsza zakres informacji dostępnych dla zautomatyzowanych narzędzi.

Rate limiting w iptables

Ogranicz częstotliwość połączeń do portu Minecraft:

# Limit nowych połączeń: maks. 3 na sekundę na 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

Dla ochrony SSH:

# Maksymalnie 3 próby połączenia z SSH w 60 sekund
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

Więcej o konfiguracji firewalla przeczytasz w naszym poradniku po iptables pod Minecrafta.

Port Knocking

Port knocking to zaawansowana technika, przy której port pozostaje zamknięty do czasu, aż klient "zapuka" w określoną sekwencję portów.

Zasada działania: twój port Minecraft 25565 jest zamknięty dla wszystkich. Żeby go otworzyć, trzeba po kolei połączyć się z portami 7000, 8000, 9000 (tajna sekwencja). Po poprawnym "puknięciu" firewall otwiera port 25565 dla tego 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

Problem: port knocking jest niewygodny dla publicznych serwerów. Każdy gracz musi najpierw "zapukać", co trudno zautomatyzować dla klienta Minecrafta. To rozwiązanie bardziej pasuje do administracyjnego SSH lub prywatnych serwerów.

Honeypoty: pułapki na skanery

Honeypot (garnek z miodem) to serwis-przynęta, który imituje prawdziwy serwer do wykrywania i śledzenia atakujących. Możesz uruchomić fejkowy serwer Minecraft na standardowym porcie 25565, który loguje wszystkie próby połączenia, a prawdziwy serwer działa na innym porcie.

Prosty honeypot w Pythonie:

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()

Zebrane adresy IP można dodawać do czarnej listy iptables lub używać do analizy zagrożeń. Bardziej zaawansowane podejście to gotowe rozwiązania typu HoneyMC albo postawienie honeypota w kontenerze Docker. Honeypot z realistycznym MOTD przyciągnie więcej sond i da pełniejszy obraz zagrożeń.

Do automatycznego blokowania wykrytych skanerów:

# Prosty skrypt do banowania IP z logu honeypota
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

Zmiana portu: pomaga, ale nie wystarcza

Przeniesienie serwera Minecraft z domyślnego 25565 na niestandardowy port (na przykład 38742) zmniejsza liczbę automatycznych skanów. Większość skryptów i botów sprawdza właśnie standardowe porty.

# server.properties
server-port=38742

Ale to nie jest poważna ochrona sama w sobie:

  1. Pełne skanowanie portów i tak znajdzie serwer - zautomatyzowane narzędzia przeskanują wszystkie 65535 portów w parę minut
  2. Serwisy indeksujące internet katalogują wszystkie porty, nie tylko standardowe
  3. Fingerprinting usług działa po sygnaturze odpowiedzi, a nie po numerze portu

Zmiana portu to "security through obscurity". Przydatne jako dodatkowa warstwa, ale nie jako jedyny środek.

Rekordy SRV dla wygody

Jeśli zmieniasz port, gracze nie muszą go zapamiętywać. Użyj rekordu SRV w DNS:

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

Teraz gracze łączą się z play.example.com, a DNS automatycznie kieruje na odpowiedni port.

Jak nasza ochrona DDoS ukrywa serwer

Najbardziej niezawodny sposób ukrycia serwera przed skanerami to w ogóle nie pokazywać jego prawdziwego IP.

Kiedy używasz MineGuard, gracze łączą się z IP naszego proxy. Prawdziwe IP twojego serwera znamy tylko my. Skaner widzi proxy i nie może znaleźć prawdziwego serwera.

Co to daje:

  • Skanowanie proxy jest bezużyteczne - atakujący nie pozna prawdziwego IP
  • Na prawdziwym serwerze można zamknąć wszystkie porty poza SSH i połączeniem z proxy
  • Nawet jeśli atakujący atakuje proxy, filtrujemy ruch zanim dotrze do twojego serwera
  • Serwisy indeksujące internet katalogują IP naszego proxy, a nie twoje

Przy tym krytycznie ważne jest, żeby nie ujawnić prawdziwego IP w inny sposób. Historia DNS (niektóre serwisy przechowują wszystkie poprzednie rekordy DNS), wycieki przez nagłówki email, bezpośrednie połączenia do API bez proxy albo nawet przypadkowe wspomnienie IP w publicznych czatach mogą zniweczyć całą ochronę.

Niektórzy atakujący używają historycznych danych DNS do szukania prawdziwych IP. Jeśli twoja domena kiedyś wskazywała bezpośrednio na serwer, a potem podłączyłeś proxy, stare IP jest już zindeksowane. Rozwiązanie - zmienić IP serwera jednocześnie z podłączeniem ochrony.

Więcej o tym przeczytasz w naszym artykule o ukrywaniu IP.

Konfiguracja firewalla przy używaniu naszego proxy

Na prawdziwym serwerze zamknij port Minecraft dla wszystkich poza IP proxy:

# Zezwól na Minecraft tylko z IP proxy
iptables -A INPUT -p tcp --dport 25565 -s PROXY_IP -j ACCEPT
iptables -A INPUT -p tcp --dport 25565 -j DROP

# Zezwól na SSH tylko z twojego IP
iptables -A INPUT -p tcp --dport 22 -s YOUR_IP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

Teraz nawet pełne skanowanie wszystkich 65535 portów nie pokaże nic ciekawego. Serwer wygląda jak pusty host.

Kompleksowa strategia ochrony

Żaden pojedynczy środek nie da pełnej ochrony. Potrzebne jest podejście wielopoziomowe:

  1. Używaj proxy DDoS do ukrycia prawdziwego IP
  2. Zamknij wszystkie zbędne porty przez iptables
  3. Wyłącz Query Protocol w server.properties
  4. Ukryj wersję i liczbę graczy przez pluginy
  5. Skonfiguruj rate limiting do ograniczenia częstotliwości połączeń
  6. Zainstaluj fail2ban do automatycznego blokowania skanerów
  7. Przenieś serwer na niestandardowy port (dodatkowo do innych środków)
  8. Nie ujawniaj IP przez historię DNS, nagłówki email czy inne kanały
  9. Regularnie sprawdzaj, jakie informacje twój serwer ujawnia na zewnątrz

Po pełny checklist bezpieczeństwa zajrzyj do naszego checklistu bezpieczeństwa serwera Minecraft na 2026 rok.

Skanowanie portów to pierwszy krok każdego celowego ataku. Zmniejszając widoczność serwera i budując odpowiednią ochronę, czynisz ten krok bezużytecznym. Atakujący nie może zaatakować serwera, którego nie może znaleźć -- a z odpowiednią konfiguracją twój serwer pozostaje niewidoczny.


Chroń swój serwer przed atakami DDoS

Darmowa ochrona z konfiguracją w 5 minut. 1 TB ruchu w zestawie.

Wypróbuj za darmo


Powiązane artykuły