Project-Zomboid-server beschermen tegen DDoS-aanvallen

Gepubliceerd op 20 min leestijd

Welke poorten een dedicated Project-Zomboid-server werkelijk nodig heeft, welke directives van de servertest.ini tellen, waarom de mod-vergelijking bij het verbinden aanvalbaar maakt, en vanaf welke aanvalsgrootte alleen filtering in het netwerk ervoor nog helpt.

Wie zijn Project-Zomboid-server tegen DDoS-aanvallen wil beschermen, moet eerst weten waarop een aanvaller überhaupt schiet. Een dedicated server bezet precies twee UDP-poorten, 16261 en 16262, en beide moeten open op het netwerk staan, omdat anders niemand kan meedoen. Dit artikel gaat te werk in de volgorde die in geval van nood telt: eerst wat u in de komende tien minuten zonder extra kosten zelf kunt doen, daarna het punt waarop die maatregelen technisch ophouden, en tot slot wat er in het netwerk ervoor moet gebeuren.

Alle informatie hier gaat uit van de dedicated server (Steam-app 380870) onder Debian 12, Debian 13, Ubuntu 22.04 LTS of Ubuntu 24.04 LTS, voor build 41 net zo goed als voor build 42. Het configuratiebestand heet servertest.ini en staat onder ~/Zomboid/Server/, de wereldgegevens staan onder ~/Zomboid/Saves/Multiplayer/. De commando's zijn voor root geschreven; als gewone gebruiker zet u er sudo voor.

Loopt de aanval op dit moment: verander nu niets aan de servertest.ini en start de server niet opnieuw op. Leg eerst de meetwaarden vast (paragraaf 9), na de aanval zijn ze verdwenen. Een herstart kost bovendien de tijd die de server nodig heeft om de wereld te laden, en juist die wil de aanvaller u afnemen.

Waarom Project-Zomboid-servers het doelwit van DDoS-aanvallen worden

Project Zomboid is een spel met permanente dood en een wereld die maandenlang doorloopt. Een verbindingsverlies midden in een gevaarlijke situatie kost hier meer dan in vrijwel elk ander genre: het personage is weg, en de wereld onthoudt dat. Juist dat maakt een uitval tot een wapen. Een aanval om 20 uur treft een vaste community, en hij treft haar op de plek waar zij het meest te verliezen heeft.

Daar komt bij dat de aanval zelf niets kost en geen kunde verlangt. Geboekte aanvalsdiensten, in het milieu booters of stressers genoemd, richten zich met een paar klikken tegen een IP-adres en een poort, en bij Project Zomboid is het doelwit altijd hetzelfde: 16261 UDP. Wie ruzie heeft met een verbannen speler of een concurrerende community beheert, heeft daarmee een werktuig in handen waarvoor hij kennis noch noemenswaardig geld nodig heeft.

Daar komt bij dat een gameserver zijn adres moet publiceren. Staat er Public=true in de servertest.ini, dan verschijnt de server in de browser van het spel, en een server met Steam-koppeling is sowieso zichtbaar in de Steam-serverbrowser. De vraag luidt dus nooit of een aanvaller uw IP-adres vindt, maar alleen wat er gebeurt wanneer hij daarop schiet.

Technisch komt het onaangenaamste deel als laatste: het volledige spelverkeer loopt over UDP. UDP kent geen verbindingsopbouw die u zou kunnen eisen, elk pakket staat op zichzelf, en het afzenderadres laat zich vervalsen. Een aanvaller hoeft uw server dus niet te betreden en hoeft hem ook niet correct aan te spreken om belasting te veroorzaken. Wat een DDoS-aanval in detail is, legt het artikel Wat is een DDoS-aanval? uit.

Welke poorten een Project-Zomboid-server werkelijk nodig heeft

Een dedicated Project-Zomboid-server heeft precies twee open poorten nodig: 16261 UDP en 16262 UDP. De officiële poortenlijst van het spel noemt geen derde. In de servertest.ini staan ze als twee gescheiden directives, de tweede poort volgt niet automatisch uit de eerste:

DefaultPort=16261
UDPPort=16262
SteamPort1=8766
SteamPort2=8767
RCONPort=27015
RCONPassword=

De taakverdeling is eenduidig. 16261 UDP draagt het spelverkeer en de verbindingsopbouw en beantwoordt de opvragen van de serverbrowser. 16262 UDP is de poort voor de directe verbinding van de clients. Ontbreekt de eerste, dan vindt niemand de server, ontbreekt de tweede, dan zien uw spelers de vermelding en komen ze toch niet binnen. Precies daar komt de bekendste foutmelding van het spel vandaan, dat poort 16262 gesloten zou zijn.

Poort Protocol Taak Directive in de servertest.ini Vanaf het internet bereikbaar?
16261 UDP spelverkeer, verbindingsopbouw, opvragen van de serverbrowser DefaultPort=16261 ja, verplicht
16262 UDP directe verbinding van de clients UDPPort=16262 ja, verplicht
8766 en 8767 UDP Steam-koppeling van de server SteamPort1, SteamPort2 nee, in de officiële verplichte lijst staan alleen 16261 en 16262
27015 TCP RCON-afstandsbediening RCONPort=27015 nee, alleen voor uw eigen adres
22 TCP SSH-toegang tot het besturingssysteem niet in de servertest.ini beperkt

Twee punten die geregeld last geven. Ten eerste: elke serverinstantie heeft twee vrije UDP-poorten nodig. Wie een tweede wereld op dezelfde machine draait, geeft daarvoor een tweede paar uit, bijvoorbeeld 16274 en 16275, en zet beide waarden in de servertest.ini van de tweede instantie. Ten tweede: SteamPort1 en SteamPort2 staan met 8766 en 8767 in het configuratiebestand, maar horen bij de Steam-koppeling en niet bij het spelverkeer. Zet ze alleen open wanneer uw server zonder hen niet in de Steam-lijst opduikt, niet uit voorzorg.

Wat u zelf kunt doen voordat u geld uitgeeft

Dit hoofdstuk is het langste, en dat met opzet. Een netjes geconfigureerde server houdt kleine en middelgrote aanvallen op eigen kracht uit, ongeacht bij wie hij staat. Hij neemt u geen volumetrische aanval af, maar zorgt er wel voor dat goedkope aanvallen zonder gevolg blijven en dat u in geval van nood cijfers hebt in plaats van vermoedens.

1. Inventarisatie: wat luistert er werkelijk

Voordat u ook maar één regel schrijft, kijkt u na wat uw server naar buiten aanbiedt. Niet gokken, maar kijken:

ss -lntup

Interessant is de kolom met het lokale adres. 0.0.0.0:16261 en [::]:16261 betekenen "vanaf het hele internet bereikbaar", 127.0.0.1:27015 betekent "alleen lokaal" en heeft geen openstelling nodig. Leg het resultaat naast uw configuratie in plaats van op standaardwaarden te vertrouwen:

grep -E "^(DefaultPort|UDPPort|SteamPort1|SteamPort2|RCONPort|Public|Open|MaxPlayers|MaxAccountsPerUser)=" ~/Zomboid/Server/servertest.ini

Het beeld van de aanvaller levert een poortscan van buitenaf. Omdat Project Zomboid uitsluitend UDP gebruikt, is daarvoor de UDP-scan nodig, een zuivere TCP-scan toont de spelpoort helemaal niet:

nmap -Pn -sU -p 16261,16262,8766,8767 UW.SERVER.IP.ADRES
nmap -Pn -p- --min-rate 1000 UW.SERVER.IP.ADRES

2. Alleen 16261 en 16262 openlaten

Twee openstellingen naar buiten volstaan, al het andere wordt beperkt of helemaal niet gepubliceerd. Met UFW ziet dat er zo uit, en wel precies in deze volgorde, zodat u zichzelf niet buitensluit:

ufw allow 22/tcp comment "SSH"
ufw allow 16261/udp comment "Project Zomboid"
ufw allow 16262/udp comment "Project Zomboid directe verbinding"
ufw allow from 203.0.113.10 to any port 27015 proto tcp comment "RCON"
ufw default deny incoming
ufw default allow outgoing
ufw --force enable
ufw status verbose

Vervang 203.0.113.10 door uw eigen adres. De volgorde bij het scherpstellen bepaalt of u zichzelf buitensluit. Die staat inclusief terugweg in het artikel UFW-firewall instellen zonder uzelf buiten te sluiten. Mocht het toch gebeuren: bij KVM-rootservers en dedicated servers van KernelHost bereikt u het systeem via de VNC-console in het klantenpaneel, die losstaat van het netwerk van het gastsysteem.

Een woord over databases en aanvullende diensten: Project Zomboid heeft er geen nodig. Wat naast het spel op 0.0.0.0 luistert, stamt uit een eerdere installatie of van een beheerpaneel en hoort ofwel aan 127.0.0.1 gebonden te worden ofwel uitgeschakeld.

3. RCON op poort 27015 uit het internet halen

RCON is de afstandsbediening van de server en loopt bij Project Zomboid op 27015 TCP. In de meegeleverde servertest.ini staat RCONPassword= zonder waarde. Wie RCON gebruikt, zet er een lang willekeurig wachtwoord op, want het protocol verstuurt onversleuteld, en een bereikbare RCON-poort met een zwak wachtwoord geeft de server volledig weg, zonder dat daarvoor ook maar één pakket aanvalsverkeer nodig is.

De veilige weg is om de poort helemaal niet naar buiten open te zetten en hem via een poortdoorschakeling per SSH te bereiken. Daarna praat u lokaal met 127.0.0.1:27015:

ssh -N -L 27015:127.0.0.1:27015 root@UW.SERVER.IP.ADRES

Wie RCON niet nodig heeft, laat het wachtwoordveld leeg en de poort gesloten. Een dienst die niet bereikbaar is, kan niet worden doorgeprobeerd en niet worden overspoeld.

4. Pakketsnelheden per bronadres begrenzen

Tegen kleine aanvallen en slordige bots helpt een bovengrens per bronadres. Omdat beide spelpoorten naast elkaar liggen, volstaat één regel voor het bereik:

iptables -I INPUT -p udp --dport 16261:16262 -m hashlimit --hashlimit-name pz_udp --hashlimit-mode srcip --hashlimit-above 400/sec --hashlimit-burst 600 -j DROP
iptables -L INPUT -n -v

De regel verwerpt UDP-pakketten zodra hetzelfde bronadres blijvend meer dan 400 pakketten per seconde stuurt. De waarde is een startwaarde, geen waarheid: een server met 30 spelers in dezelfde stad produceert duidelijk meer verkeer dan een met vier spelers in verschillende hoeken van de kaart, en wie te krap instelt, gooit zijn eigen spelers eruit. Meet eerst een week lang in normaal bedrijf, daarna zet u de grens op een veelvoud van de piekwaarde.

Twee opmerkingen daarbij. Kale iptables-regels zijn na een herstart verdwenen; onder Debian en Ubuntu bewaart men ze zo:

apt-get install -y iptables-persistent
netfilter-persistent save

En onder UFW horen zulke regels in /etc/ufw/before.rules, omdat ze anders bij de volgende ufw reload verdwijnen. Controleer met de treffertellers uit iptables -L INPUT -n -v of de regel überhaupt wordt bereikt. Blijven de tellers op nul staan, dan staat ze op de verkeerde plek.

5. De verbindingsregistratie ontlasten

Een vaak over het hoofd gezien knelpunt zit in de kernel. De verbindingsregistratie legt ook voor UDP een record aan per bronadres en poort, en een flood met vervalste afzenders vult die tabel in seconden. Loopt ze vol, dan verwerpt de server ook legitieme pakketten, en in het logboek staat "nf_conntrack: table full". Stand en bovengrens toont:

sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max

Het spelverkeer van Project Zomboid heeft geen toestandsregistratie nodig, omdat UDP geen toestand kent. U kunt de beide spelpoorten daarom buiten die tabel houden:

iptables -t raw -I PREROUTING -p udp --dport 16261:16262 -j NOTRACK

Dat ontlast de kernel merkbaar. Belangrijk: de regel past alleen zolang de server de pakketten rechtstreeks krijgt. Wie er een adresomzetting voor heeft staan, bijvoorbeeld in een containeropzet met poortdoorgifte, mag haar niet zetten, omdat de retourrichting dan niet meer wordt toegewezen.

6. Toetreding en plaatsen afschermen

De volgende regels kosten niets en werken tegen alles wat via de reguliere toetredingsweg binnenkomt:

Password=EEN-LANG-WILLEKEURIG-WACHTWOORD
Open=false
MaxAccountsPerUser=1
MaxPlayers=32
DenyLoginOnOverloadedServer=true

Password is het gemeenschappelijke serverwachtwoord en staat los van het account van de afzonderlijke speler. Open=false betekent dat alleen accounts mogen toetreden die een beheerder vooraf heeft aangemaakt, dat is de whitelist van het spel. MaxAccountsPerUser begrenst hoeveel accounts één Steam-gebruiker op uw server mag aanmaken, de standaardwaarde 0 betekent onbeperkt. MaxPlayers staat standaard op 32, en daarboven waarschuwt de documentatie uitdrukkelijk voor slecht nalezen van de kaart en desynchronisatie.

PingLimit is op deze plek de valkuil. De directive gooit spelers eruit vanaf een latentie in milliseconden en staat standaard op 0, dus uit. Onder een aanval stijgt de latentie van uw eigen spelers het eerst, een krappe waarde kickt dus precies de mensen die u wilt houden. Laat die grens uit staan of zet haar ruim.

En één ding moet duidelijk zijn: een whitelist beschermt uw spellogica, niet uw lijn. Een aanvaller die uw server overspoelt, wil helemaal niet meedoen. Zijn pakketten worden geweigerd, maar ze zijn wel aangekomen, en precies daar gaat het om.

7. De mod-vergelijking bij het verbinden is de duurste seconde van uw server

Project Zomboid controleert bij het verbinden meer dan een wachtwoord. De modlijst van de server staat in twee regels van de servertest.ini: WorkshopItems bevat de numerieke Workshop-ID's, Mods de laad-ID's van de mods, beide gescheiden door een puntkomma. Bij het toetreden vergelijkt de client die lijst, laadt ontbrekende Workshop-inhoud automatisch via Steam na en krijgt pas daarna de wereldgegevens gestreamd. Daarnaast vergelijkt de server bij DoLuaChecksum=true de controlesommen van de spelbestanden en gooit clients eruit waarvan de bestanden niet bij de zijne passen.

Voor een aanvaller is juist dat interessant, want het werk valt vóór de eigenlijke spelname aan. Elke verbindingspoging kost de server rekentijd voor versie, controlesom, modlijst en kaartgegevens, ook de poging die uiteindelijk wordt afgewezen. Een lange modlijst maakt elk van die pogingen duurder. Een join-flood is op een sterk gemodificeerde server daarom werkzamer dan op een onveranderde, en hij heeft daarvoor een fractie van de bandbreedte van een volumetrische aanval nodig. Het spel brengt daartegen twee ingebouwde remmen mee:

DenyLoginOnOverloadedServer=true
LoginQueueEnabled=true
LoginQueueConnectTimeout=60

DenyLoginOnOverloadedServer wijst nieuwe aanmeldingen af zolang de server overbelast is, in plaats van de lopende ronde mee te laten sneuvelen. LoginQueueEnabled zet toetreders in een wachtrij in plaats van ze gelijktijdig af te handelen, en LoginQueueConnectTimeout legt vast hoe lang een toetreding mag duren, standaardwaarde 60 seconden, toegestaan zijn 20 tot 1200.

Eén detail hoort erbij, omdat het vaak verkeerd wordt opgelost: op Linux-servers bestaat een gedocumenteerde fout waarbij DoLuaChecksum vals alarm slaat en spelers niet binnenlaat. Beheerders schakelen de controle daarom uit. Dat is navolgbaar, maar verwijdert wel een controle die clients met gewijzigde spelbestanden buiten houdt. Wie haar moet uitschakelen, hoort serverwachtwoord, whitelist en accountgrens des te strenger te zetten.

8. Serverlijst, UPnP en het eigen adres

Hier loont eerlijkheid meer dan wensdenken: uw IP-adres laat zich niet geheimhouden. Public=true toont de server in de browser van het spel, en een server met Steam-koppeling is volgens de documentatie sowieso zichtbaar in de Steam-serverbrowser. Public=false neemt u dus de zichtbaarheid voor nieuwe spelers af zonder u onzichtbaar te maken.

Public=true
PublicName=Mijn Zomboid-server
UPnP=false
server_browser_announced_ip=

UPnP staat standaard op true en laat de server proberen om op een internetgateway zelf een poortopenstelling in te richten. Op een gehuurde server bestaat zo'n gateway niet, de poging loopt in het niets en hoort uitgeschakeld te worden. server_browser_announced_ip blijft leeg, tenzij uw server meerdere adressen heeft en gericht onder een daarvan moet opduiken. Precies dat veld hebt u later weer nodig wanneer u overstapt op een dedicated beschermd IP-adres.

Twee gewoonten helpen meer dan welke instelling ook. Publiceer het kale IP-adres nergens zelf, dus niet in het Discord-kanaal en niet op de projectpagina, en geef uw spelers een hostnaam. De klassieker bij een adreswissel zijn oude DNS-records: een vergeten A-record naar het vorige adres maakt elke wissel zinloos.

9. Meten zolang alles normaal draait

De belangrijkste stap is die welke bijna niemand vooraf zet: een vergelijkingsbasis aanleggen zolang alles rustig is. Zonder normaalwaarde kunt u na een incident niet zeggen of 40.000 pakketten per seconde veel was of gewoon zaterdagavond. Met apt-get install -y vnstat sysstat loopt de meting permanent mee. Tijdens een incident volstaan vier commando's:

sar -n DEV 1 10
ip -s link show eth0
tcpdump -ni eth0 "udp port 16261 or udp port 16262" -c 200 -q
journalctl -u zomboid --since "-15 min" | tail -50

De eerste twee tonen pakketsnelheid en tellers voor verworpen pakketten van de interface, de derde een korte steekproef van het verkeer, de vierde de meldingen van de server, voor zover hij als systemd-dienst draait (naam van de dienst aanpassen). Voor tcpdump geldt: begrens hem altijd met -c, want een opname onder volle belasting belast een toch al overbelaste server nog extra. Hoe u de waarden uitleest, staat in DDoS-aanval op de server herkennen.

Waar deze maatregelen ophouden: bandbreedte en pakketsnelheid

Nu het deel dat geen enkel configuratiebestand kan oplossen. Alle maatregelen tot hier draaien op uw server, dus aan het einde van de lijn. Een firewallregel beslist over een pakket dat al over de kabel is gekomen. U kunt het verwerpen, maar u kunt niet terugdraaien dat het verstuurd is.

Rekent u even mee. Een typische gameserver hangt aan 1 Gbit/s, dat is 125 megabyte per seconde, en de lijn zit vol zodra iemand meer stuurt. De tweede grootheid is de pakketsnelheid, en die slaat vaak eerder toe dan de bandbreedte: bij kleine pakketten van 64 byte passen er in 1 Gbit/s ongeveer 1,49 miljoen pakketten per seconde, terwijl een gewone serverkernel er afhankelijk van CPU en netwerkkaart maar enkele honderdduizenden van verwerkt voordat hij begint te verwerpen. Een aanval die uw lijn nog niet eens voor een derde vult, kan uw server dus platleggen. Beheerders ervaren dat als "de belasting was helemaal niet hoog en toch was alles weg".

Grootheid Waarde
1 Gbit/s in byte 125 megabyte per seconde
Pakketten die er bij 64 byte in 1 Gbit/s passen ongeveer 1,49 miljoen per seconde
Wat een serverkernel daarvan verwerkt enkele honderdduizenden per seconde
Gebruikelijke aanvalsgrootte tegen community-gameservers 5 tot 50 Gbit/s
Bij KernelHost gefilterde UDP-flood op een gameserver meer dan 112,2 Gbit/s
Grootste gedocumenteerde aanval op een KernelHost-server meer dan 473,4 Gbit/s bij meer dan 41,5 miljoen pakketten per seconde

Gebruikelijke aanvallen tegen gameservercommunity's liggen tussen 5 en 50 Gbit/s, dus op het vijf- tot vijftigvoudige van een normale lijn. Daarvoor bestaat geen lokale instelling. Volumetrische aanvallen moeten in het netwerk vóór de server eindigen.

Wat KernelHost tegen DDoS-aanvallen op gameservers zet

De permanente bescherming die op elke server inbegrepen is

De DDoS-bescherming van KernelHost is in twee lagen opgebouwd en permanent actief, zonder dat u iets hoeft in te schakelen, te bestellen of te configureren:

  • Laag 1: 17 Tbps mitigatiecapaciteit in het globale scrubbing-netwerk. Volumetrische aanvallen worden dicht bij hun bron geschoond, nog voordat ze het datacenter bereiken.
  • Laag 2: Arbor realtime filtering met 3,2 Tbps in Frankfurt am Main. Direct vóór de server worden protocolspecifieke patronen herkend en verworpen, pakket voor pakket.

Twee eigenschappen zijn doorslaggevend. De bescherming loopt permanent en hoeft niet eerst op een aanval te reageren, dus er zijn geen eerste minuten waarin de server weg is. En er wordt geen null-routing toegepast: uw IP-adres blijft in het netwerk, alleen de kwaadaardige pakketten worden verworpen. Wie het IP-adres uit het netwerk haalt, bereikt voor u hetzelfde resultaat als de aanvaller. Welke spellen en protocollen gedekt zijn, somt Gameserver-DDoS-bescherming in realtime op.

Advanced DDoS Protection voor permanent beschoten projecten

Sommige projecten worden niet af en toe, maar gericht en wekenlang aangevallen. Daarvoor is er de Advanced DDoS Protection vanaf 50,00 € per maand, PrePaid, zonder minimale looptijd en zonder installatiekosten. Het verschil zit niet in meer capaciteit, maar in de controle:

  • Een dedicated beschermd IP-adres uit het Frankfurtse kernnetwerk, waarnaar uw server binnen ons eigen netwerk wordt omgezet. Aan uw kant is geen aanpassing nodig, het nieuwe adres zet u alleen daar neer waar uw spelers de server vinden.
  • Zelf beheerbare beschermingsregels per poort en protocol in het klantenpaneel: u legt vast wat op 16261 en 16262 UDP is toegestaan, en al het andere blijft dicht, zonder daarvoor een ticket te schrijven.
  • Wijzigingen gelden in realtime, u kunt dus tijdens een lopende aanval bijsturen.
  • Een passend beschermingsprofiel. Voor gangbare spellen bestaan kant-en-klare profielen, voor gemodificeerde en eigen applicaties zet u de regels per poort en protocol zelf. Project Zomboid laat zich daarbij bijzonder nauwkeurig afbakenen, omdat het volledige spelverkeer over twee naast elkaar liggende UDP-poorten loopt.

De twee lagen naast elkaar

Kenmerk Inbegrepen permanente DDoS-bescherming Advanced DDoS Protection
Prijs in elk serverpakket inbegrepen, zonder meerprijs vanaf 50,00 € per maand, PrePaid
Filtercapaciteit 17 Tbps globale scrubbing plus Arbor realtime filtering met 3,2 Tbps in Frankfurt am Main dezelfde filtering in twee lagen
IP-adres het IP-adres van uw server een extra dedicated beschermd IP-adres
Regelset automatische profielen, geen configuratie nodig eigen regels per poort en protocol in het klantenpaneel
Wijzigingen lopen automatisch mee gelden in realtime, ook tijdens een aanval
Null-routing nee nee
Looptijd gekoppeld aan het serverpakket PrePaid, geen minimale looptijd, geen opzegtermijn, geen installatiekosten

Voor de meeste Project-Zomboid-servers volstaat de inbegrepen permanente bescherming samen met een nette configuratie. De Advanced DDoS Protection is het antwoord erop dat iemand het persoonlijk maakt.

Veelgemaakte fouten en oplossingen

"Mijn spelers krijgen de melding dat poort 16262 gesloten is": dat is geen aanval, maar een ontbrekende openstelling. De server heeft beide poorten nodig, 16261 UDP en 16262 UDP, en wel als UDP-regel. Een TCP-openstelling op dezelfde nummers doet niets. Controleer met ufw status verbose en een UDP-scan van buitenaf of er werkelijk twee open staan.

"Ik heb het IP-adres gewisseld en was twee uur later weer offline": de aanvaller haalt het nieuwe adres uit dezelfde bron als het oude, meestal de vermelding in de lijst, een Discord-bot met statusweergave of een oud DNS-record. Bij Project Zomboid kost de wissel bovendien extra: de clients leggen de kaartgegevens lokaal onder adres en poort weg, in een map volgens het patroon 123.45.0.12_16261_... onder Zomboid/Saves. Na een wissel laadt elke speler de verkende kaart opnieuw van de server. Een adreswissel is dus tijdwinst met extra kosten, geen oplossing.

"Mijn iptables-regels grijpen niet": drie oorzaken komen vaak voor. De regels staan achter de UFW-ketens en worden nooit bereikt, ze waren na de laatste herstart verdwenen (dan helpen netfilter-persistent save of een regel in /etc/ufw/before.rules), of de aanval is volumetrisch en de regel werkt correct aan een lijn die al vol zit. Controleer met iptables -L INPUT -n -v of de treffertellers oplopen.

"Spelers vliegen er bij het toetreden uit, maar de server draait gewoon door": dat is bijna altijd de vergelijking, niet een aanval. Oorzaken zijn een versieverschil tussen client en server, een ontbrekende of verouderde Workshop-vermelding of een controlesom die niet past. De client noemt in de regel de mods die niet overeenkomen. Leg WorkshopItems en Mods regel voor regel naast elkaar.

"Om de paar minuten lagpieken, dan loopt het weer": dat is het gebruikelijke patroon van korte aanvallen die alleen zo lang lopen tot de spelers gedesillusioneerd stoppen. Kijk eerst naar de netwerktellers, niet naar de CPU-belasting. Blijven sar -n DEV 1 10 en de tellers voor verworpen pakketten onopvallend, dan was het geen aanval, maar belasting: te veel spelers in dezelfde cel, een dure mod of te weinig werkgeheugen voor de Java-instantie.

"Mijn vorige aanbieder heeft mijn IP-adres geblokkeerd": dat is null-routing. De aanbieder beschermt daarmee zijn eigen netwerk; voor u is het resultaat identiek aan een geslaagde aanval, meestal nog urenlang daarna. Vraag bij twijfel na of er wordt gefilterd of null-geroutet. Dat antwoord bepaalt meer over uw beschikbaarheid dan welke hardwarespecificatie ook.

"In de tcpdump zie ik niets opvallends": wordt het verkeer al in het netwerk ervoor gefilterd, dan komt er op de server zoals verwacht niets aan. Dat is het normale beeld bij een werkende filtering. Omgekeerd geldt: zit de lijn vol, dan bereikt u onder omstandigheden zelfs de SSH-sessie niet meer waarmee u wilde meten. Gebruik dan de VNC-console in het klantenpaneel.

Kort samengevat

  • Een dedicated Project-Zomboid-server heeft precies twee open poorten nodig: 16261 UDP (DefaultPort) en 16262 UDP (UDPPort). Beide staan als gescheiden directives in de servertest.ini.
  • RCON loopt op 27015 TCP en staat standaard zonder wachtwoord ingevuld. Die poort hoort niet op het open internet, maar beperkt tot het eigen adres of gesloten.
  • De mod-vergelijking bij het verbinden is de duurste plek: versie, controlesom, Workshop-lijst en kaartgegevens kosten rekentijd, ook bij elke afgewezen poging. DenyLoginOnOverloadedServer en de wachtrij bij het toetreden zijn daartegen de ingebouwde remmen.
  • Serverwachtwoord, Open=false en MaxAccountsPerUser=1 beschermen de spellogica. Tegen een volle lijn werkt geen van deze instellingen.
  • De natuurkundige grens staat vast: 1 Gbit/s is 125 megabyte per seconde en bij pakketten van 64 byte ongeveer 1,49 miljoen pakketten per seconde. Gebruikelijke aanvallen tegen gameservers liggen bij 5 tot 50 Gbit/s.
  • Volumetrische aanvallen moeten in het netwerk vóór de server eindigen. Bij KernelHost zijn dat 17 Tbps mitigatiecapaciteit in het globale scrubbing-netwerk en een Arbor realtime filtering met 3,2 Tbps in Frankfurt am Main, zonder meerprijs en zonder null-routing.
  • Wie permanent wordt beschoten, stuurt de filtering met de Advanced DDoS Protection zelf: dedicated beschermd IP-adres, regels per poort en protocol, wijzigingen in realtime, vanaf 50,00 € per maand.

Draait uw server al bij KernelHost, dan is de filtering actief zonder dat u iets hoeft te doen. Merkt u toch iets ongewoons, open dan een supportticket, zodat wij de filterregels voor uw IP-adres bijstellen. Bij een lopende aanval bereikt u ons daarnaast via de WhatsApp-noodchat op +43 650 8209883.

Veelgestelde vragen

Mijn Project-Zomboid-server is nu offline. Is dat een DDoS-aanval?
Kijk eerst naar de pakketsnelheid van de interface, niet naar de CPU-belasting. Met sar -n DEV 1 10 ziet u pakketten en bytes per seconde, met ip -s link show eth0 de tellers voor verworpen pakketten. Stijgen de inkomende pakketten ver boven uw normaalwaarde terwijl de server zelf nauwelijks werkt, dan is het een aanval. Blijven de netwerktellers onopvallend en hapert het toch, dan ligt het aan de belasting in het spel: te veel spelers in dezelfde cel, een dure mod of te weinig werkgeheugen voor de Java-instantie.
Welke poorten moet ik voor een Project-Zomboid-server openzetten?
Precies twee: 16261 UDP en 16262 UDP. In de servertest.ini staan ze als DefaultPort=16261 en UDPPort=16262, en dat zijn twee gescheiden instellingen, de tweede poort volgt niet automatisch uit de eerste. Beide moeten als UDP zijn opengesteld, een TCP-regel op dezelfde nummers doet niets. Elke verdere serverinstantie op dezelfde machine heeft een eigen paar vrije UDP-poorten nodig. De RCON-poort 27015 TCP hoort niet op het open internet.
Waarvoor dient poort 16262 en waarom meldt mijn client dat die gesloten is?
16262 UDP is de poort voor de directe verbinding van de clients, 16261 UDP draagt het spelverkeer en beantwoordt de opvragen van de serverbrowser. Staat alleen 16261 open, dan vinden uw spelers de vermelding in de lijst en komen ze toch niet binnen, en de client meldt dat poort 16262 gesloten is. De oorzaak is vrijwel altijd een ontbrekende UDP-openstelling in firewall of router, geen aanval. Controleer beide poorten met een UDP-poortscan van buitenaf.
Heb ik de poorten 8766 en 8767 nodig?
Ze staan als SteamPort1=8766 en SteamPort2=8767 in de servertest.ini en horen bij de Steam-koppeling van de server. De officiële lijst met verplichte poorten noemt uitsluitend 16261 UDP en 16262 UDP. Zet 8766 en 8767 daarom alleen open wanneer uw server zonder hen niet in de Steam-serverlijst verschijnt, en niet uit voorzorg. Elke extra open poort is een verder oppervlak waarop geschoten kan worden, en elke openstelling hoort een reden te hebben die u kunt benoemen.
Is de RCON-poort 27015 bij Project Zomboid een risico?
Ja, zodra die open op het internet staat. RCON is de volledige afstandsbediening van de server, loopt bij Project Zomboid op 27015 TCP en verstuurt onversleuteld. In de meegeleverde servertest.ini staat RCONPassword zonder waarde. Zet er een lang willekeurig wachtwoord op wanneer u RCON gebruikt, en stel de poort uitsluitend voor uw eigen adres open of bereik hem via een poortdoorschakeling per SSH. Wie RCON niet nodig heeft, laat de poort gesloten.
Waarom maakt de mod-vergelijking bij het verbinden de server aanvalbaar?
Omdat het werk aanvalt voordat iemand meespeelt. Bij het toetreden vergelijkt de server de spelversie, de controlesom van de spelbestanden en de modlijst uit WorkshopItems en Mods, de client laadt ontbrekende Workshop-inhoud automatisch na en krijgt pas daarna de kaartgegevens gestreamd. Elke poging kost rekentijd, ook die welke de server uiteindelijk afwijst, en een lange modlijst maakt elke poging duurder. Daartegen werken DenyLoginOnOverloadedServer, de wachtrij bij het toetreden via LoginQueueEnabled en een serverwachtwoord.
Helpt het om nu snel het IP-adres te wisselen?
Maar even, en bij Project Zomboid kost het bovendien extra. De aanvaller vindt het nieuwe adres meestal binnen enkele minuten tot uren terug, omdat het in de vermelding in de serverlijst staat, door een Discord-bot met statusweergave wordt gepubliceerd of omdat er nog een oud DNS-record bestaat. Daar komt een eigenaardigheid van het spel bij: de clients slaan de verkende kaart lokaal op in een map uit IP-adres en poort. Na een wissel laadt elke speler die gegevens opnieuw van de server.
Kan ik mij met UFW of iptables tegen een DDoS-aanval verweren?
Tegen kleine aanvallen en slordige bots wel, tegen volumetrische aanvallen niet. Een firewallregel op de server beslist over pakketten die al over uw lijn zijn gekomen. Zit de lijn vol, dan komen de pakketten van uw spelers al eerder niet meer door, hoe goed uw regelset ook is. Zinvol zijn toch een snelheidsgrens per bronadres op 16261 en 16262 en het ontlasten van de verbindingsregistratie in de kernel. Volumetrische aanvallen moeten in het netwerk vóór de server eindigen.
Vanaf welke aanvalsgrootte redt mijn server het niet meer alleen?
Een typische gameserver hangt aan 1 Gbit/s, wat overeenkomt met 125 megabyte per seconde. Aanvallen tegen gameservercommunity's liggen doorgaans tussen 5 en 50 Gbit/s. Even belangrijk is de pakketsnelheid: in 1 Gbit/s passen bij pakketten van 64 byte ongeveer 1,49 miljoen pakketten per seconde, terwijl een gewone serverkernel er maar enkele honderdduizenden van verwerkt. Een aanval kan uw server dus platleggen hoewel de bandbreedte niet eens is uitgeput.
Gaat mijn server bij KernelHost tijdens een aanval offline?
Nee. Er wordt geen null-routing toegepast. Uw IP-adres blijft in het netwerk, alleen de kwaadaardige pakketten worden verworpen. De bescherming is in twee lagen opgebouwd: 17 Tbps mitigatiecapaciteit in het globale scrubbing-netwerk en een Arbor realtime filtering met 3,2 Tbps in Frankfurt am Main. Ze loopt permanent en hoeft niet eerst op een aanval te reageren, er zijn dus geen eerste minuten waarin uw spelers buiten staan.
Kost de DDoS-bescherming bij KernelHost extra, en wanneer heb ik de Advanced DDoS Protection nodig?
De permanente bescherming in twee lagen zit bij elk serverpakket zonder meerprijs inbegrepen en is vanaf de oplevering actief, u hoeft haar niet te bestellen en niet in te schakelen. De Advanced DDoS Protection hebt u pas nodig wanneer uw project niet af en toe, maar gericht en wekenlang wordt aangevallen en u de filtering zelf wilt sturen. U krijgt een dedicated beschermd IP-adres en beheert de beschermingsregels per poort en protocol zelf in het klantenpaneel, wijzigingen gelden in realtime. De prijs begint bij 50,00 € per maand, PrePaid, zonder minimale looptijd en zonder installatiekosten.

Project Zomboid Project-Zomboid-DDoS-Schutz Gameserver-Schutz Port 16261 Port 16262 servertest.ini RCON Advanced DDoS Protection