Call-of-Duty-server beschermen tegen DDoS-aanvallen

Gepubliceerd op 25 min leestijd

Welke poorten een Call-of-Duty-server werkelijk nodig heeft, waarom spel, query en RCON op dezelfde poort liggen, hoe u getstatus-reflection en RCON-aanvallen afremt, en vanaf welke aanvalsomvang alleen filtering in het netwerk vóór de server nog helpt.

Een Call-of-Duty-server tegen DDoS-aanvallen beschermen is bij de klassieke titels een aangenaam concrete opgave: het gaat om precies één UDP-poort, om een handvol dvars in de server.cfg en om een versterkingsvector die de engine sinds 2003 met zich meedraagt. Een server die 's avonds midden in de ronde alle spelers tegelijk verliest, heeft daarentegen zelden een hardwareprobleem. Meestal loopt er een aanval, en die loopt precies wanneer de server vol zit.

Dit artikel laat eerst zien voor welke titels het überhaupt geldt, daarna wat u zonder extra kosten zelf kunt afschermen, vervolgens waar die maatregelen technisch ophouden, en tot slot wat er dan in het netwerk vóór de server moet gebeuren. De commando's zijn voor Debian 12, Debian 13, Ubuntu 22.04 LTS en Ubuntu 24.04 LTS geschreven en gaan uit van root, als gewone gebruiker zet u er sudo voor.

Loopt de aanval op dit moment: verander nu niets aan de server.cfg en start de server niet opnieuw op. Leg eerst de meetwaarden vast (zie de paragraaf "Vastleggen"), na de aanval zijn ze verdwenen.

Voor welke Call-of-Duty-titels u een server tegen DDoS kunt beschermen

Een Call-of-Duty-server tegen DDoS beschermen kunt u alleen bij de titels die eigen dedicated servers toelaten. Dat zijn de originele uitgaven van Call of Duty (2003), Call of Duty United Offensive, Call of Duty 2, Call of Duty 4 Modern Warfare en Call of Duty World at War, plus de communityplatformen Plutonium (World at War, Black Ops, Black Ops II, Modern Warfare 3), IW4x (Modern Warfare 2) en CoD4X (Call of Duty 4). Al deze titels brengen hetzelfde patroon mee: een server.cfg, een open UDP-poort en een vermelding in een openbare serverlijst.

Voor de moderne delen geldt dit artikel uitdrukkelijk niet. Warzone, Modern Warfare (2019), Black Ops Cold War, Vanguard, Modern Warfare II, Modern Warfare III en Black Ops 6 kennen geen huurbare dedicated servers: de partijen lopen op de matchmaking-infrastructuur van Activision, er is geen server.cfg, geen serverbrowser en geen poort die u zou kunnen vrijgeven of afschermen. De poortlijsten die Activision voor deze titels publiceert (onder meer TCP 3074 en 27014 tot 27050 en UDP 3074, 3478 en 27000 tot 27031) beschrijven client- en platformpoorten, geen serverpoorten. Wie in Warzone verbindingsonderbrekingen heeft, heeft een probleem op de eigen lijn of een probleem bij Activision, maar geen probleem dat een gehuurde server zou oplossen.

Waarom juist Call-of-Duty-servers worden aangevallen

Call-of-Duty-servers verenigen vier eigenschappen die ze tot een gemakkelijk doelwit maken. Ten eerste publiceert elke vermelde server zijn adres uit zichzelf: de vermelding in de serverlijst bevat IP-adres en poort leesbaar, anders zou niemand hem kunnen betreden. Ten tweede loopt al het verkeer over UDP, en UDP kent geen verbindingsopbouw die u zou kunnen eisen, afzenderadressen laten zich vervalsen. Ten derde beantwoordt de engine statusopvragingen van iedereen, zonder dat iemand het spel hoeft te starten. Ten vierde ligt de afstandsbediening RCON op dezelfde poort als het spel zelf.

Daar komt het sociale deel bij: verbannen spelers, concurrentie tussen clans, ruzie in een community die elkaar al jaren kent. Een aanval kost de veroorzaker kunde noch noemenswaardig geld, zogeheten booters en stressers worden als abonnement voor een paar euro per maand verkocht, en versterkingsaanvallen via gameservers horen daar tot het standaardaanbod. Wat een DDoS-aanval in detail is, legt het artikel Wat is een DDoS-aanval? uit.

De poorten waar het werkelijk om gaat

Een klassieke Call-of-Duty-server bezet precies één UDP-poort, namelijk 28960. Op die ene poort lopen drie dingen tegelijk: het spelverkeer, de statusopvragingen van de serverlijst en de afstandsbediening RCON. Een eigen querypoort en een eigen RCON-poort bestaan niet. De startregel van een dedicated server ziet er bij alle titels hetzelfde uit, alleen de naam van het uitvoerbare bestand verschilt:

+set dedicated 2 +set net_ip 0.0.0.0 +set net_port 28960 +set sv_maxclients 32 +exec server.cfg +map_rotate
Titel of platform Dienst Poort Protocol
Call of Duty, United Offensive, Call of Duty 2, Call of Duty 4, World at War Spel, query en RCON samen 28960 UDP
Verdere instanties op dezelfde machine Spel, query en RCON samen 28961 tot 28970 UDP
Plutonium T4 (World at War) Spel, query en RCON samen 28960 UDP
Plutonium T5 (Black Ops) Spel, query en RCON samen 28960 UDP
Plutonium T6 (Black Ops II) Spel, query en RCON samen 4976 UDP
Plutonium IW5 (Modern Warfare 3) Spel, query en RCON samen 27016 UDP
IW4x (Modern Warfare 2) Spel, query en RCON samen 28960 UDP
t7x (Black Ops III) Spel, query en RCON samen 27017 UDP
Masterserver Call of Duty 4 (uitgaand) Lijst en autorisatie 20810 en 20800 UDP
Masterserver Call of Duty 2 (uitgaand) Lijst en autorisatie 20710 en 20700 UDP
Masterserver Call of Duty 1 (uitgaand) Lijst en autorisatie 20510 en 20500 UDP
IW4MAdmin Webinterface voor het beheer 1624 TCP
SSH Servertoegang 22 TCP

De masterserverpoorten horen niet in uw firewallvrijgaven. 20810 en 20800 zijn doelpoorten aan de andere kant, geen luisterpoorten op uw machine: uw server spreekt de lijst uit zichzelf aan. Veel handleidingen voor poortvrijgave raden toch aan om ze inkomend te openen. Dat vergroot het aanvalsoppervlak zonder enige tegenwaarde.

Gangbare ordes van grootte bij Call of Duty

De tweede tabel is de belangrijkste wanneer u wilt inschatten of u het nog zelf in de hand kunt houden. Zij zet de normale belasting van een volle server tegenover de getallen waar het bij een aanval om gaat.

Kengetal Waarde
Uitgaande snelheid per speler (gangbare waarde sv_maxRate) 25.000 byte per seconde
Uitgaande belasting bij 32 bezette slots ongeveer 800 kilobyte per seconde, dus zo'n 6,4 Mbit/s
Lijn van een typische gameserver 1 Gbit/s, komt overeen met 125 megabyte per seconde
Pakketsnelheid op 1 Gbit/s bij pakketten van 64 byte ongeveer 1,49 miljoen pakketten per seconde
Grootte van een getstatus-aanvraag op de lijn 41 byte (20 byte IP-kop, 8 byte UDP-kop, 13 byte nuttige lading)
Versterkingsfactor van het Quake-netwerkprotocol volgens CISA-waarschuwing TA14-017A 63,9
Antwoord op een getstatus-aanvraag, daaruit berekend ongeveer 2.600 byte
Ingebouwde bovengrens van CoD4X voor getstatus 20 antwoorden per 20 seconden
Ingebouwde bovengrens van CoD4X voor getinfo 100 antwoorden per 100 seconden
Bij KernelHost gefilterde UDP-flood tegen een gameserver meer dan 112,2 Gbit/s
Bij KernelHost gefilterde aanval tegen een voiceserver meer dan 473,4 Gbit/s bij meer dan 41,5 miljoen pakketten per seconde

Waarom spel, query en RCON op dezelfde poort liggen

Dat is de voor Call of Duty doorslaggevende bijzonderheid. De id-Tech-3-engine waarop alle klassieke Call-of-Duty-titels zijn gebouwd, kent geen gescheiden poorten voor spel, opvraging en afstandsbediening. Alles loopt via zogeheten verbindingsloze pakketten op die ene UDP-poort. Een verbindingsloos pakket is een UDP-pakket dat met vier bytes 0xFF begint en daarna de naam van het commando leesbaar draagt: getstatus, getinfo, getchallenge, connect of rcon.

Het praktische gevolg is onhandig: u kunt RCON niet per firewall van het spel scheiden zonder het spel mee af te sluiten. Een regel op poort 28960 raakt altijd alles. Wie queryfloods en RCON-aanvallen gericht wil uitsorteren, moet in de inhoud van het pakket kijken en niet alleen naar het poortnummer. Precies daarom lopen poortgebaseerde firewallregels bij Call of Duty eerder tegen hun grens aan dan bij spellen met een gescheiden querypoort.

Wat is de getstatus-reflection bij Call of Duty?

De getstatus-reflection is een versterkingsaanval waarbij een aanvaller kleine statusopvragingen met een vervalst afzenderadres naar veel gameservers stuurt, zodat hun duidelijk grotere antwoorden bij het eigenlijke slachtoffer terechtkomen. De gameservers zijn daarbij niet het doelwit, maar de versterker. Deze vector is voor de id-Tech-3-engine al meer dan tien jaar gedocumenteerd en treft Call of Duty net zo goed als Quake 3 en de overige afgeleiden daarvan.

Het raakt u dubbel, vanuit twee richtingen. Als aangevallene krijgt u een vloed aan getstatus-aanvragen die rekentijd en uitgaande bandbreedte verbruikt, en uw spelers merken dat als lagspikes. Als onvrijwillige versterker verstuurt u antwoorden naar een onbekend slachtoffer, en de abuse-melding komt bij u terecht. Beide gebeuren op dezelfde poort, met dezelfde pakketten, en beide zien er in de belastingsgrafiek aanvankelijk onschuldig uit.

Hoe een getstatus-pakket eruitziet

De aanvraag bestaat uit vier bytes 0xFF en het woord getstatus, samen 13 byte nuttige lading. Met IP- en UDP-kop zijn dat 41 byte op de lijn. Precies daarop mikt de lengtecontrole in de firewallregels die in Call-of-Duty-forums al jaren worden doorgegeven:

iptables -A INPUT -p udp -m length --length 41:45 -m recent --set --name getstatus_cod
iptables -A INPUT -p udp -m string --algo bm --string "getstatus" -m recent --update --seconds 1 --hitcount 20 --name getstatus_cod -j DROP

Het antwoord is onvergelijkbaar groter. Een statusResponse bevat de volledige serverconfiguratie als tekenreeks plus een regel per verbonden speler, bij een volle server dus meerdere kilobytes. De CISA voert het Quake-netwerkprotocol in haar overzicht van UDP-versterkingsaanvallen (TA14-017A) met een versterkingsfactor van 63,9 en benoemt als misbruikt commando uitdrukkelijk de uitwisseling van serverinformatie. Uit 1 Mbit/s aan vervalste aanvragen wordt daarmee ongeveer 64 Mbit/s bij het slachtoffer. Ter vergelijking: DNS ligt in hetzelfde overzicht op 28 tot 54, NTP op 556,9.

De ingebouwde rem: sv_queryIgnoreTime en sv_queryIgnoreMegs

Call of Duty 4 heeft sinds serverversie 1.7 een ingebouwde queryrem. Die onthoudt elk adres dat een statusopvraging heeft gestuurd, en negeert verdere opvragingen van datzelfde adres gedurende een instelbare tijd. Vier dvars sturen dat aan, met deze standaardwaarden:

sv_queryIgnoreMegs        1
sv_queryIgnoreTime        2000
sv_queryBounceIgnoreTime  12000
sv_queryIgnoreDebug       0

sv_queryIgnoreMegs bepaalt hoeveel werkgeheugen de negeerlijst mag bezetten. 1 megabyte bevat ongeveer 65.000 adressen, elke verdere megabyte zo'n 87.000 extra. De waarde 0 schakelt de rem volledig uit, en precies dat is op veel servers het geval, omdat de configuratie uit een oud voorbeeldbestand stamt. sv_queryIgnoreTime is de blokkeertijd in milliseconden. sv_queryBounceIgnoreTime grijpt in wanneer een antwoord met "ICMP Port Unreachable" terugkomt, dus precies wanneer uw server op dat moment als versterker tegen een onbekend slachtoffer wordt misbruikt. sv_queryIgnoreDebug 1 schrijft de treffers naar het logboek, zodat u überhaupt ziet of er iets gebeurt.

Wie CoD4X inzet, heeft daarnaast vaste bovengrenzen in de servercode: hoogstens 20 getstatus-antwoorden per 20 seconden, hoogstens 100 getinfo-antwoorden per 100 seconden en hoogstens één RCON-foutmelding per 100 milliseconden. De opmerking in de broncode benoemt de bedoeling helder: de server mag zich gerust laten overspoelen, maar hij mag daarbij geen uitgaande bandbreedte verspillen. Dat is de juiste prioriteitstelling, maar het vervangt geen filtering vóór de server.

Waarom RCON bij Call of Duty historisch een probleem is

RCON is de afstandsbediening van de server, en bij Call of Duty is dat een onversleuteld UDP-pakket op de spelpoort. Een RCON-commando ziet er op de lijn zo uit: vier bytes 0xFF, dan het woord rcon, dan het wachtwoord leesbaar, dan het eigenlijke commando. Er is geen versleuteling, geen sessie, geen gebruikersaccount en geen tweede factor. Daaruit volgen drie problemen, die alle drie reëel zijn:

  • Meelezen. Wie het verkeer ergens onderweg ziet, leest uw RCON-wachtwoord leesbaar mee. Dat geldt voor elk netwerk tussen u en de server en voor elk stuk gereedschap waaraan u het wachtwoord geeft.
  • Raden. Er is geen aanmelding die geblokkeerd kan worden en geen accountblokkering na tien mislukte pogingen. Een aanvaller probeert wachtwoorden in willekeurig tempo door. De originele server remt dat helemaal niet af, CoD4X remt uitsluitend het antwoord af tot één foutmelding per 100 milliseconden en legt de poging vast als "Bad rcon".
  • Reflection. Ook een RCON-foutmelding is een antwoord op een vervalst pakket. Wie uw server met vervalste RCON-pakketten bestookt, gebruikt hem als kleine versterker, en uw server schrijft er ondertussen het logboek mee vol.

De praktische consequentie: stel rcon_password alleen in wanneer u RCON werkelijk nodig hebt. Zo ja, dan lang en willekeurig. CoD4X eist minstens acht tekens, dat is een ondergrens en geen aanbeveling. Beheer uw server in het dagelijks gebruik via SSH en de serverconsole in plaats van via RCON uit het open internet. En draait u een beheergereedschap zoals IW4MAdmin, dat zelf via RCON praat, dan hoort de webinterface daarvan op poort 1624 niet op het open internet.

Wat u zelf kunt doen voordat u geld uitgeeft

Dit hoofdstuk is het langste, en dat met opzet. Een netjes geconfigureerde Call-of-Duty-server houdt kleine en middelgrote aanvallen op eigen kracht uit, ongeacht bij wie hij staat.

1. Inventarisatie: wat luistert er eigenlijk?

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:28960 en [::]:28960 betekenen "vanaf het hele internet bereikbaar", 127.0.0.1:3306 betekent "alleen lokaal" en heeft geen firewallregel nodig. Naast het spel duiken daar vaak IW4MAdmin, een webserver voor de fast download, een database voor statistieken en een vergeten tweede spelinstantie op. Het beeld van de aanvaller levert een poortscan van buitenaf:

nmap -Pn -sU -p 28960-28970,4976,27016 UW.SERVER.IP.ADRES
nmap -Pn -p- --min-rate 1000 UW.SERVER.IP.ADRES

2. Alleen openlaten wat het spel echt nodig heeft

Voor een enkele Call-of-Duty-server volstaat één openstelling naar buiten, 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 28960/udp comment 'Call of Duty'
ufw allow from 203.0.113.10 to any port 1624 proto tcp comment 'IW4MAdmin'
ufw default deny incoming
ufw default allow outgoing
ufw --force enable
ufw status verbose

Vervang 203.0.113.10 door uw eigen adres. Bij Plutonium T6 komt 4976/udp in de plaats van 28960/udp, bij Plutonium IW5 is het 27016/udp. Draait u meerdere instanties, geef dan uitsluitend het werkelijk gebruikte bereik vrij, dus bijvoorbeeld 28960:28962/udp en niet zonder meer 28960 tot 28970. Elke poort waarop niets luistert is weliswaar geen toegangsweg, maar kost de kernel bij een aanval toch werk. De volledige handleiding inclusief reddingsweg vindt u onder UFW-firewall instellen zonder uzelf buiten te sluiten.

3. De queryrem in de server.cfg inschakelen

Deze vier regels horen in elke server.cfg van een Call-of-Duty-4-server en kosten niets behalve een paar megabyte werkgeheugen:

set sv_queryIgnoreMegs "4"
set sv_queryIgnoreTime "2000"
set sv_queryBounceIgnoreTime "12000"
set sv_queryIgnoreDebug "0"

4 megabyte bevat ongeveer 326.000 adressen, dat is ook voor een serieuze flood genoeg. Verhoog sv_queryIgnoreTime slechts voorzichtig boven de standaardwaarde van 2000 milliseconden: de serverlijst en elke serverbrowser vragen uw server via hetzelfde mechanisme op, en wie de blokkeertijd te hoog zet, verdwijnt uit de lijst. Zet sv_queryIgnoreDebug tijdelijk op 1 wanneer u wilt weten of de rem überhaupt aangrijpt, en daarna weer op 0, zodat het logboek uw schijf niet volschrijft.

4. Queryfloods in de firewall uitsorteren

De rem in de engine werkt pas nadat het pakket het spelproces heeft bereikt. Een firewallregel beslist eerder en kost minder. Deze twee regels begrenzen getstatus per bronadres:

iptables -A INPUT -p udp --dport 28960 -m length --length 41:45 -m recent --set --name cod_query --rsource
iptables -A INPUT -p udp --dport 28960 -m string --algo bm --string "getstatus" -m recent --update --seconds 2 --hitcount 4 --name cod_query --rsource -j DROP

De eerste regel onthoudt elk bronadres dat een pakket in de typische lengte van een statusopvraging stuurt. De tweede verwerpt elke verdere getstatus-aanvraag zodra hetzelfde adres er binnen twee seconden meer dan vier heeft gestuurd. Vier aanvragen per twee seconden zijn voor elke serverbrowser voldoende. In forums circuleren ook varianten met 20 aanvragen per seconde, die duidelijk ruimhartiger zijn en eerder tegen grove bots werken dan tegen een nette reflectiegolf.

Kale iptables-regels zijn na een herstart verdwenen, onder Debian en Ubuntu bewaart u ze zo:

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

Onder UFW horen zulke regels in /etc/ufw/before.rules, omdat ze anders bij de volgende ufw reload verdwijnen. Controleer daarna met iptables -L INPUT -n -v of de tellers oplopen. Blijven ze op nul staan, dan wordt de regel niet bereikt.

5. RCON uitschakelen of strak houden

De veiligste RCON-toegang is die welke er niet is. Een leeg rcon_password wijst elk RCON-pakket af:

set rcon_password ""

Let daarbij op een subtiliteit: de server antwoordt ook dan nog, namelijk met een foutmelding, en blijft daarmee een kleine versterker. Wie dat wil uitsluiten en RCON sowieso alleen vanaf een vast adres nodig heeft, verwerpt de pakketten eerder:

iptables -A INPUT -p udp --dport 28960 ! -s 203.0.113.10 -m string --algo bm --string "rcon " -j DROP

Deze regel heeft een neveneffect dat u moet kennen: de tekenreeks rcon kan theoretisch ook in een chatpakket van een verbonden speler opduiken, dat pakket zou dan eveneens worden verworpen. In de praktijk is dat te overzien. Wie het neveneffect niet wil, laat de regel weg en werkt alleen met een leeg of zeer lang wachtwoord.

6. Joinflood en slotuitputting afweren

Een joinflood mikt niet op de lijn, maar op de spellogica: de aanvaller stuurt in snelle opeenvolging getchallenge- en connect-pakketten, totdat alle slots met halfafgemaakte verbindingen bezet zijn. Echte spelers krijgen dan "Server is full", hoewel er in het spel niemand staat. Daartegen werken deze instellingen:

set sv_maxclients "32"
set sv_reconnectLimit "3"
set sv_floodProtect "1"
set sv_connectTimeout "30"
set sv_timeout "120"

sv_reconnectLimit begrenst hoe vaak dezelfde speler zich achter elkaar opnieuw mag verbinden. sv_floodProtect begrenst hoeveel clientcommando's de server per speler verwerkt en voorkomt daarmee dat een enkele client de server met commando's afremt. sv_connectTimeout en sv_timeout bepalen hoe lang een halfafgemaakte respectievelijk een stille verbinding een slot blokkeert: wie hier ruime waarden uit een oud voorbeeldbestand laat staan, maakt de aanvaller de slotuitputting gemakkelijk.

Op CoD4X komt sv_authorizemode daarbij. De waarde 1 laat alleen spelers met een geldige kopie binnen, 0 alleen spelers zonder, en -1 beide. Wie 1 instelt, sluit een groot deel van de wegwerpclients buiten, maar verliest ook echte spelers zonder originele kopie. Het hardste middel is een serverwachtwoord via g_password, dat werkt tegen alles wat de reguliere weg naar binnen gebruikt. En één ding moet duidelijk zijn: een wachtwoord 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 vermelding in de serverlijst en uw eigen adres

Hier loont eerlijkheid meer dan wensdenken: uw IP-adres laat zich niet geheimhouden. Iedere speler die ooit verbonden is geweest, kent het, en de vermelding in de lijst publiceert het sowieso, inclusief poort. U kunt die vermelding uitschakelen door in de server.cfg geen masterserver te zetten (de dvars heten sv_master1, sv_master2 enzovoort). Dat kost echter alle zichtbaarheid voor nieuwe spelers en helpt alleen tegen de meest gemakzuchtige aanvaller.

Een opmerking over de plaats van de lijsten: de oorspronkelijke masterservers van Activision (codmaster.activision.com op 20510, cod2master.activision.com op 20710, cod4master.activision.com op 20810) beantwoorden voor de oude titels niets meer. Wie vandaag vermeld wil staan, gebruikt de communitylijsten: CoD4X draait een eigen lijst en verlangt daarvoor een token in sv_authtoken, Plutonium brengt een eigen serverlijst mee. Aan de zaak zelf verandert dat niets, het adres staat daar net zo goed leesbaar in.

Twee gewoonten werken desondanks. Publiceer het kale IP-adres nergens zelf, dus niet in het Discord-kanaal en niet op de clanpagina. En laat uw spelers via een hostnaam verbinden, zodat u in geval van nood het adres kunt wisselen zonder dat alle verwijzingen breken. De klassieker daarbij is een vergeten A-record naar het oude adres: dat maakt elke wissel zinloos.

8. Webinterfaces, database en fast download van het open internet afhalen

Naast het spel draait er op de meeste Call-of-Duty-servers nog meer: IW4MAdmin met zijn webinterface op poort 1624, een webserver voor de fast download van de kaarten, soms een database voor statistieken. Elk van deze diensten is een eigen aanvalsoppervlak, en geen daarvan hoort onbeperkt op het open internet.

Beperk 1624 tot uw eigen adres of bereik de interface via een SSH-tunnel, daarna opent u lokaal http://127.0.0.1:1624:

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

De database bindt u aan 127.0.0.1, die heeft op het open internet in geen geval iets te zoeken. En leg de fast download op een eigen webserver in plaats van in het spelproces: een webserver onder belasting neemt het spel anders precies de rekentijd af die het voor de simulatie nodig heeft.

9. Vastleggen, zodat u in geval van nood cijfers hebt

De belangrijkste stap is die welke bijna niemand vooraf zet: een vergelijkingsbasis aanleggen zolang alles normaal draait. Zonder normaalwaarde kunt u na een incident niet zeggen of 40.000 pakketten per seconde veel was of gewoon vrijdagavond. 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
dmesg -T | tail -50
tcpdump -ni eth0 udp port 28960 -c 200 -q

Voor Call of Duty is er een vijfde, die de beslissende vraag beantwoordt. Deze opname toont uitsluitend de verbindingsloze pakketten, dus precies getstatus, getinfo, getchallenge, connect en rcon:

tcpdump -ni eth0 'udp port 28960 and udp[8:4] = 0xffffffff' -c 200 -A

Staat daar honderd keer getstatus uit steeds nieuwe adressen, dan hebt u een queryflood. Staat daar rcon, dan probeert iemand uw wachtwoord te raden. Staat daar alleen getchallenge en connect, dan is het een joinflood. Voor tcpdump geldt altijd: begrens hem 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 herkennen.

Waar deze maatregelen ophouden

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 volle server met 32 slots produceert uitgaand ongeveer 6,4 Mbit/s, dat is minder dan één procent van een gigabitlijn. Diezelfde lijn zit vol zodra iemand 125 megabyte per seconde stuurt, en precies daarop zijn de aanvallen berekend die u voor tien euro per maand kunt bestellen. Of uw iptables-regel daarachter goed is, doet dan niet meer ter zake, want de pakketten van uw spelers komen al eerder niet door.

De tweede grootheid is de pakketsnelheid, en die slaat bij Call of Duty regelmatig eerder toe dan de bandbreedte. Bij kleine pakketten van 64 byte passen er in een lijn van 1 Gbit/s ongeveer 1,49 miljoen pakketten per seconde. Een gewone serverkernel verwerkt daarvan, afhankelijk van CPU en netwerkkaart, enkele honderdduizenden voordat hij begint te verwerpen. Een getstatus-aanvraag is met 41 byte nog kleiner dan dat: een aanval die uw lijn niet eens voor een derde vult, legt uw server toch plat, omdat de volledige rekentijd opgaat aan het verwerpen. Beheerders ervaren dat als "de belasting was helemaal niet hoog en toch was alles weg".

Bij Call of Duty komt er een bijzonderheid bij die de rekensom verscherpt. Omdat spel, query en RCON op dezelfde poort liggen, kunt u 28960 niet in geval van nood dichtzetten: dat zou hetzelfde zijn als de server uitschakelen. En omdat de engine op elke statusopvraging met een veelvoud van de aanvraaggrootte antwoordt, verbruikt een aanvaller voor hetzelfde effect minder eigen bandbreedte dan bij andere spellen.

Ter oriëntatie, welke ordes van grootte werkelijk voorkomen: op KernelHost-servers zijn onder meer een aanval met meer dan 473,4 Gbit/s bij meer dan 41,5 miljoen pakketten per seconde op een voiceserver en een UDP-flood met meer dan 112,2 Gbit/s op een gameserver weggefilterd. Daarvoor bestaat geen lokale instelling. Volumetrische aanvallen moeten in het netwerk vóór de server eindigen.

Wat KernelHost daartegenover zet

De permanente bescherming die bij 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, er zijn dus 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 games en protocollen gedekt zijn, somt Gameserver-DDoS-bescherming in realtime op.

Advanced DDoS Protection voor projecten die permanent onder vuur liggen

Sommige clans en communities worden niet af en toe, maar gericht en wekenlang aangevallen. Daarvoor is er de Advanced DDoS Protection vanaf 50,00 € per maand, PrePaid en zonder minimale looptijd. 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 enkele aanpassing nodig.
  • Zelf beheerbare beschermingsregels per poort en protocol in het klantenpaneel: u stelt in wat op 28960 UDP is toegestaan, zonder daarvoor een ticket te schrijven, en bij meerdere instanties per poort gescheiden.
  • Wijzigingen gelden in realtime, u kunt dus tijdens een lopende aanval bijsturen.
  • Een beschermingsprofiel dat bij het betreffende spel past, ook voor aangepaste en eigen applicaties op willekeurige TCP- of UDP-poorten. Dat is voor Plutonium en CoD4X het relevante punt, omdat hun poorten van de standaardwaarden kunnen afwijken.

De Advanced DDoS Protection is bedoeld voor servers die bij KernelHost staan. Draait uw Call-of-Duty-server op dit moment ergens anders en wordt hij daar regelmatig uit het netwerk gehaald, dan is de verhuizing naar KernelHost de weg die iets verandert.

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
Spelprofiel geoptimaliseerde profielen voor gangbare games profiel passend bij het spel, ook voor Plutonium, CoD4X en eigen poorten
Null-routing nee nee
Looptijd gekoppeld aan het serverpakket PrePaid, geen minimale looptijd, geen opzegtermijn, geen installatiekosten

Voor de meeste Call-of-Duty-servers volstaat de inbegrepen permanente bescherming samen met een nette server.cfg. De Advanced DDoS Protection is het antwoord op iemand die het persoonlijk maakt.

Veelgemaakte fouten en oplossingen

"Ik heb het IP-adres gewisseld en was twee uur later weer offline": de aanvaller heeft 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. Een adreswissel levert tijd op, geen oplossing.

"Mijn aanbieder stuurt mij een abuse-melding, terwijl ik toch het slachtoffer ben": dan is uw server niet het doelwit, maar de versterker. Iemand stuurt vervalste getstatus-aanvragen, en uw server antwoordt braaf aan een onbekend slachtoffer. Controleer eerst of sv_queryIgnoreMegs op 0 staat, en stel de vier query-dvars plus de firewallregel uit paragraaf 4 in.

"De server staat in de lijst als vol, maar is leeg": dat is een joinflood, en die raakt de spellogica, niet de lijn. Daartegen werken sv_reconnectLimit, kortere waarden voor sv_connectTimeout en sv_timeout en bij twijfel een serverwachtwoord.

"De server verdwijnt tijdens de aanval uit de serverlijst": dat is het gevolg, niet de oorzaak. De serverlijst controleert via dezelfde statusopvragingen of uw server leeft. Komen de antwoorden niet door of zijn ze door uw eigen rem verworpen, dan geldt de server als offline. Controleer of sv_queryIgnoreTime te hoog staat voordat u de firewall verdenkt.

"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 tellers oplopen.

"De server draait, maar alle spelers hebben lagspikes": kijk eerst naar de pakketsnelheid van de interface, niet naar de CPU-belasting. Blijft sar -n DEV 1 10 onopvallend en hapert het toch, dan ligt het meestal aan een mod, aan een overdreven sv_maxRate of simpelweg aan te veel bots in de ronde.

"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, die losstaat van het netwerk van het gastsysteem.

Kort samengevat

  • Een klassieke Call-of-Duty-server heeft precies één open poort nodig: 28960 UDP. Bij Plutonium T6 is dat 4976 UDP, bij Plutonium IW5 27016 UDP.
  • Spel, statusopvraging en RCON liggen bij Call of Duty op dezelfde poort. U kunt RCON niet met een poortregel van het spel scheiden, daarvoor hebt u een regel nodig die in de inhoud van het pakket kijkt.
  • De getstatus-reflection is de spelspecifieke versterkingsvector: 41 byte aanvraag, volgens CISA-waarschuwing TA14-017A factor 63,9 bij het Quake-netwerkprotocol, dus ongeveer 2.600 byte antwoord.
  • Schakel de queryrem in: sv_queryIgnoreMegs 4, sv_queryIgnoreTime 2000, sv_queryBounceIgnoreTime 12000. Op veel servers staat zij op 0 en is daarmee uit.
  • Stel rcon_password alleen in wanneer u RCON werkelijk nodig hebt: het wachtwoord loopt onversleuteld over UDP en laat zich zonder accountblokkering onbeperkt vaak raden.
  • De masterserverpoorten 20810 en 20800 zijn uitgaande doelpoorten en horen niet in uw inkomende vrijgaven.
  • Vanaf ongeveer 1 Gbit/s of enkele honderdduizenden pakketten per seconde beslist uitsluitend het netwerk vóór de server, niet meer uw configuratie.

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

Welke poorten heeft een Call-of-Duty-server nodig?
Een klassieke Call-of-Duty-server heeft precies één open poort nodig: 28960 UDP. Op die ene poort lopen spelverkeer, statusopvragingen en de afstandsbediening RCON samen, een eigen querypoort of RCON-poort bestaat niet. Bij de Plutonium-platformen wijken de standaardwaarden af: World at War en Black Ops gebruiken eveneens 28960 UDP, Black Ops II gebruikt 4976 UDP en Modern Warfare 3 gebruikt 27016 UDP. De masterserverpoorten 20810 en 20800 zijn uitgaande doelpoorten en hoeven inkomend niet te worden geopend.
Geldt dit artikel ook voor Warzone, Modern Warfare of Black Ops 6?
Nee. Warzone, Modern Warfare (2019), Black Ops Cold War, Vanguard, Modern Warfare II, Modern Warfare III en Black Ops 6 kennen geen huurbare dedicated servers. De partijen lopen op de matchmaking-infrastructuur van Activision, er is geen server.cfg, geen serverbrowser en geen poort die u zou kunnen vrijgeven of afschermen. Eigen servers en daarmee eigen DDoS-bescherming zijn alleen mogelijk bij de klassieke titels: Call of Duty, United Offensive, Call of Duty 2, Call of Duty 4 en World at War, plus de communityplatformen Plutonium, IW4x en CoD4X.
Wat is de getstatus-reflection bij Call of Duty?
De getstatus-reflection is een versterkingsaanval waarbij kleine statusopvragingen met een vervalst afzenderadres naar veel gameservers gaan, zodat hun grote antwoorden bij het eigenlijke slachtoffer terechtkomen. Een getstatus-aanvraag is 41 byte groot, het antwoord bevat de volledige serverconfiguratie plus een regel per verbonden speler. De CISA voert het Quake-netwerkprotocol in haar waarschuwing TA14-017A met een versterkingsfactor van 63,9, dat komt overeen met ongeveer 2.600 byte antwoord per aanvraag. Getroffen is de id-Tech-3-engine waarop alle klassieke Call-of-Duty-titels zijn gebouwd.
Mijn server wordt als versterker voor aanvallen op derden misbruikt. Wat kan ik doen?
Schakel eerst de ingebouwde queryrem in. In de server.cfg zet u sv_queryIgnoreMegs op 4, sv_queryIgnoreTime op 2000 en sv_queryBounceIgnoreTime op 12000. Staat sv_queryIgnoreMegs op 0, dan is de rem volledig uitgeschakeld, en precies dat is op veel servers het geval. Vul dat aan met een firewallregel die getstatus per bronadres tot enkele aanvragen in twee seconden begrenst. Met sv_queryIgnoreDebug 1 ziet u in het logboek of de rem aangrijpt, daarna zet u de waarde weer op 0.
Waarom is rcon_password bij Call of Duty een risico?
Omdat RCON bij Call of Duty een onversleuteld UDP-pakket op de spelpoort is. Het commando bestaat uit vier bytes 0xFF, het woord rcon, het wachtwoord in leesbare vorm en het eigenlijke commando. Er is geen versleuteling, geen sessie, geen gebruikersaccount en geen blokkade na mislukte pogingen: wie het verkeer ergens onderweg ziet, leest het wachtwoord mee, en wie het niet ziet, kan het onbeperkt vaak raden. Stel rcon_password alleen in wanneer u RCON werkelijk nodig hebt, laat het anders leeg en beheer uw server via SSH.
Mijn Call-of-Duty-server is nu offline. Waaraan herken ik een DDoS-aanval?
Kijk 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 de normaalwaarde terwijl de server zelf nauwelijks werkt, dan is het een aanval. Welk soort het is, verraadt een opname van de verbindingsloze pakketten met tcpdump en het filter udp port 28960 and udp[8:4] = 0xffffffff. Staat daar veelvuldig getstatus, dan is het een queryflood.
Kan ik mij met iptables of UFW 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. Bij Call of Duty komt daarbij dat u poort 28960 niet in geval van nood kunt dichtzetten, omdat daar ook het spel op ligt. Volumetrische aanvallen moeten in het netwerk vóór de server eindigen.
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 server uit de serverlijst valt.
Kost de DDoS-bescherming extra, en wanneer heb ik 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 nodig wanneer uw server 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.

Call of Duty Call-of-Duty-DDoS-Schutz Gameserver-Schutz Port 28960 Plutonium CoD4X getstatus-Reflection RCON Advanced DDoS Protection