Vytváříme vlastní Anti-DDoS ochranu pro Minecraft

Časy, kdy DDoS útok zvládli udělat jen ti nejlepší hackeři s velkými botnety jsou už dávno pryč, dnes dokáže provést DDoS útok i naprostý amatér s internetovým prohlížečem. Doslova.

Vytváříme vlastní Anti-DDoS ochranu pro Minecraft
Fotografie od Freepik

Časy, kdy DDoS útok zvládli udělat jen ti nejlepší hackeři s velkými botnety jsou už dávno pryč, dnes dokáže provést DDoS útok i naprostý amatér s internetovým prohlížečem. Doslova. Důkazem může být zabavení 24 internetových domén spojených se službami pro pronájem DDoS útoků. Bohužel, takovýchto stránek na internetu existuje stovky, některé si účtují poplatek, některé ale poskytují útok zdarma. Navíc už útoky necílí pouze na webové stránky, ale i na herní servery, mezi které patří i oblíbená hra Minecraft.

Konkurenční boj či pro zábavu

DDoS útoky byly a jsou využívány z mnoha různých důvodů. Jedním z těch největších je konkurenční boj. Představte si, že máte internetový obchod s elektronikou a potřebujete získat nové zákazníky. Jiný internetový obchod ale roste 2x rychleji a zakoupení reklamy by pro vás bylo příliš drahé. Druhou možností může být ale DDoS útok: pokud konkureční e-shop bude příliš pomalý nebo dokonce nedostupný, lidé půjdou raději nakupovat k vám. Takto to funguje i u Minecraft serverů. Každý rok vznikne mnoho nových serverů které si konkurují navzájem, už to není pouze o reklamě a youtuberech. Proto se majitelé některých serverů uchylují k DDoS útokům vůči ostatním serverům, jelikož hráči nechtějí hrát na serveru který se laguje.

Druhým důvodem bohužel bývá i obyčejná zábava. Nejčastěji se tímto baví děti, kterým možnost shodit velký server dodává pocit moci, možnost rozhodovat o tom, zda stovky hráčů budou hrát na tomto serveru nebo odejdou. V kombinaci se širokou dostupností DDoS služeb na internetu to znamená problém pro úplně všechny servery.

Jak se bránit?

S tím, jak DDoS útoků na Minecraft servery přibývalo, vzniklo mnoho nových služeb poskytujících Anti-DDoS ochranu. Mezi ty největší patří TCPShield nebo Cloudflare. Jedná se o již hotové služby, které stačí pouze napojit na svůj server. Bohužel né vše je dokonalé a každá věc něco stojí. Tyto ochrany bývají pro menší servery příliš drahé, zároveň neznamenají jistou ochranu před každým druhem útoku. Některé navíc mají problém s vysokým pingem, jelikož se jejich servery nachází v zemích jako je Francie.

Je tu ale i druhá možnost, vytvořit si vlastní Anti-DDoS ochranu. I přes to že její realizace je o něco náročnější než zakoupení existujícího řešení, ve finále dokáže přinést mnoho benefitů, jako je například nižší cena, nastavení na míru a při zvolení vhodných lokací pro servery i menší ping.

Vytváříme vlastní ochranu

Jako první je vhodné si uvědomit, jak takový DDoS útok funguje. Je několik druhů útoku, který server může postihnout:

Přetížení serveru

Tím nejjednodušším útokem je pouhé přetížení serveru mnoha požadavky. Tím můžou být v našem případě boti, kteří se připojí na server a provádějí náročné requesty na server. Když se připojí třeba 300 botů kteří úmyslně spamují nebo načítají svět, může to pro vás být velkým problémem a na slabším hardware může server i spadnout. Tomuto útoku se dá bránit například zablokováním IP adresy útočníka, bohužel často je pro útok využíváno tisíce adres po celém světě.

Přetížení internetového spojení

Druhým typem útoku je přetížení vašeho internetu, takzvaný volumetrický DDoS. Tento útok je o něco náročnější, jelikož vyžaduje mnoho počítačů se silnou internetovou konektivitou. Tím můžou být jak nakoupené servery po celém světě, tak i velké botnety tvořené miliony zařízení. Takový útok má za cíl primárně jednu věc: přetížit vaše internetové spojení. Pokud máte pouze 1Gbitové spojení a útok je tvořen 100Gbitovým datovým tokem, k vašemu serveru se nedostanou požadavky hráčů. To vyžaduje obrovskou konektivitu i na straně serveru. Jak se ale těmto útokům účinně bránit?

Klíčem jsou proxy servery

Ve většině případů běží server pouze na jednom místě. To ale není vhodná situace, jelikož sehnat velmi silnou konektivitu může být komplikované a opravdu drahé. Zároveň nechceme útok k tomuto serveru vůbec pustit, jelikož by to znamenalo jeho přetížení. Řešení není ale vůbec náročné, a tím jsou proxy servery. V překladu se jedná o server, který zprostředkovává připojení k jinému serveru. Těchto serverů můžeme mít klidně i stovky, takže můžeme škálovat konektivitu ochrany nezávisle na konektivitě Minecraft serveru. Pokud začne být konektivita ochrany malá, stačí přidat nové proxy servery. Zároveň na těchto serverech odfiltrujeme pochybný datový tok a k hernímu serveru ve finále pustíme ve většině případu realné hráče. Aby jsme umožnili se hráčům připojit k těmto serverům skrze jedinou adresu, využijeme round robin funkce u DNS, takže DNS server bude střídavě vracet pro jednu doménu adresy proxy serverů.

Připojení k serveru bez proxy
Připojení k serveru skrze proxy servery

Aby jsme mohli přesměrovávat spojení mezi hráčem k serverem, potřebujeme speciální aplikaci, která bude zprostředkovávat spojení. Můžeme buď využít velmi oblíbenou HaProxy, což je poměrně obecná proxy a dá se tedy využít téměř na vše. Zároveň má mnoho možností nastavení, její nevýhodou je ale vyšší využití procesoru. Druhou, lepší možností je využití specializované proxy přimo pro Minecraft protokol, v našem případě open-source proxy Infrared. Ta například podporuje i připojení podle domény, na jednom proxy serveru lze tedy podle domény rozdělit hráče na různé Minecraft servery.

Filtrujeme nebezpečný provoz

Aktuálně tedy dokážeme datový tok přenášet skrze proxy servery, teď je potřeba ho filtrovat. Na linuxu lze využít krásy firewallu iptables, který ačkoliv je poměrně náročný na pochopení, jedná se stále o jeden z nejmocnějších firewallů. Jedno z nejdůležitějších pravidel je filtrování podle státu. V našem případě totiž stavíme server pro Česko a Slovensko, je vhodné tedy povolit přístup jen z těchto zemí a jejich nejbližšího okolí. Ve většině případů totiž za DDoS útokem stojí ip adresy ze zemí jako je Thajsko, Vietnam a další. Druhým pravidlem je limit spojení. Pokud totiž z adresy přichází více jak 50 spojení za vteřinu, pravděpodobně se nejedná o běžného hráče, ale o útočníka. Nakonec pokud chceme zlepšit efektivitu našeho firewallu, můžeme si na linuxu pohrát se souborem sysctl.conf a pohrát si s hodnotami v systému.

Dáváme vše dohromady

Jako první si nakoupíme několik VPS, ideálně u různých poskytovatelů z důvodu redundance. Jako distribuci zvolíme Debian, což je nejrozšířenější linuxová distribuce s malými nároky na hardware. První si pohrajeme s firewallem, v našem případě budeme počítat s tím že jsme Český Minecraft server a chceme jen CZ/SK hráče, maximálně pár okolních států.

⚠️
Jelikož zde pracujeme s firewallem, dávejte si pozor aby jste si nezablokovali přístup k SSH. Pokud vaše IP nepochází z CZ/SK, přidejte jako první pravidlo pro přístup z vaší IP na port 22.

Začneme instalací firewallu a nastavením pravidla, které umožní odchozí komunikaci na již vytvořených spojení.

sudo apt-get install iptables
sudo apt-get install iptables-persistent
sudo iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Instalace a základní nastavení firewallu

Následně si nainstalujeme speciální GeoIP tabulku. Ta slouží k přiřazení státu k IP adrese v rámci firewall pravidel. Následně nastavíme pravidlo, že státy které nesplňují náš seznam budou zakázány.

sudo apt-get install curl unzip perl
sudo apt-get install xtables-addons-common
sudo apt-get install libtext-csv-xs-perl libmoosex-types-netaddr-ip-perl

MON=$(date +"%m")
YR=$(date +"%Y")

sudo mkdir -p /usr/share/xt_geoip
sudo wget https://download.db-ip.com/free/dbip-country-lite-${YR}-${MON}.csv.gz -O /usr/share/xt_geoip/dbip-country-lite.csv.gz
sudo gunzip /usr/share/xt_geoip/dbip-country-lite.csv.gz
/usr/libexec/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip -i /usr/share/xt_geoip/dbip-country-lite.csv
sudo rm /usr/share/xt_geoip/dbip-country-lite.csv

sudo iptables -I INPUT -m geoip ! --src-cc CZ,SK,HU,PL,DE,AU -j DROP
Blokace nežádoucích států pomocí whitelistu států

Ve finále přidáme mnoho pravidel (které zde nebudu vysvětlovat z důvodu náročnosti), ale zamezují běžným formátům DDoS útoku a limitují počet spojení na adresu za vteřinu.

sudo iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP
sudo iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
sudo iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
sudo iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
sudo iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
sudo iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
sudo iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP
sudo iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP
sudo iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP
sudo iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP
sudo iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP
sudo iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP
sudo iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
sudo iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP
sudo iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
sudo iptables -t mangle -A PREROUTING -f -j DROP
sudo iptables -A INPUT -p tcp -m connlimit --connlimit-above 111 -j REJECT --reject-with tcp-reset
sudo iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 2 -j ACCEPT
sudo iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP
sudo iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 30/s --limit-burst 10 -j ACCEPT
sudo iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP
Mnoho pravidel s jediným cílem: zamezit běžným formátům DDoS útoku

Teď už stačí jen pravidla uložit.

sudo iptables-save > /etc/iptables/rules.v4
Ukládáme naše pravidla

Tím máme náš firewall hotový, teď optimalizujeme systém přímo pro potřeby našeho proxy serveru. To uděláme v již zmíněném souboru sysctl.conf. Ten se nachází ve složce /etc/. Na konec tohoto souboru vložíme konfiguraci, která by měla dovolit serveru odolat více útokům.

kernel.printk = 4 4 1 7
kernel.panic = 10
kernel.sysrq = 0
kernel.shmmax = 4294967296
kernel.shmall = 4194304
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
vm.swappiness = 20
vm.dirty_ratio = 80
vm.dirty_background_ratio = 5
vm.oom-kill = 0
fs.file-max = 2097152
net.core.netdev_max_backlog = 262144
net.core.rmem_default = 31457280
net.core.rmem_max = 67108864
net.core.wmem_default = 31457280
net.core.wmem_max = 67108864
net.core.somaxconn = 50000
net.core.optmem_max = 25165824
net.ipv4.neigh.default.gc_thresh1 = 4096
net.ipv4.neigh.default.gc_thresh2 = 8192
net.ipv4.neigh.default.gc_thresh3 = 16384
net.ipv4.neigh.default.gc_interval = 5
net.ipv4.neigh.default.gc_stale_time = 120
net.netfilter.nf_conntrack_max = 10000000
net.netfilter.nf_conntrack_tcp_loose = 0
net.netfilter.nf_conntrack_tcp_timeout_established = 1800
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 10
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 20
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 20
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 20
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 20
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 10
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.ip_no_pmtu_disc = 1
net.ipv4.route.flush = 1
net.ipv4.route.max_size = 8048576
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_mem = 65536 131072 262144
net.ipv4.udp_mem = 65536 131072 262144
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.udp_rmem_min = 16384
net.ipv4.tcp_wmem = 4096 87380 33554432
net.ipv4.udp_wmem_min = 16384
net.ipv4.tcp_max_tw_buckets = 1440000
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 400000
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rfc1337 = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_ecn = 2
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 10
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.ip_forward = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.rp_filter = 1
net.ipv4.icmp_echo_ignore_all=1
Mnoho nastavení, které sice neovlivní zkušenosti z hraní na serveru ale ztíží šanci útočníka na přetížení serveru

Ještě je potřeba vše uložit.

sudo sysctl -p
Ukládáme nastavení pro systém

Tímto máme v systému nastaveno vše potřebné a můžeme se přesunout k nastavení samotného Infraredu. Z GitHubu stáhneme nejnovější release a provedeme základní konfiguraci. Je důležité povolit podporu proxy protokolu, jinak na vašem serveru budou mít hráči adresu proxy! Zároveň si podporu proxy protokolu zapněte i na samotném Minecraft serveru.

Po tom, co nastavíte vaší Infrared proxy je potřeba ještě nastavit round-robin v DNS. To umožní rovnoměrné rozdělení hráčů mezi vaše proxy servery.

Nastavení Round-Robinu na Cloudflare pro subdoménu "proxy".

Teď už by vše mělo být hotové. Po zapnutí Infrared proxy stačí se připojit na adresu proxy.(vašedoména). Pokud došlo k připojení k serveru, máte vyhráno! Infrared navíc podporuje mnoho dalšího nastavení, to už by ale bylo vhodné na nový článek.

Na závěr

V tomto článku jsme si popsali, co je to DDoS, jak takový DDoS probíhá a jak se vůči němu ve světě Minecraftu dá bránit. Ochranu můžete vylepšovat i podle vlastních zkušeností, záleží na okolnostech.