Lineage-2-server beschermen tegen DDoS-aanvallen

Gepubliceerd op 23 min leestijd

Welke poorten een private Lineage-2-server werkelijk nodig heeft, waarom de loginserver op poort 2106 het eigenlijke doelwit is, waarom aanvallen seizoensgebonden rond serverstarts optreden en vanaf welke aanvalsgrootte alleen filtering in het netwerk vóór de server nog helpt.

Een private Lineage-2-server waar 's avonds niemand meer voorbij het inlogscherm komt terwijl de spelers in de wereld ongestoord doorspelen, heeft geen hardwareprobleem. Dat is de vingerafdruk van een DDoS-aanval op de loginserver, en precies daar moet een Lineage-2-DDoS-bescherming aangrijpen. Dit artikel laat eerst zien wat u zonder extra kosten zelf kunt afschermen, daarna waar die maatregelen technisch ophouden, en tot slot wat er dan in het netwerk vóór de server moet gebeuren.

Alle informatie hier gaat uit van L2J en zijn afgeleiden (L2J-Mobius, aCis) onder Debian 12, Debian 13, Ubuntu 22.04 LTS of Ubuntu 24.04 LTS, en van L2OFF-pakketten met AuthD, CacheD en L2Server. 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 configuratie en start noch de loginserver noch de gameserver opnieuw op. Leg eerst de meetwaarden vast (zie de paragraaf "Vastleggen"), na de aanval zijn ze verdwenen.

Lineage-2-server beschermen tegen DDoS: waarom private L2-servers worden aangevallen

Een private Lineage-2-server verenigt meerdere eigenschappen die hem tot een gemakkelijk doelwit maken, en de Lineage-2-DDoS-bescherming moet precies bij die eigenschappen aangrijpen. Ten eerste is uw adres openbaar, en wel vanaf het begin: spelers downloaden een gepatchte System-map, en in de l2.ini daarvan staat de regel ServerAddr= met het IP-adres van uw loginserver. Iedereen die uw project ooit heeft geïnstalleerd, kent dat adres, ongeacht of hij ooit een personage heeft aangemaakt.

Ten tweede zit de spelersgroep vast aan vaste tijden. Belegeringen, epic-raidbosses en events staan in de kalender, een uitval op precies dat uur is maximaal zichtbaar. Ten derde staan projecten in directe concurrentie met elkaar: wie een server opent, werft om dezelfde paar duizend spelers als drie andere projecten in hetzelfde weekend. Het uitschakelen van een concurrent is in deze scene een gangbare strategie. Een aanval wordt daarbij als dienst geboekt (in de scene heet dat booter of stresser) en kost de opdrachtgever kunde noch noemenswaardig geld. Wat een DDoS-aanval precies is, legt het artikel Wat is een DDoS-aanval? uit.

Waarom de loginserver op poort 2106 het eigenlijke doelwit is

Lineage 2 is opgesplitst in twee gescheiden processen: een loginserver en een of meer gameservers. De client verbindt eerst op 2106 TCP met de loginserver, meldt zich aan, krijgt daar de serverlijst met het externe adres en de poort van de gameserver, en bouwt daarna een tweede verbinding op naar 7777 TCP bij de gameserver. Beide processen hebben eigen configuratiebestanden, eigen poorten en eigen belastingsgrenzen.

Daaruit volgt het aanvalspatroon dat L2-beheerders steeds opnieuw beschrijven: een flood op 2106 blokkeert uitsluitend nieuwe aanmeldingen. Wie al in de wereld staat, speelt door totdat hij zelf de verbinding verliest. De online-teller daalt dus langzaam in plaats van abrupt, en op het forum staat "server draait, maar ik kom er niet in". Precies dat beeld onderscheidt een aanval op de loginserver van een aanval op de gameserver, waarbij iedereen tegelijk eruit vliegt.

De loginserver is bovendien het goedkopere doelwit, omdat de inspanning ongelijk verdeeld is. De L2J-loginserver maakt bij het starten een voorraad van tien RSA-sleutelparen van 1024 bit en twintig Blowfish-sleutels aan. Elke aanmeldpoging kost de client het versturen van één pakket en de server een ontsleuteling met de private RSA-sleutel. Een halfafgemaakte sessie bezet daarbij een plaats totdat de ingebouwde timer haar verwerpt: LOGIN_TIMEOUT staat in de broncode op 60 seconden. De standaardinstelling MaxConnectionPerIP = 50 staat elk bronadres vijftig gelijktijdige verbindingen toe. Duizend bronadressen volstaan daarmee voor 50.000 gelijktijdig open sessies, die elk tot een minuut lang blijven bestaan.

Daar komt een eigenaardigheid van het spel bij die het van de meeste gameservers onderscheidt: Lineage 2 loopt uitsluitend over TCP. De fabrikant noemt voor het spel de TCP-poorten 80, 2009, 2106 en 7777, en bij UDP uitsluitend poort 53 voor de naamomzetting. Er is dus geen UDP-spelverkeer dat gefilterd zou moeten worden, maar daardoor is de klassieke SYN-flood met vervalste afzenderadressen direct werkzaam, en wordt de verbindingsregistratie van de kernel het eerste knelpunt.

Waarom aanvallen op Lineage-2-servers seizoensgebonden rond serverstarts optreden

Aanvallen op private Lineage-2-servers treden geconcentreerd rond serverstarts op, omdat datum en tijdstip van de opening weken van tevoren openbaar bekend zijn. Openingskalenders voor Lineage-2-projecten vermelden komende starts per chronicle (Interlude, High Five, Classic, Essence), daarbij de rates en de exacte starttijd, en ze worden dagelijks bijgewerkt. De aanvaller hoeft niets te verkennen: het voor hem gunstigste moment staat in de aankondiging van de beheerder.

De tweede reden is economisch. Een private Lineage-2-server verdient zijn geld vooraan: de volledige spelersbasis wordt in de eerste dagen geworven, de donaties vallen in de eerste weken, daarna krimpt de bevolking gestaag. Een speler die in het eerste uur niet binnenkomt, stapt over naar het project dat in hetzelfde weekend start, en dat project is er altijd. Een uur uitval op de openingsdag kost daarom niet één uur omzet, maar een deel van de volledige levensduur van de server.

De derde reden is technisch. Bij de grand opening proberen duizenden spelers zich tegelijk aan te melden. De loginserver zit op precies die minuut toch al aan zijn grens, en een extra flood is nauwelijks van de piekbelasting te onderscheiden. Een aanval die op een rustige dinsdag zonder gevolgen zou blijven, volstaat op het openingsuur. Hetzelfde geldt voor aangekondigde momenten tijdens het lopende bedrijf: kasteelbelegeringen en epic-raidbosses staan in de kalender en zijn om dezelfde reden geliefde aanvalsvensters. Na de openingsdrukte daalt de prikkel weer, waardoor beheerders de aanvallen als golfbeweging ervaren en niet als permanente toestand.

De poorten waar het werkelijk om gaat

De volgende tabel vermeldt de poorten van een private Lineage-2-server, het bijbehorende configuratiebestand en de directive die de waarde zet. De standaardinstellingen komen uit de meegeleverde configuratiebestanden van L2J respectievelijk uit de installatiehandleidingen voor L2OFF-pakketten.

Poort en protocol Dienst Bestand en directive Naar het open internet?
2106 TCP loginserver, aanmelding van de spelclient (L2J) login/config/LoginServer.properties: LoginserverPort = 2106, LoginserverHostname = * ja
7777 TCP gameserver, de spelwereld (L2J) game/config/Server.properties: GameserverPort = 7777, GameserverHostname = * ja
9014 TCP loginserver neemt de registratie van de gameservers in ontvangst LoginServer.properties: LoginPort = 9014, LoginHostname = 127.0.0.1; tegenhanger in Server.properties: LoginHost = 127.0.0.1, LoginPort = 9014 nee
3306 TCP MariaDB of MySQL, de database van elke L2J-server Server.properties: URL = jdbc:mysql://localhost/lineage2, Login = root nee
2106 TCP (L2OFF) AuthD, de aanmelddienst van de officiële serverbestanden AuthD-configuratie: serverExPort = 2106 ja
7777 TCP (L2OFF) L2Server, de spelwereld van de officiële serverbestanden l2server.ini: worldport = 7777 ja
2104 en 2108 TCP (L2OFF) AuthD intern (serverPort en serverIntPort) AuthD-configuratie nee
2006 en 2008 TCP (L2OFF) CacheD, de brug tussen L2Server en de database CacheD-configuratie nee
2002 TCP (L2OFF) L2NPC, laadt de NPC's in de spelwereld l2npc.ini nee
1433 TCP (L2OFF) Microsoft SQL Server, de database van de officiële serverbestanden databaseconfiguratie nee
80 en 443 TCP projectwebsite met registratie, donatieshop en vote-pagina's webserver ja, maar niet op hetzelfde IP-adres
22 TCP SSH-toegang /etc/ssh/sshd_config alleen beperkt tot uw eigen adres

Twee vragen beantwoordt deze tabel meteen: Lineage 2 heeft noch een querypoort noch een RCON-poort. Er is geen aparte dienst die de spelersstand voor een serverlijst uitlevert, en geen afstandsbedieningspoort zoals bij spellen op Source-basis. De serverlijst maakt de loginserver zelf en stuurt die over dezelfde verbinding op 2106 naar de aangemelde client. De afstandsbediening loopt in L2J via commando's in het spel en via de database. Daarmee vervallen twee aanvalsvectoren die andere spellen wel hebben, en blijft er des te meer aan poort 2106 hangen.

Ordes van grootte die u moet kennen

Grootheid Waarde
Transportprotocol van het spel uitsluitend TCP, UDP alleen voor de naamomzetting op poort 53
1 Gbit/s aansluiting 125 megabyte per seconde
Pakketten van 64 byte in 1 Gbit/s ongeveer 1,49 miljoen pakketten per seconde
Wat een gewone serverkernel verwerkt enkele honderdduizenden pakketten per seconde, daarna begint hij te verwerpen
Gelijktijdige verbindingen per bronadres, L2J-standaardinstelling MaxConnectionPerIP = 50
Levensduur van een halfafgemaakte aanmeldsessie in L2J LOGIN_TIMEOUT, 60 seconden
Mislukte pogingen tot de blokkade, L2J-standaardinstelling LoginTryBeforeBan = 5, daarna LoginBlockAfterBan = 900 seconden
Op KernelHost gefilterde aanval op een gameserver meer dan 112,2 Gbit/s bij meer dan 8,7 miljoen pakketten per seconde
Op KernelHost gefilterde aanval op een voiceserver meer dan 473,4 Gbit/s bij meer dan 41,5 miljoen pakketten per seconde

Wat u zelf kunt doen voordat u geld uitgeeft

Dit hoofdstuk is het langste, en dat met opzet. Een netjes geconfigureerde Lineage-2-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 -lntp

Interessant is de kolom met het lokale adres. 0.0.0.0:2106 en 0.0.0.0:7777 horen daar thuis. 0.0.0.0:9014 en 0.0.0.0:3306 zijn fouten: dat zijn de twee poorten waarmee een aanvaller zich in uw serverlijst kan hangen of uw database kan aftasten. 127.0.0.1:3306 betekent daarentegen "alleen lokaal" en heeft geen firewallregel nodig. Het beeld van de aanvaller levert een poortscan van buitenaf:

nmap -Pn -p- --min-rate 1000 UW.SERVER.IP.ADRES

2. Poort 9014 en de database uit het open internet houden

Poort 9014 is het kanaal waarmee de gameserver zich bij de loginserver registreert, en die hoort onder geen beding op het open internet. L2J levert daarvoor al de juiste standaardinstelling: LoginHostname = 127.0.0.1 bindt de poort aan de loopback-interface, hij is van buitenaf dus helemaal niet bereikbaar. Draaien loginserver en gameserver op twee verschillende machines, vul dan in plaats van * het concrete interne adres in en geef de poort uitsluitend vrij voor het andere systeem.

Dezelfde regel geldt voor de database. Controleer in /etc/mysql/mariadb.conf.d/50-server.cnf of daar staat:

bind-address = 127.0.0.1

En vervang de databasegebruiker. De meegeleverde Server.properties staat op Login = root, en het bestand zelf becommentarieert dat met de opmerking dat precies dat niet wordt aanbevolen. Hoe u een eigen gebruiker met minimale rechten aanmaakt, staat in MariaDB en MySQL beveiligen. Daarna controleert u het resultaat:

ss -lntp | grep -E ':9014|:3306'

De firewall daarboven blijft kort. Voor een Lineage-2-server volstaan twee openstellingen naar buiten, en wel precies in deze volgorde, zodat u zichzelf niet buitensluit:

ufw allow 22/tcp comment 'SSH'
ufw allow 2106/tcp comment 'L2 Login'
ufw allow 7777/tcp comment 'L2 Game'
ufw default deny incoming
ufw default allow outgoing
ufw --force enable
ufw status verbose

De volledige handleiding inclusief reddingsweg vindt u onder UFW-firewall instellen zonder uzelf buiten te sluiten.

3. AcceptNewGameServer uitschakelen zodra uw server geregistreerd is

In de LoginServer.properties staat af fabriek AcceptNewGameServer = True, en het commentaar daarboven beschrijft precies wat dat betekent: elke gameserver mag zich op een vrije plaats van uw loginserver registreren. Zolang 9014 alleen op de loopback-interface ligt, is dat zonder gevolgen. Zodra de poort om een andere reden bereikbaar wordt, is het een open deur. Zet de waarde daarom op False zodra uw eigen gameserver eenmaal geregistreerd is en zijn ID heeft:

AcceptNewGameServer = False

In de tegenhanger aan de kant van de gameserver staat AcceptAlternateID = True. Dat is bij de opbouw handig, omdat de loginserver dan een andere ID toekent wanneer de gewenste bezet is. Op een productiesysteem wilt u het tegendeel: een vaste ID, en een foutmelding wanneer die bezet is.

4. De flood protection van de loginserver juist instellen

L2J brengt een eigen verbindingsrem in de loginserver mee. Die staat in de LoginServer.properties, en alle tijdwaarden zijn milliseconden:

EnableFloodProtection = True
FastConnectionLimit = 15
NormalConnectionTime = 700
FastConnectionTime = 350
MaxConnectionPerIP = 50

De waarden hangen samen. Een verbinding die minder dan FastConnectionTime na de vorige uit hetzelfde bronadres binnenkomt, telt als snel. Na FastConnectionLimit van zulke verbindingen wordt het adres geweigerd. NormalConnectionTime is de tussenpoos vanaf welke de teller weer wordt afgebouwd. MaxConnectionPerIP is de bovengrens van gelijktijdig open verbindingen per adres.

Vijftig gelijktijdige verbindingen zijn voor één enkele speler zeer royaal, en lagere waarden helpen merkbaar. Toch is hier voorzichtigheid geboden: meerdere spelers in hetzelfde huishouden, een internetcafé en vooral aansluitingen achter een carrier-NAT (in de L2-scene betreft dat veel spelers uit Turkije, uit Brazilië en uit delen van Oost-Europa) delen één openbaar adres. Wie hier op 3 instelt, sluit echte spelers buiten. Meet eerst een week in normaal bedrijf, verlaag daarna in stappen.

En een beperking die u moet kennen: deze rem draait in het Java-proces van de loginserver. Elk pakket waarover hij beslist, is al over uw lijn gelopen en heeft al rekentijd gekost. Tegen een handvol bronnen werkt hij, tegen een botnet niet.

5. Mislukte pogingen begrenzen en banned_ip.cfg gebruiken

Twee andere directives in de LoginServer.properties sturen hoe lang iemand mag raden:

LoginTryBeforeBan = 5
LoginBlockAfterBan = 900

LoginTryBeforeBan is het aantal ongeldige combinaties van account en wachtwoord waarna het adres wordt geblokkeerd, LoginBlockAfterBan is de blokkadeduur in seconden (900 komt overeen met 15 minuten). Daarna begint de telling opnieuw.

Permanente blokkades voert u in het bestand banned_ip.cfg in de configuratiemap van de loginserver in. Toegestaan zijn losse adressen, hele netwerken en een optioneel verlooptijdstip als Unix-tijdstempel in milliseconden; alles na # is commentaar:

198.51.100.7
203.0.113.0
198.51.100.44 1789689600000

Zet bovendien AutoCreateAccounts = False. De standaardinstelling True maakt bij elke aanmelding met een onbekende accountnaam automatisch een account aan. Dat is bij de opbouw praktisch en in bedrijf een cadeau: een aanvaller maakt daarmee willekeurig veel accounts aan, en elk daarvan mag de serverlijst met het adres van uw gameserver opvragen. Laat accounts in plaats daarvan via de registratie op uw website ontstaan, dan bepaalt u zelf wie een aanmelding krijgt.

6. Verbindingssnelheden op 2106 en 7777 in de kernel begrenzen

Wat de Java-rem te laat beslist, beslist de kernel eerder en goedkoper. Tegen kleine aanvallen en slordige bots helpt een bovengrens per bronadres:

iptables -I INPUT -p tcp --dport 2106 --syn -m connlimit --connlimit-above 8 --connlimit-mask 32 -j DROP
iptables -I INPUT -p tcp --dport 2106 --syn -m hashlimit --hashlimit-name l2login --hashlimit-mode srcip --hashlimit-above 6/sec --hashlimit-burst 20 -j DROP
iptables -I INPUT -p tcp --dport 7777 --syn -m connlimit --connlimit-above 6 --connlimit-mask 32 -j DROP

De eerste regel verwerpt nieuwe verbindingen naar de loginserver zodra één adres er meer dan acht tegelijk open heeft staan. Een reguliere client heeft er precies één nodig. De tweede begrenst het aantal nieuwe verbindingen tot zes per seconde per adres met een buffer van twintig, wat een stormloop aan herverbindingen na een serverherstart nog doorlaat. De derde staat op de gameserver zes gelijktijdige verbindingen per adres toe, omdat meervoudig inloggen (dualbox en triplebox) in Lineage 2 normaal is en een te krappe grens uw betalende spelers raakt.

Alle drie de getallen zijn startwaarden, geen waarheden. Een server met 2000 gelijktijdige spelers gedraagt zich anders dan een met 200. Meet eerst, stel daarna in. 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.

7. SYN-flood opvangen: syncookies, backlog en verbindingsregistratie

Omdat Lineage 2 uitsluitend over TCP loopt, is de SYN-flood de voor de hand liggende vector. Een SYN-flood is een aanval die verbindingsaanvragen met vervalste afzenderadressen stuurt en de bevestiging nooit beantwoordt, zodat de server voor elke aanvraag geheugen reserveert dat nooit wordt gebruikt. Vier instellingen ontscherpen dat:

sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.tcp_synack_retries=2

SYN-cookies zijn daarbij de belangrijkste regel: de kernel beantwoordt de aanvraag zonder iets te onthouden en legt de toestand pas aan wanneer de tegenpartij de verbinding werkelijk afrondt. Vervalste afzenders lopen daarmee in het niets. Permanent worden de waarden in een bestand onder /etc/sysctl.d/ opgeslagen en met sysctl --system geladen.

Een vaak over het hoofd gezien knelpunt is de verbindingsregistratie van de kernel. Loopt die vol, dan verwerpt de server ook legitieme pakketten en staat er in het logboek "nf_conntrack: table full, dropping packet". Stand en bovengrens toont:

sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max

8. Website, loginserver en gameserver op gescheiden IP-adressen

De projectwebsite met registratie, donatieshop en vote-pagina's is via uw domein altijd vindbaar. Ligt die op hetzelfde IP-adres als de loginserver, dan legt een aanval op de website tegelijk de aanmelding plat, en omgekeerd. Scheid de drie rollen over verschillende adressen. Dan blijft bij een aanval op de website het spel bereikbaar, en bij een aanval op 2106 spelen de reeds verbonden spelers door.

Houd daarbij de DNS-records schoon. De meest gemaakte fout is een vergeten A-record naar een eerder adres: het maakt elke adreswissel zinloos, omdat de aanvaller het nieuwe adres via dezelfde naam vindt als uw spelers.

En hier hoort eerlijkheid in plaats van wensdenken: het adres van uw loginserver laat zich niet geheimhouden. Het staat in de l2.ini in de System-map die elke speler downloadt. Het adres van de gameserver verspreidt de loginserver op zijn beurt zelf: in L2J staat het als extern adres in de ipconfig.xml (in oudere afgeleiden als ExternalHostname in de Server.properties), en het wordt meegedeeld aan elke client die zich met succes heeft aangemeld. Verstoppen is geen strategie, filteren wel.

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 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
ss -tn state syn-recv | wc -l
ip -s link show eth0
tcpdump -ni eth0 'tcp port 2106' -c 200 -q

De tweede regel is bij Lineage 2 de meest veelzeggende: hij telt de halfopen verbindingen. Een vijfcijferige waarde bij een paar honderd spelers is een SYN-flood en niets anders. Voor tcpdump geldt: altijd met -c begrenzen, 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 typische gameserver hangt aan 1 Gbit/s, dat is 125 megabyte per seconde, en de lijn zit vol zodra iemand meer stuurt. Tegen een Lineage-2-server is daarvoor niet eens een grote aanval nodig, omdat de tweede grootheid eerder toeslaat: de pakketsnelheid. 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.

Bij een puur TCP-spel komt er een derde grens bij. Elke halfopen verbinding bezet een vermelding in de verbindingsregistratie en in de backlog, en de L2J-loginserver houdt zijn sessies tot 60 seconden vast. Een aanval met enkele honderdduizenden pakketten per seconde, die uw lijn niet eens voor een derde vult, kan de aanmelding dus volledig blokkeren. Beheerders ervaren dat als "de belasting was helemaal niet hoog en toch kwam er niemand binnen".

Ter oriëntatie, welke ordes van grootte werkelijk voorkomen: op KernelHost-servers zijn onder meer een aanval met meer dan 112,2 Gbit/s bij meer dan 8,7 miljoen pakketten per seconde op een gameserver en een multivector-aanval met meer dan 473,4 Gbit/s bij meer dan 41,5 miljoen pakketten per seconde op een voiceserver weggefilterd. Daarvoor bestaat geen lokale instelling. Volumetrische aanvallen moeten in het netwerk vóór de server eindigen. Wat er in een acuut geval te doen staat, leest u in Zware DDoS-aanval: wat nu te doen?.

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, dus er zijn geen eerste minuten waarin de server weg is. Juist bij een grand opening is dat het verschil tussen een geslaagde en een verloren start. 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 projecten worden niet af en toe, maar gericht en wekenlang aangevallen, en in de Lineage-2-scene is dat het normale geval voor elke server die de bovenste plaatsen van de serverlijsten haalt. 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 gescheiden in wat op 2106 TCP is toegestaan en wat op 7777 TCP. Dat is bij Lineage 2 het doorslaggevende punt, omdat de twee poorten volkomen verschillende verkeerspatronen hebben: veel korte verbindingen aan de ene kant, weinig zeer lange aan de andere.
  • Wijzigingen gelden in realtime, u kunt dus tijdens een lopende aanval bijsturen, en u kunt de regels vóór het openingsuur scherper zetten en daarna weer losser.
  • Een beschermingsprofiel dat bij de toepassing past, ook voor aangepaste en eigen serverbestanden op willekeurige TCP- of UDP-poorten. Of u L2J, L2J-Mobius, aCis of een L2OFF-pakket draait, maakt voor de regelset niet uit, omdat die op poort en protocol aangrijpt.

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, 2106 en 7777 gescheiden
Wijzigingen lopen automatisch mee gelden in realtime, ook tijdens een aanval
Serverbestanden geoptimaliseerde profielen voor gangbare games profiel per poort en protocol, dus ook voor L2J, L2J-Mobius, aCis en L2OFF
Null-routing nee nee
Looptijd gekoppeld aan het serverpakket PrePaid, geen minimale looptijd, geen opzegtermijn, geen installatiekosten

Voor de meeste Lineage-2-projecten volstaat de inbegrepen permanente bescherming samen met een nette serverconfiguratie. De Advanced DDoS Protection is het antwoord op iemand die het persoonlijk maakt, en dat gebeurt ervaringsgewijs in de week vóór de grand opening.

Veelgemaakte fouten en oplossingen

"De login werkt niet, maar de gameserver draait normaal": dat is geen toeval, maar de gebruikelijke vorm van een aanval op een Lineage-2-server. Loginserver en gameserver zijn twee processen op twee poorten. Meet ss -tn state syn-recv | wc -l en sar -n DEV 1 10. Stijgen de halfopen verbindingen terwijl de bandbreedte onopvallend blijft, dan is het een verbindingsflood op 2106.

"Ik heb het IP-adres gewisseld en was de volgende dag weer offline": de aanvaller krijgt het nieuwe adres langs dezelfde weg als uw spelers, namelijk via de nieuwe System-map met de gewijzigde l2.ini, via uw aankondiging of via een vergeten DNS-record. Een adreswissel levert tijd op, geen oplossing.

"Ik heb MaxConnectionPerIP op 3 gezet, nu klagen spelers": dualbox is in Lineage 2 gebruikelijk, en spelers achter een carrier-NAT delen een openbaar adres met honderden anderen. Ga terug naar een waarde die uw meetwaarden uit het normale bedrijf dekt, en begrens in plaats daarvan het aantal nieuwe verbindingen in de kernel.

"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. Blijven ze op nul staan, dan wordt de regel niet bereikt.

"Alle spelers hebben lag spikes, maar de lijn is rustig": dan is het geen DDoS-aanval. Bij een Java-server zijn de gebruikelijke verdachten pauzes van de garbage collection, een database zonder passende indexen en een script of een custom event in een lus. Controleer eerst sar -n DEV 1 10: blijven de pakketsnelheden normaal, dan ligt de oorzaak in de server en niet in het netwerk.

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

"Mijn grand opening is over twee weken": verhuis dan nu en niet in de startweek. Een verhuizing kost een nieuwe System-map voor de spelers, een DNS-omzetting en een testrun. Dat alles wilt u achter de rug hebben voordat u de datum aankondigt, want vanaf de aankondiging kent elke concurrent uw ongunstigste moment.

Kort samengevat

  • Een private Lineage-2-server heeft precies twee poorten op het open internet nodig: 2106 TCP voor de loginserver en 7777 TCP voor de gameserver. Poort 9014, de database (3306 bij L2J, 1433 bij L2OFF) en de interne L2OFF-poorten 2002, 2006, 2008, 2104 en 2108 horen daar niet bij.
  • Lineage 2 loopt uitsluitend over TCP en heeft noch een querypoort noch een RCON-poort. De typische aanval is daarom een SYN- of verbindingsflood op poort 2106 en geen UDP-flood.
  • Een aanval op de loginserver blokkeert alleen nieuwe aanmeldingen. Komt er niemand binnen terwijl de spelers in de wereld doorspelen, dan moet u de oorzaak op poort 2106 zoeken en niet op 7777.
  • Stel EnableFloodProtection, MaxConnectionPerIP, LoginTryBeforeBan en AutoCreateAccounts bewust in, zet AcceptNewGameServer na de registratie op False en begrens verbindingssnelheden bovendien in de kernel, omdat de Java-rem pas achter de lijn aangrijpt.
  • Aanvallen op Lineage-2-servers concentreren zich rond serverstarts, omdat datum en tijdstip weken van tevoren openbaar zijn en de economische schade op de openingsdag het grootst is. De bescherming moet vóór de aankondiging staan, niet erna.
  • Boven de capaciteit van de lijn en boven enkele honderdduizenden pakketten per seconde beslist uitsluitend de filtering in het netwerk vóór de server. Bij KernelHost is die opgebouwd in twee lagen, permanent actief, zonder meerprijs en zonder null-routing.

Draait uw project 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 de filterregels voor uw IP-adres worden bijgesteld. Bij een lopende aanval bereikt u ons daarnaast via de WhatsApp-noodchat op +43 650 8209883.

Veelgestelde vragen

Mijn Lineage-2-server is nu offline. Waaraan herken ik of het om een DDoS-aanval gaat?
Kijk naar de pakketsnelheid en de halfopen verbindingen, niet naar de CPU-belasting. Met sar -n DEV 1 10 ziet u pakketten en bytes per seconde, met ss -tn state syn-recv | wc -l het aantal halfopen TCP-verbindingen. Een vijfcijferige waarde bij een paar honderd spelers is een SYN-flood op poort 2106. Komen er geen nieuwe spelers meer binnen terwijl de reeds verbonden spelers normaal doorspelen, dan is de loginserver het doelwit en niet de gameserver op 7777. Blijven beide waarden onopvallend en hapert het toch, dan ligt de oorzaak in de server zelf.
Welke poorten moet ik voor een Lineage-2-server openlaten?
Precies twee: 2106 TCP voor de loginserver en 7777 TCP voor de gameserver. Bij L2J staan ze in de LoginServer.properties als LoginserverPort en in de Server.properties als GameserverPort. Poort 9014, waarmee de gameserver zich bij de loginserver registreert, blijft op 127.0.0.1, net als de database op 3306. Bij L2OFF-pakketten geldt hetzelfde: openbaar zijn 2106 voor AuthD en 7777 voor L2Server, terwijl 2002, 2006, 2008, 2104, 2108 en de SQL-poort 1433 in het lokale netwerk blijven.
Waarom wordt bij Lineage 2 de loginserver op poort 2106 aangevallen en niet de gameserver?
Omdat een flood op 2106 de toevoer afsnijdt zonder dat de aanvaller veel bandbreedte nodig heeft. De loginserver ontsleutelt bij elke aanmeldpoging de inloggegevens met een private RSA-sleutel, en een halfafgemaakte sessie bezet in L2J tot 60 seconden lang een plaats. De standaardinstelling MaxConnectionPerIP = 50 staat elk bronadres vijftig gelijktijdige verbindingen toe, duizend bronnen volstaan dus voor 50.000 open sessies. De spelers in de wereld merken daar aanvankelijk niets van, nieuwe spelers komen er helemaal niet in.
Waarvoor dient poort 9014 bij L2J en moet die van buitenaf bereikbaar zijn?
Poort 9014 is het kanaal waarmee de gameserver zich bij de loginserver registreert, gezet als LoginPort in beide configuratiebestanden. Hij mag nooit vanaf het internet bereikbaar zijn. L2J levert daarvoor al de juiste standaardinstelling: LoginHostname = 127.0.0.1 bindt de poort aan de loopback-interface. Draaien loginserver en gameserver op twee machines, vul dan het concrete interne adres in en geef de poort uitsluitend vrij voor het andere systeem. Zet bovendien AcceptNewGameServer op False zodra uw server eenmaal geregistreerd is.
Waarom worden Lineage-2-servers vooral rond de grand opening aangevallen?
Omdat datum en tijdstip van de opening weken van tevoren openbaar zijn: openingskalenders vermelden komende Lineage-2-starts met chronicle, rates en exacte starttijd en worden dagelijks bijgewerkt. Daar komt bij dat een private server zijn geld vooraan verdient. De spelersbasis wordt in de eerste dagen geworven, en wie in het eerste uur niet binnenkomt, stapt over naar het project dat in hetzelfde weekend start. Technisch zit de loginserver op de openingsminuut toch al aan zijn grens, een extra flood is nauwelijks van de piekbelasting te onderscheiden.
Kan ik mij met iptables of de flood protection van L2J tegen een DDoS-aanval verweren?
Tegen kleine aanvallen en losse bronnen wel, tegen volumetrische aanvallen niet. De flood protection van L2J draait in het Java-proces, iptables draait in de kernel: beide beslissen over pakketten die al over uw lijn zijn gelopen. Zit de lijn vol, dan komen de pakketten van uw spelers al eerder niet meer door. Toch zijn de lokale middelen nuttig, vooral connlimit en hashlimit op poort 2106 en net.ipv4.tcp_syncookies tegen vervalste afzenders. Volumetrische aanvallen moeten in het netwerk vóór de server eindigen.
Helpt het om nu snel het IP-adres van mijn L2-server te wisselen?
Maar even. Uw spelers krijgen het nieuwe adres via een nieuwe System-map, in de l2.ini waarvan de regel ServerAddr= staat, en via diezelfde aankondiging krijgt de aanvaller het ook. Daar komen vergeten DNS-records naar het oude adres bij, die elke wissel zinloos maken. Het adres van de gameserver verspreidt bovendien uw eigen loginserver naar elke client die zich heeft aangemeld. Een adreswissel levert tijd op, maar lost het probleem niet op.
Vanaf welke omvang redt mijn Lineage-2-server het niet meer alleen?
Een typische gameserver hangt aan 1 Gbit/s, wat overeenkomt met 125 megabyte per seconde. Belangrijker is bij Lineage 2 echter 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. Omdat het spel uitsluitend over TCP loopt, komt de verbindingsregistratie als derde grens daarbij. Een aanval kan de aanmelding dus blokkeren hoewel de bandbreedte niet 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 de server weg is. Juist op het openingsuur van een nieuwe server is precies dat doorslaggevend.
Kost de DDoS-bescherming bij KernelHost extra?
Nee. 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, niet in te schakelen en niet te configureren. Dat geldt ongeacht of u L2J, L2J-Mobius, aCis of een L2OFF-pakket draait, omdat de filtering op poort en protocol aangrijpt en niet op de serverbestanden. Extra kosten ontstaan alleen wanneer u de Advanced DDoS Protection met eigen regels erbij boekt.
Wanneer heb ik voor mijn Lineage-2-project daarnaast de Advanced DDoS Protection 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, bij Lineage 2 dus gescheiden voor 2106 TCP en 7777 TCP. Wijzigingen gelden in realtime, u kunt de regels vóór het openingsuur dus scherper zetten en daarna weer losser. De prijs begint bij 50,00 € per maand, PrePaid, zonder minimale looptijd en zonder installatiekosten.

Lineage 2 Lineage-2-DDoS-bescherming L2J L2OFF Gameserverbescherming Poort 2106 Poort 7777 Advanced DDoS Protection Realtime filtering