Verschillen
Dit geeft de verschillen weer tussen de geselecteerde revisie en de huidige revisie van de pagina.
| Beide kanten vorige revisie Vorige revisie Volgende revisie | Vorige revisie | ||
| technische-infrastructuur:firewall [2026/08/23 10:58] – rroethof | technische-infrastructuur:firewall [2026/08/23 11:00] (huidige) – rroethof | ||
|---|---|---|---|
| Regel 1: | Regel 1: | ||
| - | # Firewall | + | # 🔥 Firewall |
| - | De Tulpencraft-servers gebruiken **firewalld** als host-based firewall. | + | De Tulpencraft-servers gebruiken **firewalld** als host-based firewall |
| - | + | ||
| - | De firewall vormt samen met de netwerkarchitectuur, | + | |
| - | + | ||
| - | De Tulpencraft-servers gebruiken | + | |
| De firewall vormt een belangrijke beveiligingslaag tussen het Tulpencraft-netwerk, | De firewall vormt een belangrijke beveiligingslaag tussen het Tulpencraft-netwerk, | ||
| - | Het uitgangspunt is: | + | Het uitgangspunt is eenvoudig: |
| > **Alles wat niet expliciet noodzakelijk is, wordt geblokkeerd.** | > **Alles wat niet expliciet noodzakelijk is, wordt geblokkeerd.** | ||
| Regel 17: | Regel 13: | ||
| --- | --- | ||
| - | ## Firewallarchitectuur | + | ## 🌐 Firewallarchitectuur |
| - | De netwerkarchitectuur is opgebouwd rond een centrale proxy: | + | De netwerkarchitectuur is opgebouwd rond een centrale proxy. |
| ```text | ```text | ||
| - | Internet | + | |
| - | | + | |
| - | | + | |
| - | | + | TCP :25565 |
| - | ┌─────────────────────┐ | + | │ |
| - | │ | + | ▼ |
| - | │ | + | ┌───────────────────┐ |
| - | └─────────┬───────────┘ | + | │ Velocity Proxy |
| - | │ | + | │ mc-proxy001 |
| - | │ intern netwerk | + | └─────────┬─────────┘ |
| - | ▼ | + | │ |
| - | ┌─────────────────────┐ | + | │ intern netwerk |
| - | │ Lobby │ | + | ▼ |
| - | │ | + | ┌───────────────────┐ |
| - | └─────────┬───────────┘ | + | │ |
| - | │ | + | │ |
| - | ├──────────► Survival VM | + | └─────────┬─────────┘ |
| - | │ | + | │ |
| - | ├──────────► Event servers | + | ┌─────────────┼─────────────┐ |
| - | │ | + | │ |
| - | └──────────► Toekomstige | + | ▼ |
| + | Survival | ||
| + | | ||
| ``` | ``` | ||
| Regel 51: | Regel 49: | ||
| --- | --- | ||
| - | ## Externe poorten | + | ## 🚪 Externe poorten |
| Alleen diensten die daadwerkelijk vanaf internet bereikbaar moeten zijn, krijgen een open firewallpoort. | Alleen diensten die daadwerkelijk vanaf internet bereikbaar moeten zijn, krijgen een open firewallpoort. | ||
| - | ### Minecraft | + | | Poort | Protocol | Dienst |
| - | + | | ------: | :------: | --------------------- | ---------------------- | | |
| - | | Poort | Protocol | Dienst | + | | `25565` | TCP | Velocity Proxy | Publiek |
| - | | ------: | :------: | --------------------- | ------------------------ | | + | | `8192` | TCP | Votifier / NuVotifier | Publiek, indien |
| - | | `25565` | TCP | Velocity Proxy | Publiek | + | | `24454` | UDP | Simple Voice Chat | Publiek, |
| - | | `8192` | TCP | Votifier / NuVotifier | Publiek, indien | + | |
| - | | `24454` | UDP | Simple Voice Chat | Publiek, | + | |
| - | De Minecraft-spelers verbinden uitsluitend met: | + | De primaire |
| ```text | ```text | ||
| Regel 73: | Regel 69: | ||
| --- | --- | ||
| - | ## Simple Voice Chat | + | ## 🎙️ |
| - | Voor proximity voice chat wordt **Simple Voice Chat** gebruikt. | + | Voor proximity voice chat wordt **Simple Voice Chat** gebruikt |
| Simple Voice Chat gebruikt standaard: | Simple Voice Chat gebruikt standaard: | ||
| Regel 83: | Regel 79: | ||
| ``` | ``` | ||
| - | Deze poort moet bereikbaar zijn vanaf internet. | + | Deze poort moet vanaf internet |
| - | Voor iedere server waarop | + | ```text |
| + | Speler | ||
| + | │ | ||
| + | ├── TCP 25565 ──────► Velocity | ||
| + | │ | ||
| + | └── UDP 24454 ──────► | ||
| + | ``` | ||
| + | |||
| + | Wanneer meerdere gameservers voice chat aanbieden en dezelfde publieke IP-adresruimte gebruiken, krijgt iedere server | ||
| Bijvoorbeeld: | Bijvoorbeeld: | ||
| | Server | | Server | ||
| - | | ---------------------- | ---------- | --------------: | + | | ---------------------- | :--------: | --------------: |
| - | | Survival | + | | Survival |
| - | | Events | + | | Events |
| - | | Toekomstige gameserver | Ja | eigen UDP-poort | | + | | Toekomstige gameserver | |
| De exacte poortindeling wordt vastgelegd zodra de betreffende gameservers worden ingericht. | De exacte poortindeling wordt vastgelegd zodra de betreffende gameservers worden ingericht. | ||
| - | > **Let op:** Simple Voice Chat kan niet worden behandeld als gewone Minecraft TCP-traffic. Alleen TCP 25565 openen is onvoldoende voor voice chat. | + | De Simple Voice Chat-configuratie bevindt zich bij Paper doorgaans in: |
| - | + | ||
| - | De configuratie bevindt zich bij Paper doorgaans in: | + | |
| ```text | ```text | ||
| Regel 105: | Regel 107: | ||
| ``` | ``` | ||
| - | De standaardconfiguratie gebruikt poort `24454`. | + | > Alleen TCP `25565` openen is onvoldoende voor Simple Voice Chat. De benodigde UDP-poort moet eveneens bereikbaar zijn. |
| --- | --- | ||
| - | ## Votifier / NuVotifier | + | ## 🗳️ |
| Voor toekomstige stemintegratie kan **NuVotifier** worden gebruikt. | Voor toekomstige stemintegratie kan **NuVotifier** worden gebruikt. | ||
| Regel 118: | Regel 120: | ||
| 8192/TCP | 8192/TCP | ||
| ``` | ``` | ||
| - | |||
| - | NuVotifier luistert standaard op TCP-poort `8192`, tenzij in de configuratie een andere poort wordt ingesteld. | ||
| Wanneer Votifier daadwerkelijk wordt geactiveerd, | Wanneer Votifier daadwerkelijk wordt geactiveerd, | ||
| ```text | ```text | ||
| - | Internet | + | Stemwebsite |
| - | | + | |
| - | | + | │ TCP 8192 |
| - | │ | + | ▼ |
| - | ▼ | + | ┌───────────────┐ |
| - | | + | │ NuVotifier |
| + | └───────┬───────┘ | ||
| + | │ | ||
| + | ▼ | ||
| + | Minecraft server | ||
| ``` | ``` | ||
| - | De Votifier-poort | + | De Votifier-poort |
| Het gebruikte Votifier-token wordt nooit in deze wiki opgeslagen. | Het gebruikte Votifier-token wordt nooit in deze wiki opgeslagen. | ||
| Regel 138: | Regel 142: | ||
| --- | --- | ||
| - | ## MySQL / MariaDB | + | ## 🗄️ |
| - | De database | + | De database |
| MySQL/ | MySQL/ | ||
| - | De standaardpoort: | + | De standaardpoort |
| ```text | ```text | ||
| Regel 150: | Regel 154: | ||
| ``` | ``` | ||
| - | wordt daarom | + | Deze poort wordt uitsluitend op het interne netwerk toegestaan. |
| - | + | ||
| - | Conceptueel: | + | |
| ```text | ```text | ||
| - | Internet | + | INTERNET |
| - | | + | │ |
| - | | + | │ ❌ TCP 3306 |
| - | | + | ▼ |
| - | Firewall | + | ┌─────────┐ |
| - | | + | |
| - | │ | + | |
| - | | + | │ |
| + | │ ✅ intern | ||
| + | ▼ | ||
| + | ┌───────────────┐ | ||
| + | │ MySQL/ | ||
| + | │ :3306 │ | ||
| + | └───────────────┘ | ||
| ``` | ``` | ||
| Regel 169: | Regel 177: | ||
| Bijvoorbeeld: | Bijvoorbeeld: | ||
| - | | Bron | Doel | + | | Bron | Doel |
| - | | -------- | -------- | ---------: | --------------- | | + | | -------- | -------- | ---------: | ------------- | |
| - | | Lobby | Database | `3306/TCP` | Intern | + | | Lobby | Database | `3306/TCP` | Intern |
| - | | Survival | Database | `3306/TCP` | Intern | + | | Survival | Database | `3306/TCP` | Intern |
| - | | Events | + | | Events |
| - | | Internet | Database | `3306/TCP` | **Geblokkeerd** | | + | | Internet | Database | `3306/TCP` | ❌ Geblokkeerd | |
| Wanneer de database in de toekomst naar een afzonderlijke VM wordt verplaatst, blijft hetzelfde beveiligingsprincipe gelden. | Wanneer de database in de toekomst naar een afzonderlijke VM wordt verplaatst, blijft hetzelfde beveiligingsprincipe gelden. | ||
| Regel 180: | Regel 188: | ||
| --- | --- | ||
| - | ## Backend Minecraft-servers | + | ## 🎮 Backend Minecraft-servers |
| Backendservers luisteren uitsluitend op interne adressen. | Backendservers luisteren uitsluitend op interne adressen. | ||
| - | Voorbeeld: | + | Bijvoorbeeld: |
| ```text | ```text | ||
| Regel 196: | Regel 204: | ||
| Deze poorten worden **niet** op de publieke interface geopend. | Deze poorten worden **niet** op de publieke interface geopend. | ||
| - | De firewall moet ervoor zorgen dat een externe gebruiker | + | Een speler mag bijvoorbeeld |
| ```text | ```text | ||
| Regel 207: | Regel 215: | ||
| < | < | ||
| ``` | ``` | ||
| + | |||
| + | De proxy verzorgt vervolgens de verbinding naar de backendservers. | ||
| --- | --- | ||
| - | ## SSH | + | ## 🔐 SSH |
| SSH wordt gebruikt voor systeembeheer. | SSH wordt gebruikt voor systeembeheer. | ||
| - | De SSH-poort wordt uitsluitend | + | SSH is uitsluitend |
| - | Wanneer mogelijk wordt SSH beperkt tot: | + | Het uitgangspunt is: |
| - | * vertrouwde beheeradressen; | + | * geen onnodige publieke SSH-toegang; |
| - | * het interne netwerk; | + | * alleen |
| - | * VPN-beheer; | + | * SSH key-based authentication; |
| - | * of andere expliciet toegestane beheerbronnen. | + | * root-login via SSH uitgeschakeld. |
| - | + | ||
| - | SSH gebruikt uitsluitend | + | |
| - | + | ||
| - | Root-login via SSH is uitgeschakeld. | + | |
| Zie ook: | Zie ook: | ||
| - | * [[technische-infrastructuur|Server hardening]] | + | * [[technische-infrastructuur: |
| - | * [[technische-infrastructuur|SELinux]] | + | * [[technische-infrastructuur:selinux|SELinux]] |
| --- | --- | ||
| - | ## firewalld | + | ## 🧱 firewalld |
| - | De firewall wordt beheerd met **firewalld**. | + | De host-firewall wordt beheerd met **firewalld**. |
| - | Basiscontrole: | + | De firewallstatus kan worden gecontroleerd met: |
| ```bash | ```bash | ||
| Regel 244: | Regel 250: | ||
| ``` | ``` | ||
| - | Actieve | + | De actieve |
| ```bash | ```bash | ||
| Regel 250: | Regel 256: | ||
| ``` | ``` | ||
| - | Alle zones bekijken: | + | Actieve |
| ```bash | ```bash | ||
| Regel 256: | Regel 262: | ||
| ``` | ``` | ||
| - | Beschikbare services: | + | Beschikbare services |
| ```bash | ```bash | ||
| Regel 264: | Regel 270: | ||
| --- | --- | ||
| - | ## Poort tijdelijk openen | + | ## ➕ Poort tijdelijk openen |
| Een poort kan tijdelijk worden geopend met: | Een poort kan tijdelijk worden geopend met: | ||
| Regel 272: | Regel 278: | ||
| ``` | ``` | ||
| - | Dit is vooral | + | Dit is vooral |
| - | Een tijdelijke | + | Een dergelijke |
| --- | --- | ||
| - | ## Poort permanent openen | + | ## 💾 Poort permanent openen |
| Wanneer een poort definitief onderdeel van de infrastructuur wordt: | Wanneer een poort definitief onderdeel van de infrastructuur wordt: | ||
| Regel 295: | Regel 301: | ||
| --- | --- | ||
| - | ## Voorbeeld: | + | ## 🎙️ |
| Voor de standaard voice-chatpoort: | Voor de standaard voice-chatpoort: | ||
| Regel 318: | Regel 324: | ||
| --- | --- | ||
| - | ## Voorbeeld: | + | ## 🗳️ |
| Wanneer NuVotifier actief wordt: | Wanneer NuVotifier actief wordt: | ||
| Regel 332: | Regel 338: | ||
| sudo firewall-cmd --list-ports | sudo firewall-cmd --list-ports | ||
| ``` | ``` | ||
| + | |||
| + | De poort wordt verwijderd wanneer Votifier niet langer wordt gebruikt. | ||
| --- | --- | ||
| - | ## MySQL intern toestaan | + | ## 🗄️ |
| - | MySQL moet niet met: | + | MySQL mag **niet zomaar publiek worden geopend** |
| ```bash | ```bash | ||
| - | --add-port=3306/ | + | sudo firewall-cmd --permanent |
| ``` | ``` | ||
| - | zonder verdere beperking publiek worden geopend. | + | Wanneer |
| - | + | ||
| - | Wanneer | + | |
| Bijvoorbeeld: | Bijvoorbeeld: | ||
| Regel 351: | Regel 357: | ||
| ```text | ```text | ||
| Lobby VM | Lobby VM | ||
| - | │ | + | |
| - | | + | │ TCP 3306 |
| - | | + | ▼ |
| Database VM | Database VM | ||
| ``` | ``` | ||
| - | De database accepteert | + | De database accepteert uitsluitend verbindingen vanuit bekende Tulpencraft-systemen. |
| --- | --- | ||
| - | ## Default-deny principe | + | ## 🚫 Default-deny principe |
| - | De firewall volgt zoveel mogelijk het principe: | + | De firewall volgt zoveel mogelijk het **default-deny-principe**. |
| + | |||
| + | Conceptueel: | ||
| ```text | ```text | ||
| - | Internet | + | |
| - | | + | |
| - | | + | |
| - | [ FIREWALL ] | + | |
| - | | + | |
| - | ├── | + | └─────┬──────┘ |
| - | ├── | + | │ |
| - | ├── UDP 24454 → Simple | + | ┌────────────┼────────────┐ |
| - | | + | |
| + | | ||
| + | TCP 25565 UDP 24454 TCP 8192 | ||
| + | | ||
| + | | ||
| + | | ||
| + | │ | ||
| + | | ||
| + | │ | ||
| + | ▼ | ||
| + | | ||
| ``` | ``` | ||
| - | Interne communicatie | + | Alleen verkeer dat expliciet noodzakelijk is, wordt toegestaan. |
| --- | --- | ||
| - | ## Geen directe backendtoegang | + | ## 🛡️ |
| Een belangrijk onderdeel van de beveiligingsarchitectuur is dat spelers nooit rechtstreeks met backendservers communiceren. | Een belangrijk onderdeel van de beveiligingsarchitectuur is dat spelers nooit rechtstreeks met backendservers communiceren. | ||
| Regel 398: | Regel 416: | ||
| ```text | ```text | ||
| Internet | Internet | ||
| - | │ | + | |
| - | | + | ▼ |
| Velocity Proxy | Velocity Proxy | ||
| - | │ | + | |
| - | | + | ▼ |
| Lobby | Lobby | ||
| - | │ | + | |
| - | | + | ├──► Survival |
| - | | + | ├──► Events |
| - | | + | └──► toekomstige servers |
| ``` | ``` | ||
| Regel 414: | Regel 432: | ||
| --- | --- | ||
| - | ## Toekomstige infrastructuur | + | ## 🚀 Toekomstige infrastructuur |
| Wanneer Tulpencraft verder groeit, kan de infrastructuur worden opgesplitst over meerdere VM's en/of fysieke nodes. | Wanneer Tulpencraft verder groeit, kan de infrastructuur worden opgesplitst over meerdere VM's en/of fysieke nodes. | ||
| Een mogelijke toekomstige inrichting: | Een mogelijke toekomstige inrichting: | ||
| - | |||
| - | ```text | ||
| - | Internet | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌──────────────┐ | ||
| - | │ Proxy │ | ||
| - | │ | ||
| - | └──────┬───────┘ | ||
| - | │ | ||
| - | ┌────────────┼────────────┐ | ||
| - | ▼ ▼ ▼ | ||
| - | | ||
| - | │ │ │ | ||
| - | └────────────┼────────────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | | ||
| - | ``` | ||
| - | |||
| - | Elke VM krijgt daarbij uitsluitend de netwerktoegang die daadwerkelijk noodzakelijk is. | ||
| - | |||
| - | --- | ||
| - | |||
| - | ## Firewallwijzigingen documenteren | ||
| - | |||
| - | Iedere structurele firewallwijziging moet worden gedocumenteerd. | ||
| - | |||
| - | Bijvoorbeeld: | ||
| - | |||
| - | ````text | ||
| - | Datum: | ||
| - | Server: | ||
| - | Poort: | ||
| - | Dienst: | ||
| - | Reden: | ||
| - | Toegang: | ||
| - | |||
| - | De Tulpencraft-servers gebruiken **firewalld** als host-based firewall. | ||
| - | |||
| - | Firewalld beheert netwerktoegang via zogenaamde **zones**, services, poorten en aanvullende regels. De configuratie kent daarbij een onderscheid tussen de actieve runtime-configuratie en de permanente configuratie. | ||
| - | |||
| - | De firewall vormt samen met de netwerkarchitectuur, | ||
| - | |||
| - | --- | ||
| - | |||
| - | ## 🎯 Doel | ||
| - | |||
| - | Het uitgangspunt voor de Tulpencraft-firewall is: | ||
| - | |||
| - | > **Alleen netwerkverkeer toestaan dat daadwerkelijk noodzakelijk is.** | ||
| - | |||
| - | Een service die lokaal draait, betekent niet automatisch dat deze vanaf het netwerk bereikbaar moet zijn. | ||
| - | |||
| - | Daarom wordt per server bepaald: | ||
| - | |||
| - | * welke services actief zijn; | ||
| - | * welke poorten noodzakelijk zijn; | ||
| - | * vanaf welke netwerken toegang nodig is; | ||
| - | * of een service publiek of uitsluitend intern bereikbaar moet zijn. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🌐 Netwerkarchitectuur | ||
| - | |||
| - | Tulpencraft gebruikt een centrale **Velocity Proxy** als toegangspunt. | ||
| ```text | ```text | ||
| | | ||
| - | │ | ||
| - | │ TCP 25565 | ||
| - | ▼ | ||
| - | ┌─────────────────┐ | ||
| - | │ Velocity Proxy │ | ||
| - | │ | ||
| - | └────────┬────────┘ | ||
| │ | │ | ||
| ▼ | ▼ | ||
| - | | + | |
| - | │ | + | │ |
| - | | + | │ Velocity |
| - | ▼ ▼ ▼ | + | └─────┬──────┘ |
| - | | + | |
| - | + | ||
| - | De Tulpencraft-servers gebruiken **firewalld** als host-based firewall. | + | |
| - | + | ||
| - | Firewalld beheert netwerktoegang via zogenaamde **zones**, services, poorten en aanvullende regels. De configuratie kent daarbij een onderscheid tussen de actieve runtime-configuratie en de permanente configuratie. | + | |
| - | + | ||
| - | De firewall vormt samen met de netwerkarchitectuur, | + | |
| - | + | ||
| - | --- | + | |
| - | + | ||
| - | ## 🎯 Doel | + | |
| - | + | ||
| - | Het uitgangspunt voor de Tulpencraft-firewall is: | + | |
| - | + | ||
| - | > **Alleen netwerkverkeer toestaan dat daadwerkelijk noodzakelijk is.** | + | |
| - | + | ||
| - | Een service die lokaal draait, betekent niet automatisch dat deze vanaf het netwerk bereikbaar moet zijn. | + | |
| - | + | ||
| - | Daarom wordt per server bepaald: | + | |
| - | + | ||
| - | * welke services actief zijn; | + | |
| - | * welke poorten noodzakelijk zijn; | + | |
| - | * vanaf welke netwerken toegang nodig is; | + | |
| - | * of een service publiek of uitsluitend intern bereikbaar moet zijn. | + | |
| - | + | ||
| - | --- | + | |
| - | + | ||
| - | # 🌐 Netwerkarchitectuur | + | |
| - | + | ||
| - | Tulpencraft gebruikt een centrale **Velocity Proxy** als toegangspunt. | + | |
| - | + | ||
| - | ```text | + | |
| - | | + | |
| │ | │ | ||
| - | │ TCP 25565 | + | |
| - | ▼ | + | |
| - | | + | |
| - | │ Velocity Proxy │ | + | |
| - | │ | + | |
| - | └────────┬────────┘ | + | |
| - | │ | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | ┌────────────┼────────────┐ | + | |
| - | ▼ ▼ ▼ | + | |
| - | | + | |
| - | ``` | + | |
| - | + | ||
| - | De backendservers zijn niet bedoeld om rechtst# Firewall | + | |
| - | + | ||
| - | De Tulpencraft-servers gebruiken **firewalld** als host-based firewall. | + | |
| - | + | ||
| - | Firewalld beheert netwerktoegang via zogenaamde **zones**, services, poorten en aanvullende regels. De configuratie kent daarbij een onderscheid tussen de actieve runtime-configuratie en de permanente configuratie. | + | |
| - | + | ||
| - | De firewall vormt samen met de netwerkarchitectuur, | + | |
| - | + | ||
| - | --- | + | |
| - | + | ||
| - | ## 🎯 Doel | + | |
| - | + | ||
| - | Het uitgangspunt voor de Tulpencraft-firewall is: | + | |
| - | + | ||
| - | > **Alleen netwerkverkeer toestaan dat daadwerkelijk noodzakelijk is.** | + | |
| - | + | ||
| - | Een service die lokaal draait, betekent niet automatisch dat deze vanaf het netwerk bereikbaar moet zijn. | + | |
| - | + | ||
| - | Daarom wordt per server bepaald: | + | |
| - | + | ||
| - | * welke services actief zijn; | + | |
| - | * welke poorten noodzakelijk zijn; | + | |
| - | * vanaf welke netwerken toegang nodig is; | + | |
| - | * of een service publiek of uitsluitend intern bereikbaar moet zijn. | + | |
| - | + | ||
| - | --- | + | |
| - | + | ||
| - | # 🌐 Netwerkarchitectuur | + | |
| - | + | ||
| - | Tulpencraft gebruikt een centrale **Velocity Proxy** als toegangspunt. | + | |
| - | + | ||
| - | ```text | + | |
| - | | + | |
| │ | │ | ||
| - | │ TCP 25565 | ||
| ▼ | ▼ | ||
| - | ┌─────────────────┐ | + | |
| - | │ Velocity Proxy │ | + | |
| - | │ | + | |
| - | └────────┬────────┘ | + | |
| - | │ | + | |
| - | ▼ | + | |
| - | | + | |
| - | │ | + | |
| - | ┌────────────┼────────────┐ | + | |
| - | ▼ ▼ ▼ | + | |
| - | | + | |
| ``` | ``` | ||
| - | De backendservers zijn niet bedoeld om rechtstreeks vanaf internet bereikbaar te zijn. | + | Elke VM krijgt daarbij uitsluitend de netwerktoegang die daadwerkelijk noodzakelijk is. |
| - | Dit betekent dat een speler niet rechtstreeks verbinding maakt met: | + | De exacte verdeling van VM's over Proxmox-nodes wordt afhankelijk van de benodigde resources en de groei van Tulpencraft |
| - | + | ||
| - | ```text | + | |
| - | Survival | + | |
| - | Lobby | + | |
| - | Events | + | |
| - | ``` | + | |
| - | + | ||
| - | maar altijd via de netwerkarchitectuur | + | |
| --- | --- | ||
| - | # 🔥 Firewalld | + | ## 📝 Firewallwijzigingen documenteren |
| - | De firewallservice wordt geleverd door `firewalld`. | + | Iedere structurele firewallwijziging |
| - | + | ||
| - | Status controleren: | + | |
| - | + | ||
| - | ```bash | + | |
| - | sudo firewall-cmd --state | + | |
| - | ``` | + | |
| - | + | ||
| - | Verwachte uitvoer: | + | |
| - | + | ||
| - | ```text | + | |
| - | running | + | |
| - | ``` | + | |
| - | + | ||
| - | De service kan worden gecontroleerd met: | + | |
| - | + | ||
| - | ```bash | + | |
| - | sudo systemctl status firewalld | + | |
| - | ``` | + | |
| - | + | ||
| - | Ingeschakeld bij het opstarten: | + | |
| - | + | ||
| - | ```bash | + | |
| - | sudo systemctl is-enabled firewalld | + | |
| - | ``` | + | |
| - | + | ||
| - | --- | + | |
| - | + | ||
| - | # 🗂️ Zones | + | |
| - | + | ||
| - | Firewalld gebruikt **zones** om een vertrouwensniveau aan netwerkverbindingen te koppelen. Interfaces en bronnen kunnen aan een zone worden gekoppeld en binnen die zone worden services en poorten toegestaan. | + | |
| - | + | ||
| - | De standaardzone kan worden bekeken met: | + | |
| - | + | ||
| - | ```bash | + | |
| - | sudo firewall-cmd --get-default-zone | + | |
| - | ``` | + | |
| - | + | ||
| - | Actieve zones: | + | |
| - | + | ||
| - | ```bash | + | |
| - | sudo firewall-cmd --get-active-zones | + | |
| - | ``` | + | |
| - | + | ||
| - | De configuratie van de actieve zone: | + | |
| - | + | ||
| - | ```bash | + | |
| - | sudo firewall-cmd --list-all | + | |
| - | ``` | + | |
| - | + | ||
| - | Alle zones: | + | |
| - | + | ||
| - | ```bash | + | |
| - | sudo firewall-cmd --list-all-zones | + | |
| - | ``` | + | |
| - | + | ||
| - | --- | + | |
| - | + | ||
| - | # 🌍 Public zone | + | |
| - | + | ||
| - | Voor een server met een publiek netwerkinterface wordt doorgaans de `public` zone gebruikt. | + | |
| - | + | ||
| - | Deze zone is bedoeld voor netwerken waarvan andere systemen niet automatisch worden vertrouwd. Alleen expliciet toegestane services en poorten worden beschikbaar gesteld. | + | |
| - | + | ||
| - | Voor Tulpencraft is dit met name relevant voor de proxy. | + | |
| - | + | ||
| - | --- | + | |
| - | + | ||
| - | # 🚪 Proxy-firewall | + | |
| - | + | ||
| - | De Velocity Proxy vormt het publieke toegangspunt van het Minecraft-netwerk. | + | |
| - | + | ||
| - | De belangrijkste publiek toegankelijke poort is: | + | |
| - | + | ||
| - | | Poort | Protocol | Doel | | + | |
| - | | ------: | -------- | -------------------- | | + | |
| - | | `25565` | TCP | Minecraft / Velocity | | + | |
| - | + | ||
| - | De poort wordt expliciet geopend: | + | |
| - | + | ||
| - | ```bash | + | |
| - | sudo firewall-cmd --permanent --zone=public --add-port=25565/ | + | |
| - | sudo firewall-cmd --reload | + | |
| - | ``` | + | |
| - | + | ||
| - | Controle: | + | |
| - | + | ||
| - | ```bash | + | |
| - | sudo firewall-cmd --zone=public --list-ports | + | |
| - | ``` | + | |
| - | + | ||
| - | Verwacht onder andere: | + | |
| - | + | ||
| - | ```text | + | |
| - | 25565/tcp | + | |
| - | ``` | + | |
| - | + | ||
| - | --- | + | |
| - | + | ||
| - | # 🔐 SSH | + | |
| - | + | ||
| - | SSH is een beheerinterface en wordt niet beschouwd als een Minecraft-netwerkdienst. | + | |
| - | + | ||
| - | Wanneer SSH publiek bereikbaar | + | |
| - | + | ||
| - | ```bash | + | |
| - | sudo firewall-cmd --permanent --zone=public --add-service=ssh | + | |
| - | sudo firewall-cmd --reload | + | |
| - | ``` | + | |
| - | + | ||
| - | Controle: | + | |
| - | + | ||
| - | ```bash | + | |
| - | sudo firewall-cmd --zone=public --list-services | + | |
| - | ``` | + | |
| - | + | ||
| - | SSH wordt daarnaast beschermd door de maatregelen beschreven in: | + | |
| - | + | ||
| - | [[technische-infrastructuur: | + | |
| - | + | ||
| - | waaronder: | + | |
| - | + | ||
| - | * SSH-sleutels; | + | |
| - | * uitschakelen van directe root-login; | + | |
| - | * uitschakelen van wachtwoordauthenticatie; | + | |
| - | * Fail2Ban; | + | |
| - | * beperkte gebruikersrechten. | + | |
| - | + | ||
| - | --- | + | |
| - | + | ||
| - | # 🏠 Backendservers | + | |
| - | + | ||
| - | Backendservers zoals Survival en Events worden niet publiek aangeboden. | + | |
| - | + | ||
| - | Het uitgangspunt is: | + | |
| - | + | ||
| - | ```text | + | |
| - | Internet | + | |
| - | │ | + | |
| - | X | + | |
| - | │ | + | |
| - | Survival | + | |
| - | ``` | + | |
| - | + | ||
| - | maar: | + | |
| - | + | ||
| - | ```text | + | |
| - | Internet | + | |
| - | │ | + | |
| - | ▼ | + | |
| - | Velocity | + | |
| - | │ | + | |
| - | ▼ | + | |
| - | Survival | + | |
| - | ``` | + | |
| - | + | ||
| - | De firewall op een backendserver moet daarom geen algemene publieke Minecraft-poort openen. | + | |
| - | + | ||
| - | De exacte interne netwerkregels zijn afhankelijk van de uiteindelijke netwerkconfiguratie van de Tulpencraft-infrastructuur. | + | |
| - | + | ||
| - | --- | + | |
| - | + | ||
| - | # 🏠 Lobby | + | |
| - | + | ||
| - | De lobby bevindt zich momenteel op dezelfde host als de proxy: | + | |
| - | + | ||
| - | ```text | + | |
| - | mc-proxy001 | + | |
| - | │ | + | |
| - | ├── Velocity | + | |
| - | │ | + | |
| - | └── Lobby | + | |
| - | ``` | + | |
| - | + | ||
| - | Dit is onderdeel van de huidige kosten- en infrastructuurkeuze. | + | |
| - | + | ||
| - | Omdat de lobby lokaal op dezelfde host draait als Velocity, hoeft de lobbypoort niet publiek beschikbaar te worden gesteld voor spelers. | + | |
| - | + | ||
| - | De proxy communiceert lokaal met de lobby. | + | |
| - | + | ||
| - | --- | + | |
| - | + | ||
| - | # 🧱 Survival | + | |
| - | + | ||
| - | Survival draait als afzonderlijke VM op de huidige Proxmox-infrastructuur. | + | |
| - | + | ||
| - | De server is niet bedoeld als publiek Minecraft-entrypoint. | + | |
| - | + | ||
| - | De gewenste netwerkstroom is: | + | |
| - | + | ||
| - | ```text | + | |
| - | Speler | + | |
| - | │ | + | |
| - | ▼ | + | |
| - | Velocity | + | |
| - | │ | + | |
| - | ▼ | + | |
| - | Survival | + | |
| - | ``` | + | |
| - | + | ||
| - | Niet: | + | |
| - | + | ||
| - | ```text | + | |
| - | Speler | + | |
| - | │ | + | |
| - | ▼ | + | |
| - | Survival | + | |
| - | ``` | + | |
| - | + | ||
| - | De firewall en netwerkconfiguratie moeten deze architectuur ondersteunen. | + | |
| - | + | ||
| - | --- | + | |
| - | + | ||
| - | # 🎮 Events | + | |
| - | + | ||
| - | Voor toekomstige Events-servers geldt hetzelfde uitgangspunt. | + | |
| - | + | ||
| - | Een Events-server wordt niet zelfstandig aan het internet blootgesteld wanneer dit niet noodzakelijk is. | + | |
| - | + | ||
| - | De gewenste architectuur is: | + | |
| - | + | ||
| - | ```text | + | |
| - | Speler | + | |
| - | │ | + | |
| - | ▼ | + | |
| - | Velocity | + | |
| - | │ | + | |
| - | ▼ | + | |
| - | Events | + | |
| - | ``` | + | |
| - | + | ||
| - | Eventuele uitzonderingen moeten | + | |
| - | + | ||
| - | --- | + | |
| - | + | ||
| - | # 📦 Services versus poorten | + | |
| - | + | ||
| - | Firewalld ondersteunt zowel vooraf gedefinieerde services als losse poortdefinities. | + | |
| - | + | ||
| - | Een service is een verzameling van bijbehorende netwerkregels, | + | |
| - | + | ||
| - | Voor standaarddiensten heeft het daarom de voorkeur om een service te gebruiken: | + | |
| - | + | ||
| - | ```bash | + | |
| - | sudo firewall-cmd --permanent --add-service=ssh | + | |
| - | ``` | + | |
| - | + | ||
| - | Voor applicaties zonder geschikte standaardservice kan een specifieke poort worden geopend: | + | |
| - | + | ||
| - | ```bash | + | |
| - | sudo firewall-cmd --permanent --add-port=25565/ | + | |
| - | ``` | + | |
| - | + | ||
| - | Daarna: | + | |
| - | + | ||
| - | ```bash | + | |
| - | sudo firewall-cmd --reload | + | |
| - | ``` | + | |
| - | + | ||
| - | --- | + | |
| - | + | ||
| - | # ⚠️ Runtime versus permanent | + | |
| - | + | ||
| - | Firewalld kent twee configuratielagen: | + | |
| - | + | ||
| - | ### Runtime | + | |
| - | + | ||
| - | Een runtime-regel wordt direct actief, maar is niet automatisch blijvend na een reload of reboot. | + | |
| Bijvoorbeeld: | Bijvoorbeeld: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --add-port=25565/ | ||
| - | ``` | ||
| - | |||
| - | ### Permanent | ||
| - | |||
| - | Een permanente regel wordt opgeslagen in de firewallconfiguratie: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --add-port=25565/ | ||
| - | ``` | ||
| - | |||
| - | Daarna wordt de actieve configuratie opnieuw geladen: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Voor productieservers gebruiken we bij voorkeur **permanente configuratie**, | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔍 Firewallconfiguratie controleren | ||
| - | |||
| - | Volledige configuratie: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-all | ||
| - | ``` | ||
| - | |||
| - | Alle actieve zones: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-all-zones | ||
| - | ``` | ||
| - | |||
| - | Openstaande services: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-services | ||
| - | ``` | ||
| - | |||
| - | Openstaande poorten: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-ports | ||
| - | ``` | ||
| - | |||
| - | Beschikbare services: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --get-services | ||
| - | ``` | ||
| - | |||
| - | De actieve interfaces: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --get-active-zones | ||
| - | ``` | ||
| - | |||
| - | Deze commando' | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 👀 Luisterende poorten controleren | ||
| - | |||
| - | De firewallconfiguratie vertelt niet welke applicaties daadwerkelijk luisteren. | ||
| - | |||
| - | Daarom wordt ook gecontroleerd met: | ||
| - | |||
| - | ```bash | ||
| - | sudo ss -tulpn | ||
| - | ``` | ||
| - | |||
| - | Dit maakt bijvoorbeeld zichtbaar: | ||
| ```text | ```text | ||
| - | Velocity | + | Datum: |
| - | └── 0.0.0.0:25565 | + | Server: mc-proxy001 |
| - | + | Poort: | |
| - | SSH | + | Dienst: |
| - | └── 0.0.0.0:22 | + | Reden: |
| + | Toegang: | ||
| ``` | ``` | ||
| - | |||
| - | Een belangrijke securitycontrole is daarom: | ||
| - | |||
| - | > **Welke poorten luisteren daadwerkelijk, | ||
| - | |||
| - | Een poort die niet nodig is, moet bij voorkeur helemaal niet door een applicatie worden geopend. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🧪 Nieuwe poort openen | ||
| - | |||
| - | Wanneer een nieuwe service een netwerkpoort nodig heeft, wordt eerst bepaald: | ||
| - | |||
| - | 1. waarom de poort nodig is; | ||
| - | 2. of de service publiek of intern moet zijn; | ||
| - | 3. welk protocol noodzakelijk is; | ||
| - | 4. vanaf welke bronnen toegang noodzakelijk is; | ||
| - | 5. of een bestaande firewalld-service gebruikt kan worden. | ||
| - | |||
| - | Daarna wordt de regel toegevoegd. | ||
| - | |||
| - | Bijvoorbeeld: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --add-port=< | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Daarna controleren: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --zone=public --list-all | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🗑️ Poort verwijderen | ||
| - | |||
| - | Wanneer een dienst niet meer nodig is, wordt de firewallregel verwijderd. | ||
| - | |||
| - | Bijvoorbeeld: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --remove-port=25565/ | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Daarna: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --zone=public --list-ports | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔒 Bron-IP beperken | ||
| - | |||
| - | Niet iedere service hoeft vanaf het volledige internet bereikbaar te zijn. | ||
| - | |||
| - | Wanneer een service bijvoorbeeld uitsluitend vanaf een beheer-IP of intern netwerk bereikbaar moet zijn, kan firewalld hiervoor uitgebreidere regels gebruiken. | ||
| - | |||
| - | Hiervoor kunnen onder andere **rich rules** worden gebruikt. Firewalld ondersteunt hiermee bron- en bestemmingsadressen, | ||
| - | |||
| - | Voorbeeldconcept: | ||
| - | |||
| - | ```text | ||
| - | Internet | ||
| - | │ | ||
| - | X | ||
| - | │ | ||
| - | beheerpoort | ||
| - | |||
| - | Beheer-IP | ||
| - | │ | ||
| - | ▼ | ||
| - | beheerpoort | ||
| - | ``` | ||
| - | |||
| - | Dit heeft de voorkeur boven een publiek toegankelijke beheerinterface wanneer de netwerkarchitectuur dit mogelijk maakt. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 📝 Logging | ||
| - | |||
| - | Firewallgebeurtenissen kunnen onderdeel zijn van de algemene serverlogging. | ||
| - | |||
| - | De firewallservice: | ||
| - | |||
| - | ```bash | ||
| - | sudo journalctl -u firewalld | ||
| - | ``` | ||
| - | |||
| - | Daarnaast kunnen kernel/ | ||
| - | |||
| - | Firewalllogging wordt niet zonder reden maximaal aangezet. | ||
| - | |||
| - | Te uitgebreide logging kan zelf aanzienlijke hoeveelheden logdata produceren. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🛡️ Firewall en Fail2Ban | ||
| - | |||
| - | Firewalld en Fail2Ban vullen elkaar aan. | ||
| - | |||
| - | ```text | ||
| - | ┌──────────────┐ | ||
| - | Internet ────────►│ | ||
| - | └──────┬───────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | SSH / services | ||
| - | │ | ||
| - | ▼ | ||
| - | logbestanden | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌──────────┐ | ||
| - | │ Fail2Ban │ | ||
| - | └────┬─────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | | ||
| - | ``` | ||
| - | |||
| - | Firewalld bepaalt welke netwerktoegang überhaupt mogelijk is. | ||
| - | |||
| - | Fail2Ban reageert vervolgens op herhaaldelijk ongewenst gedrag, bijvoorbeeld brute-forcepogingen op SSH. | ||
| - | |||
| - | Zie: | ||
| - | |||
| - | [[technische-infrastructuur: | ||
| - | |||
| - | voor de volledige hardeningconfiguratie. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔄 Wijzigingen documenteren | ||
| - | |||
| - | Firewallwijzigingen worden gedocumenteerd wanneer ze structureel onderdeel worden van de serverconfiguratie. | ||
| - | |||
| - | Bijvoorbeeld: | ||
| - | |||
| - | | Onderdeel | Waarde | ||
| - | | --------- | --------------------- | | ||
| - | | Server | ||
| - | | Zone | `public` | ||
| - | | Poort | `25565/ | ||
| - | | Dienst | ||
| - | | Bereik | ||
| - | | Reden | Minecraft-ingangspunt | | ||
| - | | Status | ||
| - | |||
| - | Hierdoor blijft duidelijk waarom een poort geopend is. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 📋 Firewall-baseline | ||
| - | |||
| - | Een nieuwe Tulpencraft-server moet minimaal worden gecontroleerd op: | ||
| - | |||
| - | * [ ] firewalld geïnstalleerd | ||
| - | * [ ] firewalld actief | ||
| - | * [ ] firewalld ingeschakeld bij boot | ||
| - | * [ ] juiste zone vastgesteld | ||
| - | * [ ] alleen noodzakelijke services toegestaan | ||
| - | * [ ] alleen noodzakelijke poorten toegestaan | ||
| - | * [ ] publieke en interne services onderscheiden | ||
| - | * [ ] luisterende poorten gecontroleerd met `ss` | ||
| - | * [ ] permanente configuratie gecontroleerd | ||
| - | * [ ] firewallconfiguratie na reload gecontroleerd | ||
| - | * [ ] SSH-toegang getest | ||
| - | * [ ] Minecraft-netwerktoegang getest | ||
| - | * [ ] backendservers niet onnodig publiek bereikbaar | ||
| - | * [ ] firewallwijzigingen gedocumenteerd | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🌷 Tulpencraft firewallbeleid | ||
| - | |||
| - | De firewall is geen vervanging voor een correcte netwerkarchitectuur. | ||
| - | |||
| - | Tulpencraft gebruikt daarom meerdere beveiligingslagen: | ||
| - | |||
| - | ```text | ||
| - | Internet | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌───────────────────────┐ | ||
| - | │ | ||
| - | └──────────┬────────────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌───────────────────────┐ | ||
| - | │ firewalld | ||
| - | └──────────┬────────────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌───────────────────────┐ | ||
| - | │ Velocity Proxy │ | ||
| - | └──────────┬────────────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌───────────────────────┐ | ||
| - | │ Backend servers | ||
| - | │ Lobby / Survival etc. │ | ||
| - | └───────────────────────┘ | ||
| - | ``` | ||
| - | |||
| - | Daarbovenop worden onder andere **SELinux**, | ||
| - | |||
| - | Het uitgangspunt blijft: | ||
| - | |||
| - | > **Een service die niet bereikbaar hoeft te zijn, wordt niet bereikbaar gemaakt.** | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔗 Gerelateerde documentatie | ||
| - | |||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | |||
| - | --- | ||
| - | |||
| - | > **Tulpencraft firewall baseline** | ||
| - | > | ||
| - | > De firewall wordt ingericht volgens het principe **least exposure**: alleen noodzakelijke netwerktoegang wordt toegestaan en backendservers worden niet rechtstreeks aan het publieke internet blootgesteld. | ||
| - | reeks vanaf internet bereikbaar te zijn. | ||
| - | |||
| - | Dit betekent dat een speler niet rechtstreeks verbinding maakt met: | ||
| - | |||
| - | ```text | ||
| - | Survival | ||
| - | Lobby | ||
| - | Events | ||
| - | ``` | ||
| - | |||
| - | maar altijd via de netwerkarchitectuur van Tulpencraft. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔥 Firewalld | ||
| - | |||
| - | De firewallservice wordt geleverd door `firewalld`. | ||
| - | |||
| - | Status controleren: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --state | ||
| - | ``` | ||
| - | |||
| - | Verwachte uitvoer: | ||
| - | |||
| - | ```text | ||
| - | running | ||
| - | ``` | ||
| - | |||
| - | De service kan worden gecontroleerd met: | ||
| - | |||
| - | ```bash | ||
| - | sudo systemctl status firewalld | ||
| - | ``` | ||
| - | |||
| - | Ingeschakeld bij het opstarten: | ||
| - | |||
| - | ```bash | ||
| - | sudo systemctl is-enabled firewalld | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🗂️ Zones | ||
| - | |||
| - | Firewalld gebruikt **zones** om een vertrouwensniveau aan netwerkverbindingen te koppelen. Interfaces en bronnen kunnen aan een zone worden gekoppeld en binnen die zone worden services en poorten toegestaan. | ||
| - | |||
| - | De standaardzone kan worden bekeken met: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --get-default-zone | ||
| - | ``` | ||
| - | |||
| - | Actieve zones: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --get-active-zones | ||
| - | ``` | ||
| - | |||
| - | De configuratie van de actieve zone: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-all | ||
| - | ``` | ||
| - | |||
| - | Alle zones: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-all-zones | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🌍 Public zone | ||
| - | |||
| - | Voor een server met een publiek netwerkinterface wordt doorgaans de `public` zone gebruikt. | ||
| - | |||
| - | Deze zone is bedoeld voor netwerken waarvan andere systemen niet automatisch worden vertrouwd. Alleen expliciet toegestane services en poorten worden beschikbaar gesteld. | ||
| - | |||
| - | Voor Tulpencraft is dit met name relevant voor de proxy. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🚪 Proxy-firewall | ||
| - | |||
| - | De Velocity Proxy vormt het publieke toegangspunt van het Minecraft-netwerk. | ||
| - | |||
| - | De belangrijkste publiek toegankelijke poort is: | ||
| - | |||
| - | | Poort | Protocol | Doel | | ||
| - | | ------: | -------- | -------------------- | | ||
| - | | `25565` | TCP | Minecraft / Velocity | | ||
| - | |||
| - | De poort wordt expliciet geopend: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --add-port=25565/ | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Controle: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --zone=public --list-ports | ||
| - | ``` | ||
| - | |||
| - | Verwacht onder andere: | ||
| - | |||
| - | ```text | ||
| - | 25565/tcp | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔐 SSH | ||
| - | |||
| - | SSH is een beheerinterface en wordt niet beschouwd als een Minecraft-netwerkdienst. | ||
| - | |||
| - | Wanneer SSH publiek bereikbaar moet zijn, wordt de SSH-service expliciet toegestaan: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --add-service=ssh | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Controle: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --zone=public --list-services | ||
| - | ``` | ||
| - | |||
| - | SSH wordt daarnaast beschermd door de maatregelen beschreven in: | ||
| - | |||
| - | [[technische-infrastructuur: | ||
| - | |||
| - | waaronder: | ||
| - | |||
| - | * SSH-sleutels; | ||
| - | * uitschakelen van directe root-login; | ||
| - | * uitschakelen van wachtwoordauthenticatie; | ||
| - | * Fail2Ban; | ||
| - | * beperkte gebruikersrechten. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🏠 Backendservers | ||
| - | |||
| - | Backendservers zoals Survival en Events worden niet publiek aangeboden. | ||
| - | |||
| - | Het uitgangspunt is: | ||
| - | |||
| - | ```text | ||
| - | Internet | ||
| - | │ | ||
| - | X | ||
| - | │ | ||
| - | Survival | ||
| - | ``` | ||
| - | |||
| - | maar: | ||
| - | |||
| - | ```text | ||
| - | Internet | ||
| - | │ | ||
| - | ▼ | ||
| - | Velocity | ||
| - | │ | ||
| - | ▼ | ||
| - | Survival | ||
| - | ``` | ||
| - | |||
| - | De firewall op een backendserver moet daarom geen algemene publieke Minecraft-poort openen. | ||
| - | |||
| - | De exacte interne netwerkregels zijn afhankelijk van de uiteindelijke netwerkconfiguratie van de Tulpencraft-infrastructuur. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🏠 Lobby | ||
| - | |||
| - | De lobby bevindt zich momenteel op dezelfde host als de proxy: | ||
| - | |||
| - | ```text | ||
| - | mc-proxy001 | ||
| - | │ | ||
| - | ├── Velocity | ||
| - | │ | ||
| - | └── Lobby | ||
| - | ``` | ||
| - | |||
| - | Dit is onderdeel van de huidige kosten- en infrastructuurkeuze. | ||
| - | |||
| - | Omdat de lobby lokaal op dezelfde host draait als Velocity, hoeft de lobbypoort niet publiek beschikbaar te worden gesteld voor spelers. | ||
| - | |||
| - | De proxy communiceert lokaal met de lobby. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🧱 Survival | ||
| - | |||
| - | Survival draait als afzonderlijke VM op de huidige Proxmox-infrastructuur. | ||
| - | |||
| - | De server is niet bedoeld als publiek Minecraft-entrypoint. | ||
| - | |||
| - | De gewenste netwerkstroom is: | ||
| - | |||
| - | ```text | ||
| - | Speler | ||
| - | │ | ||
| - | ▼ | ||
| - | Velocity | ||
| - | │ | ||
| - | ▼ | ||
| - | Survival | ||
| - | ``` | ||
| - | |||
| - | Niet: | ||
| - | |||
| - | ```text | ||
| - | Speler | ||
| - | │ | ||
| - | ▼ | ||
| - | Survival | ||
| - | ``` | ||
| - | |||
| - | De firewall en netwerkconfiguratie moeten deze architectuur ondersteunen. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🎮 Events | ||
| - | |||
| - | Voor toekomstige Events-servers geldt hetzelfde uitgangspunt. | ||
| - | |||
| - | Een Events-server wordt niet zelfstandig aan het internet blootgesteld wanneer dit niet noodzakelijk is. | ||
| - | |||
| - | De gewenste architectuur is: | ||
| - | |||
| - | ```text | ||
| - | Speler | ||
| - | │ | ||
| - | ▼ | ||
| - | Velocity | ||
| - | │ | ||
| - | ▼ | ||
| - | Events | ||
| - | ``` | ||
| - | |||
| - | Eventuele uitzonderingen moeten worden gedocumenteerd. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 📦 Services versus poorten | ||
| - | |||
| - | Firewalld ondersteunt zowel vooraf gedefinieerde services als losse poortdefinities. | ||
| - | |||
| - | Een service is een verzameling van bijbehorende netwerkregels, | ||
| - | |||
| - | Voor standaarddiensten heeft het daarom de voorkeur om een service te gebruiken: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --add-service=ssh | ||
| - | ``` | ||
| - | |||
| - | Voor applicaties zonder geschikte standaardservice kan een specifieke poort worden geopend: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --add-port=25565/ | ||
| - | ``` | ||
| - | |||
| - | Daarna: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # ⚠️ Runtime versus permanent | ||
| - | |||
| - | Firewalld kent twee configuratielagen: | ||
| - | |||
| - | ### Runtime | ||
| - | |||
| - | Een runtime-regel wordt direct actief, maar is niet automatisch blijvend na een reload of reboot. | ||
| - | |||
| - | Bijvoorbeeld: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --add-port=25565/ | ||
| - | ``` | ||
| - | |||
| - | ### Permanent | ||
| - | |||
| - | Een permanente regel wordt opgeslagen in de firewallconfiguratie: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --add-port=25565/ | ||
| - | ``` | ||
| - | |||
| - | Daarna wordt de actieve configuratie opnieuw geladen: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Voor productieservers gebruiken we bij voorkeur **permanente configuratie**, | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔍 Firewallconfiguratie controleren | ||
| - | |||
| - | Volledige configuratie: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-all | ||
| - | ``` | ||
| - | |||
| - | Alle actieve zones: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-all-zones | ||
| - | ``` | ||
| - | |||
| - | Openstaande services: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-services | ||
| - | ``` | ||
| - | |||
| - | Openstaande poorten: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-ports | ||
| - | ``` | ||
| - | |||
| - | Beschikbare services: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --get-services | ||
| - | ``` | ||
| - | |||
| - | De actieve interfaces: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --get-active-zones | ||
| - | ``` | ||
| - | |||
| - | Deze commando' | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 👀 Luisterende poorten controleren | ||
| - | |||
| - | De firewallconfiguratie vertelt niet welke applicaties daadwerkelijk luisteren. | ||
| - | |||
| - | Daarom wordt ook gecontroleerd met: | ||
| - | |||
| - | ```bash | ||
| - | sudo ss -tulpn | ||
| - | ``` | ||
| - | |||
| - | Dit maakt bijvoorbeeld zichtbaar: | ||
| - | |||
| - | ```text | ||
| - | Velocity | ||
| - | | ||
| - | |||
| - | SSH | ||
| - | | ||
| - | ``` | ||
| - | |||
| - | Een belangrijke securitycontrole is daarom: | ||
| - | |||
| - | > **Welke poorten luisteren daadwerkelijk, | ||
| - | |||
| - | Een poort die niet nodig is, moet bij voorkeur helemaal niet door een applicatie worden geopend. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🧪 Nieuwe poort openen | ||
| - | |||
| - | Wanneer een nieuwe service een netwerkpoort nodig heeft, wordt eerst bepaald: | ||
| - | |||
| - | 1. waarom de poort nodig is; | ||
| - | 2. of de service publiek of intern moet zijn; | ||
| - | 3. welk protocol noodzakelijk is; | ||
| - | 4. vanaf welke bronnen toegang noodzakelijk is; | ||
| - | 5. of een bestaande firewalld-service gebruikt kan worden. | ||
| - | |||
| - | Daarna wordt de regel toegevoegd. | ||
| - | |||
| - | Bijvoorbeeld: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --add-port=< | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Daarna controleren: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --zone=public --list-all | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🗑️ Poort verwijderen | ||
| - | |||
| - | Wanneer een dienst niet meer nodig is, wordt de firewallregel verwijderd. | ||
| - | |||
| - | Bijvoorbeeld: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --remove-port=25565/ | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Daarna: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --zone=public --list-ports | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔒 Bron-IP beperken | ||
| - | |||
| - | Niet iedere service hoeft vanaf het volledige internet bereikbaar te zijn. | ||
| - | |||
| - | Wanneer een service bijvoorbeeld uitsluitend vanaf een beheer-IP of intern netwerk bereikbaar moet zijn, kan firewalld hiervoor uitgebreidere regels gebruiken. | ||
| - | |||
| - | Hiervoor kunnen onder andere **rich rules** worden gebruikt. Firewalld ondersteunt hiermee bron- en bestemmingsadressen, | ||
| - | |||
| - | Voorbeeldconcept: | ||
| - | |||
| - | ```text | ||
| - | Internet | ||
| - | │ | ||
| - | X | ||
| - | │ | ||
| - | beheerpoort | ||
| - | |||
| - | Beheer-IP | ||
| - | │ | ||
| - | ▼ | ||
| - | beheerpoort | ||
| - | ``` | ||
| - | |||
| - | Dit heeft de voorkeur boven een publiek toegankelijke beheerinterface wanneer de netwerkarchitectuur dit mogelijk maakt. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 📝 Logging | ||
| - | |||
| - | Firewallgebeurtenissen kunnen onderdeel zijn van de algemene serverlogging. | ||
| - | |||
| - | De firewallservice: | ||
| - | |||
| - | ```bash | ||
| - | sudo journalctl -u firewalld | ||
| - | ``` | ||
| - | |||
| - | Daarnaast kunnen kernel/ | ||
| - | |||
| - | Firewalllogging wordt niet zonder reden maximaal aangezet. | ||
| - | |||
| - | Te uitgebreide logging kan zelf aanzienlijke hoeveelheden logdata produceren. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🛡️ Firewall en Fail2Ban | ||
| - | |||
| - | Firewalld en Fail2Ban vullen elkaar aan. | ||
| - | |||
| - | ```text | ||
| - | ┌──────────────┐ | ||
| - | Internet ────────►│ | ||
| - | └──────┬───────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | SSH / services | ||
| - | │ | ||
| - | ▼ | ||
| - | logbestanden | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌──────────┐ | ||
| - | │ Fail2Ban │ | ||
| - | └────┬─────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | | ||
| - | ``` | ||
| - | |||
| - | Firewalld bepaalt welke netwerktoegang überhaupt mogelijk is. | ||
| - | |||
| - | Fail2Ban reageert vervolgens op herhaaldelijk ongewenst gedrag, bijvoorbeeld brute-forcepogingen op SSH. | ||
| - | |||
| - | Zie: | ||
| - | |||
| - | [[technische-infrastructuur: | ||
| - | |||
| - | voor de volledige hardeningconfiguratie. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔄 Wijzigingen documenteren | ||
| - | |||
| - | Firewallwijzigingen worden gedocumenteerd wanneer ze structureel onderdeel worden van de serverconfiguratie. | ||
| - | |||
| - | Bijvoorbeeld: | ||
| - | |||
| - | | Onderdeel | Waarde | ||
| - | | --------- | --------------------- | | ||
| - | | Server | ||
| - | | Zone | `public` | ||
| - | | Poort | `25565/ | ||
| - | | Dienst | ||
| - | | Bereik | ||
| - | | Reden | Minecraft-ingangspunt | | ||
| - | | Status | ||
| - | |||
| - | Hierdoor blijft duidelijk waarom een poort geopend is. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 📋 Firewall-baseline | ||
| - | |||
| - | Een nieuwe Tulpencraft-server moet minimaal worden gecontroleerd op: | ||
| - | |||
| - | * [ ] firewalld geïnstalleerd | ||
| - | * [ ] firewalld actief | ||
| - | * [ ] firewalld ingeschakeld bij boot | ||
| - | * [ ] juiste zone vastgesteld | ||
| - | * [ ] alleen noodzakelijke services toegestaan | ||
| - | * [ ] alleen noodzakelijke poorten toegestaan | ||
| - | * [ ] publieke en interne services onderscheiden | ||
| - | * [ ] luisterende poorten gecontroleerd met `ss` | ||
| - | * [ ] permanente configuratie gecontroleerd | ||
| - | * [ ] firewallconfiguratie na reload gecontroleerd | ||
| - | * [ ] SSH-toegang getest | ||
| - | * [ ] Minecraft-netwerktoegang getest | ||
| - | * [ ] backendservers niet onnodig publiek bereikbaar | ||
| - | * [ ] firewallwijzigingen gedocumenteerd | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🌷 Tulpencraft firewallbeleid | ||
| - | |||
| - | De firewall is geen vervanging voor een correcte netwerkarchitectuur. | ||
| - | |||
| - | Tulpencraft gebruikt daarom meerdere beveiligingslagen: | ||
| - | |||
| - | ```text | ||
| - | Internet | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌───────────────────────┐ | ||
| - | │ | ||
| - | └──────────┬────────────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌───────────────────────┐ | ||
| - | │ firewalld | ||
| - | └──────────┬────────────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌───────────────────────┐ | ||
| - | │ Velocity Proxy │ | ||
| - | └──────────┬────────────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌───────────────────────┐ | ||
| - | │ Backend servers | ||
| - | │ Lobby / Survival etc. │ | ||
| - | └───────────────────────┘ | ||
| - | ``` | ||
| - | |||
| - | Daarbovenop worden onder andere **SELinux**, | ||
| - | |||
| - | Het uitgangspunt blijft: | ||
| - | |||
| - | > **Een service die niet bereikbaar hoeft te zijn, wordt niet bereikbaar gemaakt.** | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔗 Gerelateerde documentatie | ||
| - | |||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | |||
| - | --- | ||
| - | |||
| - | > **Tulpencraft firewall baseline** | ||
| - | > | ||
| - | > De firewall wordt ingericht volgens het principe **least exposure**: alleen noodzakelijke netwerktoegang wordt toegestaan en backendservers worden niet rechtstreeks aan het publieke internet blootgesteld. | ||
| - | t | ||
| - | ``` | ||
| - | |||
| - | De backendservers zijn niet bedoeld om rechtstreeks vanaf internet bereikbaar te zijn. | ||
| - | |||
| - | Dit betekent dat een speler niet rechtstreeks verbinding maakt met: | ||
| - | |||
| - | ```text | ||
| - | Survival | ||
| - | Lobby | ||
| - | Events | ||
| - | ``` | ||
| - | |||
| - | maar altijd via de netwerkarchitectuur van Tulpencraft. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔥 Firewalld | ||
| - | |||
| - | De firewallservice wordt geleverd door `firewalld`. | ||
| - | |||
| - | Status controleren: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --state | ||
| - | ``` | ||
| - | |||
| - | Verwachte uitvoer: | ||
| - | |||
| - | ```text | ||
| - | running | ||
| - | ``` | ||
| - | |||
| - | De service kan worden gecontroleerd met: | ||
| - | |||
| - | ```bash | ||
| - | sudo systemctl status firewalld | ||
| - | ``` | ||
| - | |||
| - | Ingeschakeld bij het opstarten: | ||
| - | |||
| - | ```bash | ||
| - | sudo systemctl is-enabled firewalld | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🗂️ Zones | ||
| - | |||
| - | Firewalld gebruikt **zones** om een vertrouwensniveau aan netwerkverbindingen te koppelen. Interfaces en bronnen kunnen aan een zone worden gekoppeld en binnen die zone worden services en poorten toegestaan. | ||
| - | |||
| - | De standaardzone kan worden bekeken met: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --get-default-zone | ||
| - | ``` | ||
| - | |||
| - | Actieve zones: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --get-active-zones | ||
| - | ``` | ||
| - | |||
| - | De configuratie van de actieve zone: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-all | ||
| - | ``` | ||
| - | |||
| - | Alle zones: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-all-zones | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🌍 Public zone | ||
| - | |||
| - | Voor een server met een publiek netwerkinterface wordt doorgaans de `public` zone gebruikt. | ||
| - | |||
| - | Deze zone is bedoeld voor netwerken waarvan andere systemen niet automatisch worden vertrouwd. Alleen expliciet toegestane services en poorten worden beschikbaar gesteld. | ||
| - | |||
| - | Voor Tulpencraft is dit met name relevant voor de proxy. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🚪 Proxy-firewall | ||
| - | |||
| - | De Velocity Proxy vormt het publieke toegangspunt van het Minecraft-netwerk. | ||
| - | |||
| - | De belangrijkste publiek toegankelijke poort is: | ||
| - | |||
| - | | Poort | Protocol | Doel | | ||
| - | | ------: | -------- | -------------------- | | ||
| - | | `25565` | TCP | Minecraft / Velocity | | ||
| - | |||
| - | De poort wordt expliciet geopend: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --add-port=25565/ | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Controle: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --zone=public --list-ports | ||
| - | ``` | ||
| - | |||
| - | Verwacht onder andere: | ||
| - | |||
| - | ```text | ||
| - | 25565/tcp | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔐 SSH | ||
| - | |||
| - | SSH is een beheerinterface en wordt niet beschouwd als een Minecraft-netwerkdienst. | ||
| - | |||
| - | Wanneer SSH publiek bereikbaar moet zijn, wordt de SSH-service expliciet toegestaan: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --add-service=ssh | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Controle: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --zone=public --list-services | ||
| - | ``` | ||
| - | |||
| - | SSH wordt daarnaast beschermd door de maatregelen beschreven in: | ||
| - | |||
| - | [[technische-infrastructuur: | ||
| - | |||
| - | waaronder: | ||
| - | |||
| - | * SSH-sleutels; | ||
| - | * uitschakelen van directe root-login; | ||
| - | * uitschakelen van wachtwoordauthenticatie; | ||
| - | * Fail2Ban; | ||
| - | * beperkte gebruikersrechten. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🏠 Backendservers | ||
| - | |||
| - | Backendservers zoals Survival en Events worden niet publiek aangeboden. | ||
| - | |||
| - | Het uitgangspunt is: | ||
| - | |||
| - | ```text | ||
| - | Internet | ||
| - | │ | ||
| - | X | ||
| - | │ | ||
| - | Survival | ||
| - | ``` | ||
| - | |||
| - | maar: | ||
| - | |||
| - | ```text | ||
| - | Internet | ||
| - | │ | ||
| - | ▼ | ||
| - | Velocity | ||
| - | │ | ||
| - | ▼ | ||
| - | Survival | ||
| - | ``` | ||
| - | |||
| - | De firewall op een backendserver moet daarom geen algemene publieke Minecraft-poort openen. | ||
| - | |||
| - | De exacte interne netwerkregels zijn afhankelijk van de uiteindelijke netwerkconfiguratie van de Tulpencraft-infrastructuur. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🏠 Lobby | ||
| - | |||
| - | De lobby bevindt zich momenteel op dezelfde host als de proxy: | ||
| - | |||
| - | ```text | ||
| - | mc-proxy001 | ||
| - | │ | ||
| - | ├── Velocity | ||
| - | │ | ||
| - | └── Lobby | ||
| - | ``` | ||
| - | |||
| - | Dit is onderdeel van de huidige kosten- en infrastructuurkeuze. | ||
| - | |||
| - | Omdat de lobby lokaal op dezelfde host draait als Velocity, hoeft de lobbypoort niet publiek beschikbaar te worden gesteld voor spelers. | ||
| - | |||
| - | De proxy communiceert lokaal met de lobby. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🧱 Survival | ||
| - | |||
| - | Survival draait als afzonderlijke VM op de huidige Proxmox-infrastructuur. | ||
| - | |||
| - | De server is niet bedoeld als publiek Minecraft-entrypoint. | ||
| - | |||
| - | De gewenste netwerkstroom is: | ||
| - | |||
| - | ```text | ||
| - | Speler | ||
| - | │ | ||
| - | ▼ | ||
| - | Velocity | ||
| - | │ | ||
| - | ▼ | ||
| - | Survival | ||
| - | ``` | ||
| - | |||
| - | Niet: | ||
| - | |||
| - | ```text | ||
| - | Speler | ||
| - | │ | ||
| - | ▼ | ||
| - | Survival | ||
| - | ``` | ||
| - | |||
| - | De firewall en netwerkconfiguratie moeten deze architectuur ondersteunen. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🎮 Events | ||
| - | |||
| - | Voor toekomstige Events-servers geldt hetzelfde uitgangspunt. | ||
| - | |||
| - | Een Events-server wordt niet zelfstandig aan het internet blootgesteld wanneer dit niet noodzakelijk is. | ||
| - | |||
| - | De gewenste architectuur is: | ||
| - | |||
| - | ```text | ||
| - | Speler | ||
| - | │ | ||
| - | ▼ | ||
| - | Velocity | ||
| - | │ | ||
| - | ▼ | ||
| - | Events | ||
| - | ``` | ||
| - | |||
| - | Eventuele uitzonderingen moeten worden gedocumenteerd. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 📦 Services versus poorten | ||
| - | |||
| - | Firewalld ondersteunt zowel vooraf gedefinieerde services als losse poortdefinities. | ||
| - | |||
| - | Een service is een verzameling van bijbehorende netwerkregels, | ||
| - | |||
| - | Voor standaarddiensten heeft het daarom de voorkeur om een service te gebruiken: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --add-service=ssh | ||
| - | ``` | ||
| - | |||
| - | Voor applicaties zonder geschikte standaardservice kan een specifieke poort worden geopend: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --add-port=25565/ | ||
| - | ``` | ||
| - | |||
| - | Daarna: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # ⚠️ Runtime versus permanent | ||
| - | |||
| - | Firewalld kent twee configuratielagen: | ||
| - | |||
| - | ### Runtime | ||
| - | |||
| - | Een runtime-regel wordt direct actief, maar is niet automatisch blijvend na een reload of reboot. | ||
| - | |||
| - | Bijvoorbeeld: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --add-port=25565/ | ||
| - | ``` | ||
| - | |||
| - | ### Permanent | ||
| - | |||
| - | Een permanente regel wordt opgeslagen in de firewallconfiguratie: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --add-port=25565/ | ||
| - | ``` | ||
| - | |||
| - | Daarna wordt de actieve configuratie opnieuw geladen: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Voor productieservers gebruiken we bij voorkeur **permanente configuratie**, | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔍 Firewallconfiguratie controleren | ||
| - | |||
| - | Volledige configuratie: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-all | ||
| - | ``` | ||
| - | |||
| - | Alle actieve zones: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-all-zones | ||
| - | ``` | ||
| - | |||
| - | Openstaande services: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-services | ||
| - | ``` | ||
| - | |||
| - | Openstaande poorten: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-ports | ||
| - | ``` | ||
| - | |||
| - | Beschikbare services: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --get-services | ||
| - | ``` | ||
| - | |||
| - | De actieve interfaces: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --get-active-zones | ||
| - | ``` | ||
| - | |||
| - | Deze commando' | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 👀 Luisterende poorten controleren | ||
| - | |||
| - | De firewallconfiguratie vertelt niet welke applicaties daadwerkelijk luisteren. | ||
| - | |||
| - | Daarom wordt ook gecontroleerd met: | ||
| - | |||
| - | ```bash | ||
| - | sudo ss -tulpn | ||
| - | ``` | ||
| - | |||
| - | Dit maakt bijvoorbeeld zichtbaar: | ||
| - | |||
| - | ```text | ||
| - | Velocity | ||
| - | | ||
| - | |||
| - | SSH | ||
| - | | ||
| - | ``` | ||
| - | |||
| - | Een belangrijke securitycontrole is daarom: | ||
| - | |||
| - | > **Welke poorten luisteren daadwerkelijk, | ||
| - | |||
| - | Een poort die niet nodig is, moet bij voorkeur helemaal niet door een applicatie worden geopend. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🧪 Nieuwe poort openen | ||
| - | |||
| - | Wanneer een nieuwe service een netwerkpoort nodig heeft, wordt eerst bepaald: | ||
| - | |||
| - | 1. waarom de poort nodig is; | ||
| - | 2. of de service publiek of intern moet zijn; | ||
| - | 3. welk protocol noodzakelijk is; | ||
| - | 4. vanaf welke bronnen toegang noodzakelijk is; | ||
| - | 5. of een bestaande firewalld-service gebruikt kan worden. | ||
| - | |||
| - | Daarna wordt de regel toegevoegd. | ||
| - | |||
| - | Bijvoorbeeld: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --add-port=< | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Daarna controleren: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --zone=public --list-all | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🗑️ Poort verwijderen | ||
| - | |||
| - | Wanneer een dienst niet meer nodig is, wordt de firewallregel verwijderd. | ||
| - | |||
| - | Bijvoorbeeld: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --remove-port=25565/ | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Daarna: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --zone=public --list-ports | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔒 Bron-IP beperken | ||
| - | |||
| - | Niet iedere service hoeft vanaf het volledige internet bereikbaar te zijn. | ||
| - | |||
| - | Wanneer een service bijvoorbeeld uitsluitend vanaf een beheer-IP of intern netwerk bereikbaar moet zijn, kan firewalld hiervoor uitgebreidere regels gebruiken. | ||
| - | |||
| - | Hiervoor kunnen onder andere **rich rules** worden gebruikt. Firewalld ondersteunt hiermee bron- en bestemmingsadressen, | ||
| - | |||
| - | Voorbeeldconcept: | ||
| - | |||
| - | ```text | ||
| - | Internet | ||
| - | │ | ||
| - | X | ||
| - | │ | ||
| - | beheerpoort | ||
| - | |||
| - | Beheer-IP | ||
| - | │ | ||
| - | ▼ | ||
| - | beheerpoort | ||
| - | ``` | ||
| - | |||
| - | Dit heeft de voorkeur boven een publiek toegankelijke beheerinterface wanneer de netwerkarchitectuur dit mogelijk maakt. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 📝 Logging | ||
| - | |||
| - | Firewallgebeurtenissen kunnen onderdeel zijn van de algemene serverlogging. | ||
| - | |||
| - | De firewallservice: | ||
| - | |||
| - | ```bash | ||
| - | sudo journalctl -u firewalld | ||
| - | ``` | ||
| - | |||
| - | Daarnaast kunnen kernel/ | ||
| - | |||
| - | Firewalllogging wordt niet zonder reden maximaal aangezet. | ||
| - | |||
| - | Te uitgebreide logging kan zelf aanzienlijke hoeveelheden logdata produceren. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🛡️ Firewall en Fail2Ban | ||
| - | |||
| - | Firewalld en Fail2Ban vullen elkaar aan. | ||
| - | |||
| - | ```text | ||
| - | ┌──────────────┐ | ||
| - | Internet ────────►│ | ||
| - | └──────┬───────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | SSH / services | ||
| - | │ | ||
| - | ▼ | ||
| - | logbestanden | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌──────────┐ | ||
| - | │ Fail2Ban │ | ||
| - | └────┬─────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | | ||
| - | ``` | ||
| - | |||
| - | Firewalld bepaalt welke netwerktoegang überhaupt mogelijk is. | ||
| - | |||
| - | Fail2Ban reageert vervolgens op herhaaldelijk ongewenst gedrag, bijvoorbeeld brute-forcepogingen op SSH. | ||
| - | |||
| - | Zie: | ||
| - | |||
| - | [[technische-infrastructuur: | ||
| - | |||
| - | voor de volledige hardeningconfiguratie. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔄 Wijzigingen documenteren | ||
| - | |||
| - | Firewallwijzigingen worden gedocumenteerd wanneer ze structureel onderdeel worden van de serverconfiguratie. | ||
| - | |||
| - | Bijvoorbeeld: | ||
| - | |||
| - | | Onderdeel | Waarde | ||
| - | | --------- | --------------------- | | ||
| - | | Server | ||
| - | | Zone | `public` | ||
| - | | Poort | `25565/ | ||
| - | | Dienst | ||
| - | | Bereik | ||
| - | | Reden | Minecraft-ingangspunt | | ||
| - | | Status | ||
| - | |||
| - | Hierdoor blijft duidelijk waarom een poort geopend is. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 📋 Firewall-baseline | ||
| - | |||
| - | Een nieuwe Tulpencraft-server moet minimaal worden gecontroleerd op: | ||
| - | |||
| - | * [ ] firewalld geïnstalleerd | ||
| - | * [ ] firewalld actief | ||
| - | * [ ] firewalld ingeschakeld bij boot | ||
| - | * [ ] juiste zone vastgesteld | ||
| - | * [ ] alleen noodzakelijke services toegestaan | ||
| - | * [ ] alleen noodzakelijke poorten toegestaan | ||
| - | * [ ] publieke en interne services onderscheiden | ||
| - | * [ ] luisterende poorten gecontroleerd met `ss` | ||
| - | * [ ] permanente configuratie gecontroleerd | ||
| - | * [ ] firewallconfiguratie na reload gecontroleerd | ||
| - | * [ ] SSH-toegang getest | ||
| - | * [ ] Minecraft-netwerktoegang getest | ||
| - | * [ ] backendservers niet onnodig publiek bereikbaar | ||
| - | * [ ] firewallwijzigingen gedocumenteerd | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🌷 Tulpencraft firewallbeleid | ||
| - | |||
| - | De firewall is geen vervanging voor een correcte netwerkarchitectuur. | ||
| - | |||
| - | Tulpencraft gebruikt daarom meerdere beveiligingslagen: | ||
| - | |||
| - | ```text | ||
| - | Internet | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌───────────────────────┐ | ||
| - | │ | ||
| - | └──────────┬────────────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌───────────────────────┐ | ||
| - | │ firewalld | ||
| - | └──────────┬────────────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌───────────────────────┐ | ||
| - | │ Velocity Proxy │ | ||
| - | └──────────┬────────────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌───────────────────────┐ | ||
| - | │ Backend servers | ||
| - | │ Lobby / Survival etc. │ | ||
| - | └───────────────────────┘ | ||
| - | ``` | ||
| - | |||
| - | Daarbovenop worden onder andere **SELinux**, | ||
| - | |||
| - | Het uitgangspunt blijft: | ||
| - | |||
| - | > **Een service die niet bereikbaar hoeft te zijn, wordt niet bereikbaar gemaakt.** | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔗 Gerelateerde documentatie | ||
| - | |||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | |||
| - | --- | ||
| - | |||
| - | > **Tulpencraft firewall baseline** | ||
| - | > | ||
| - | > De firewall wordt ingericht volgens het principe **least exposure**: alleen noodzakelijke netwerktoegang wordt toegestaan en backendservers worden niet rechtstreeks aan het publieke internet blootgesteld. | ||
| - | |||
| - | ```` | ||
| Hierdoor blijft inzichtelijk waarom een poort geopend is en kan ongebruikte toegang later worden verwijderd. | Hierdoor blijft inzichtelijk waarom een poort geopend is en kan ongebruikte toegang later worden verwijderd. | ||
| Regel 2424: | Regel 482: | ||
| --- | --- | ||
| - | ## Beveiligingsprincipes | + | ## 📋 Beveiligingsprincipes |
| De firewallconfiguratie van Tulpencraft volgt deze uitgangspunten: | De firewallconfiguratie van Tulpencraft volgt deze uitgangspunten: | ||
| Regel 2441: | Regel 499: | ||
| --- | --- | ||
| - | ## Controle | + | ## 🔎 Controle |
| - | Na wijzigingen | + | Na firewallwijzigingen |
| ```bash | ```bash | ||
| Regel 2473: | Regel 531: | ||
| --- | --- | ||
| - | > **Belangrijk:** een poort openen in firewalld betekent niet automatisch dat een dienst veilig of correct geconfigureerd is. De applicatie zelf moet eveneens correct worden gebonden aan het juiste netwerkinterface en correct worden beveiligd. | + | ## ⚠️ |
| + | Een poort openen in firewalld betekent niet automatisch dat een dienst veilig of correct geconfigureerd is. | ||
| - | Het uitgangspunt is eenvoudig: | + | De applicatie zelf moet eveneens correct worden geconfigureerd en indien mogelijk uitsluitend op het noodzakelijke netwerkinterface luisteren. |
| - | > **Alleen netwerkverkeer toestaan dat daadwerkelijk noodzakelijk | + | De firewall |
| - | Een service die lokaal draait, betekent niet automatisch dat deze vanaf het netwerk bereikbaar moet zijn. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🌐 Netwerkarchitectuur | ||
| - | |||
| - | Tulpencraft gebruikt een centrale **Velocity Proxy** als toegangspunt tot het Minecraft-netwerk. | ||
| - | |||
| - | De gewenste netwerkarchitectuur is: | ||
| - | |||
| - | ```text | ||
| - | | ||
| - | │ | ||
| - | | ||
| - | | ||
| - | TCP 25565 UDP voice | ||
| - | | ||
| - | | ||
| - | ┌─────────────────────────────────┐ | ||
| - | │ | ||
| - | │ | ||
| - | └────────────────┬────────────────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | Lobby | ||
| - | │ | ||
| - | ┌────────────┼────────────┐ | ||
| - | ▼ ▼ ▼ | ||
| - | | ||
| - | ``` | ||
| - | |||
| - | Spelers verbinden dus niet rechtstreeks met de backendservers. | ||
| - | |||
| - | De normale Minecraft-verbinding verloopt via: | ||
| - | |||
| - | ```text | ||
| - | Speler | ||
| - | │ | ||
| - | ▼ | ||
| - | Velocity | ||
| - | │ | ||
| - | ▼ | ||
| - | Lobby | ||
| - | │ | ||
| - | ▼ | ||
| - | Game server | ||
| - | ``` | ||
| - | |||
| - | Ook voicechat wordt zoveel mogelijk via de proxyarchitectuur afgehandeld. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔥 Firewalld | ||
| - | |||
| - | De host-firewall wordt verzorgd door **firewalld**. | ||
| - | |||
| - | Status controleren: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --state | ||
| - | ``` | ||
| - | |||
| - | Verwachte uitvoer: | ||
| - | |||
| - | ```text | ||
| - | running | ||
| - | ``` | ||
| - | |||
| - | Service controleren: | ||
| - | |||
| - | ```bash | ||
| - | sudo systemctl status firewalld | ||
| - | ``` | ||
| - | |||
| - | Controleren of firewalld automatisch start: | ||
| - | |||
| - | ```bash | ||
| - | sudo systemctl is-enabled firewalld | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🗂️ Firewalld-zones | ||
| - | |||
| - | Firewalld werkt met zogenaamde **zones**. | ||
| - | |||
| - | Een zone bepaalt welk vertrouwensniveau aan een netwerkinterface of bron wordt gekoppeld en welke services en poorten daar toegestaan zijn. | ||
| - | |||
| - | De standaardzone: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --get-default-zone | ||
| - | ``` | ||
| - | |||
| - | Actieve zones: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --get-active-zones | ||
| - | ``` | ||
| - | |||
| - | Configuratie van de actieve zone: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-all | ||
| - | ``` | ||
| - | |||
| - | Alle zones: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-all-zones | ||
| - | ``` | ||
| - | |||
| - | Voor een publiek bereikbare Tulpencraft-proxy wordt doorgaans de `public` zone gebruikt. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🌍 Publiek netwerk | ||
| - | |||
| - | De publieke netwerkinterface van de proxy mag alleen de diensten aanbieden die daadwerkelijk vanaf internet noodzakelijk zijn. | ||
| - | |||
| - | Voor de huidige Tulpencraft-architectuur zijn dat in principe: | ||
| - | |||
| - | | Poort | Protocol | Functie | ||
| - | | -------------: | ||
| - | | `25565` | TCP | Minecraft / Velocity | Ja | | ||
| - | | voicechatpoort | UDP | Simple Voice Chat | Ja | | ||
| - | | `22` | TCP | SSH-beheer | ||
| - | |||
| - | De exacte voicechatpoort wordt verderop beschreven. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🎮 Minecraft / Velocity | ||
| - | |||
| - | De Minecraft-ingang van Tulpencraft is: | ||
| - | |||
| - | ```text | ||
| - | TCP 25565 | ||
| - | ``` | ||
| - | |||
| - | Deze poort wordt door Velocity gebruikt. | ||
| - | |||
| - | Openen: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --add-port=25565/ | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Controleren: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --zone=public --list-ports | ||
| - | ``` | ||
| - | |||
| - | De poort moet alleen op het daadwerkelijke publieke toegangspunt worden geopend. | ||
| - | |||
| - | Backendservers krijgen niet automatisch een publiek toegankelijke `25565/ | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🎙️ Simple Voice Chat | ||
| - | |||
| - | Tulpencraft wil **Simple Voice Chat** ondersteunen op Survival en toekomstige game-servers. | ||
| - | |||
| - | Simple Voice Chat biedt onder andere: | ||
| - | |||
| - | * proximity voice chat; | ||
| - | * push-to-talk; | ||
| - | * voice activation; | ||
| - | * configureerbare voice distance; | ||
| - | * whispering; | ||
| - | * individuele volumeregeling; | ||
| - | * groepsgesprekken. | ||
| - | |||
| - | De client gebruikt hiervoor een aparte UDP-verbinding. De standaard serverpoort van Simple Voice Chat is `24454/ | ||
| - | |||
| - | --- | ||
| - | |||
| - | ## 🔊 Voicechat via Velocity | ||
| - | |||
| - | Omdat Tulpencraft gebruikmaakt van Velocity, wordt Simple Voice Chat niet per game-server afzonderlijk publiek aangeboden. | ||
| - | |||
| - | De officiële Simple Voice Chat-proxyconfiguratie ondersteunt Velocity en kan voicechatverkeer naar de juiste backendserver doorsturen. Daardoor is slechts **één publieke UDP-poort op de proxy** nodig. | ||
| - | |||
| - | De gewenste architectuur is: | ||
| - | |||
| - | ```text | ||
| - | INTERNET | ||
| - | │ | ||
| - | │ UDP | ||
| - | ▼ | ||
| - | | ||
| - | | ||
| - | | ||
| - | | ||
| - | │ | ||
| - | ┌────────────┼────────────┐ | ||
| - | ▼ ▼ ▼ | ||
| - | | ||
| - | Voice Chat Voice Chat Voice Chat | ||
| - | ``` | ||
| - | |||
| - | Hierdoor blijft het principe behouden dat backendservers niet zelfstandig publiek bereikbaar zijn. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔌 Voicechatpoort | ||
| - | |||
| - | De proxy kan voor Simple Voice Chat een eigen UDP-poort gebruiken. | ||
| - | |||
| - | De officiële proxyconfiguratie gebruikt standaard de Minecraft-proxypoort voor voicechat wanneer `port=-1` is ingesteld. De poort kan echter expliciet worden ingesteld. | ||
| - | |||
| - | Voor Tulpencraft verdient een **expliciete, | ||
| - | |||
| - | Bijvoorbeeld: | ||
| - | |||
| - | ```text | ||
| - | UDP < | ||
| - | ``` | ||
| - | |||
| - | De daadwerkelijke poort wordt vastgelegd zodra Simple Voice Chat op de Tulpencraft-proxy wordt geïmplementeerd. | ||
| - | |||
| - | > De standaard backendpoort `24454/UDP` moet dus niet automatisch als publieke poort op iedere Survival-, Events- of toekomstige game-server worden geopend. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🧱 Backend Voice Chat | ||
| - | |||
| - | Op iedere Minecraft-server waarop voicechat beschikbaar moet zijn, wordt de Simple Voice Chat serverplugin geïnstalleerd. | ||
| - | |||
| - | De officiële installatie vereist naast de serverplugin ook de Simple Voice Chat-proxyplugin wanneer de server achter Velocity draait. | ||
| - | |||
| - | De gewenste opbouw: | ||
| - | |||
| - | ```text | ||
| - | Velocity | ||
| - | └── Simple Voice Chat Proxy | ||
| - | |||
| - | Lobby | ||
| - | └── eventueel voicechat | ||
| - | |||
| - | Survival | ||
| - | └── Simple Voice Chat | ||
| - | |||
| - | Events | ||
| - | └── Simple Voice Chat | ||
| - | |||
| - | Toekomstige game-server | ||
| - | └── Simple Voice Chat | ||
| - | ``` | ||
| - | |||
| - | Voicechat wordt daarmee een netwerkfunctie van het volledige Tulpencraft-netwerk. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔒 Backendservers niet publiek bereikbaar | ||
| - | |||
| - | Een belangrijk uitgangspunt van Tulpencraft is dat backendservers niet zelfstandig bereikbaar zijn. | ||
| - | |||
| - | Dus bijvoorbeeld: | ||
| - | |||
| - | ```text | ||
| - | Internet | ||
| - | │ | ||
| - | X | ||
| - | │ | ||
| - | Survival: | ||
| - | ``` | ||
| - | |||
| - | is niet de gewenste situatie. | ||
| - | |||
| - | In plaats daarvan: | ||
| - | |||
| - | ```text | ||
| - | Internet | ||
| - | │ | ||
| - | ▼ | ||
| - | Velocity: | ||
| - | │ | ||
| - | ▼ | ||
| - | Survival | ||
| - | ``` | ||
| - | |||
| - | Voor voicechat geldt hetzelfde principe: | ||
| - | |||
| - | ```text | ||
| - | Internet | ||
| - | │ | ||
| - | ▼ | ||
| - | Velocity UDP voice | ||
| - | │ | ||
| - | ▼ | ||
| - | Survival Voice Chat | ||
| - | ``` | ||
| - | |||
| - | De Simple Voice Chat-proxy zorgt ervoor dat het verkeer naar de juiste backend wordt doorgestuurd. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🏠 Lobby | ||
| - | |||
| - | De lobby draait momenteel op dezelfde host als de Velocity Proxy: | ||
| - | |||
| - | ```text | ||
| - | mc-proxy001 | ||
| - | │ | ||
| - | ├── Velocity | ||
| - | │ | ||
| - | └── Lobby | ||
| - | ``` | ||
| - | |||
| - | Dit is onderdeel van de huidige infrastructuurkeuze. | ||
| - | |||
| - | Omdat de lobby lokaal op dezelfde host als Velocity draait, hoeft de lobbypoort niet publiek voor spelers geopend te worden. | ||
| - | |||
| - | De proxy communiceert lokaal met de lobby. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🎯 Survival | ||
| - | |||
| - | Survival draait als afzonderlijke VM binnen de Proxmox-infrastructuur. | ||
| - | |||
| - | De Survival-server wordt niet als zelfstandig publiek Minecraft-entrypoint aangeboden. | ||
| - | |||
| - | De gewenste verbinding: | ||
| - | |||
| - | ```text | ||
| - | Speler | ||
| - | │ | ||
| - | ▼ | ||
| - | Velocity | ||
| - | │ | ||
| - | ▼ | ||
| - | Survival | ||
| - | ``` | ||
| - | |||
| - | Voicechat: | ||
| - | |||
| - | ```text | ||
| - | Speler | ||
| - | │ | ||
| - | │ UDP | ||
| - | ▼ | ||
| - | Velocity Voice Proxy | ||
| - | │ | ||
| - | ▼ | ||
| - | Survival Voice Chat | ||
| - | ``` | ||
| - | |||
| - | De backend blijft daarmee achter de netwerkgrens van Tulpencraft. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🎪 Events | ||
| - | |||
| - | Voor Events geldt hetzelfde model als voor Survival. | ||
| - | |||
| - | ```text | ||
| - | Speler | ||
| - | │ | ||
| - | ▼ | ||
| - | Velocity | ||
| - | │ | ||
| - | ▼ | ||
| - | Events | ||
| - | ``` | ||
| - | |||
| - | en voor voice: | ||
| - | |||
| - | ```text | ||
| - | Speler | ||
| - | │ | ||
| - | │ UDP | ||
| - | ▼ | ||
| - | Velocity Voice Proxy | ||
| - | │ | ||
| - | ▼ | ||
| - | Events Voice Chat | ||
| - | ``` | ||
| - | |||
| - | Een Events-server wordt niet rechtstreeks aan internet blootgesteld tenzij daar bewust een technische reden voor bestaat. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔐 SSH | ||
| - | |||
| - | SSH is een beheerinterface en geen Minecraft-netwerkdienst. | ||
| - | |||
| - | Wanneer SSH publiek bereikbaar moet zijn: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --add-service=ssh | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Maar waar mogelijk wordt SSH beperkt tot de noodzakelijke beheeromgeving. | ||
| - | |||
| - | SSH wordt daarnaast beschermd door: | ||
| - | |||
| - | * SSH-sleutels; | ||
| - | * geen directe root-login; | ||
| - | * geen wachtwoordauthenticatie; | ||
| - | * Fail2Ban; | ||
| - | * beperkte gebruikersrechten. | ||
| - | |||
| - | Zie: | ||
| - | |||
| - | [[technische-infrastructuur: | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 📦 Services versus poorten | ||
| - | |||
| - | Firewalld kan zowel vooraf gedefinieerde services als afzonderlijke poorten gebruiken. | ||
| - | |||
| - | Voor standaarddiensten heeft een service de voorkeur: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --add-service=ssh | ||
| - | ``` | ||
| - | |||
| - | Voor applicaties zonder geschikte standaardservice: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --add-port=25565/ | ||
| - | ``` | ||
| - | |||
| - | Voor Simple Voice Chat: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --add-port=< | ||
| - | ``` | ||
| - | |||
| - | Daarna: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # ⚠️ Runtime en permanent | ||
| - | |||
| - | Firewalld kent een runtime- en permanente configuratie. | ||
| - | |||
| - | Een tijdelijke regel: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --add-port=25565/ | ||
| - | ``` | ||
| - | |||
| - | wordt direct actief, maar is niet noodzakelijk permanent. | ||
| - | |||
| - | Voor de productiesituatie wordt daarom de permanente configuratie gebruikt: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --add-port=25565/ | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Na een wijziging moet altijd worden gecontroleerd of de regel daadwerkelijk actief is. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔍 Firewall controleren | ||
| - | |||
| - | Volledige configuratie: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-all | ||
| - | ``` | ||
| - | |||
| - | Services: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-services | ||
| - | ``` | ||
| - | |||
| - | Poorten: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --list-ports | ||
| - | ``` | ||
| - | |||
| - | Actieve zones: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --get-active-zones | ||
| - | ``` | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 👀 Luisterende poorten | ||
| - | |||
| - | De firewallconfiguratie is slechts één kant van de controle. | ||
| - | |||
| - | Ook moet worden gecontroleerd welke processen daadwerkelijk luisteren: | ||
| - | |||
| - | ```bash | ||
| - | sudo ss -tulpn | ||
| - | ``` | ||
| - | |||
| - | Hiermee kunnen bijvoorbeeld worden gevonden: | ||
| - | |||
| - | ```text | ||
| - | TCP 25565 | ||
| - | UDP < | ||
| - | TCP 22 | ||
| - | ``` | ||
| - | |||
| - | Een poort die niet noodzakelijk is, moet bij voorkeur ook niet door een applicatie worden geopend. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🎙️ UDP controleren | ||
| - | |||
| - | Simple Voice Chat gebruikt UDP. | ||
| - | |||
| - | Een algemene TCP-poorttest is daarom niet voldoende om voicechat te controleren. | ||
| - | |||
| - | De Simple Voice Chat-documentatie geeft aan dat UDP connectionless is en daarom niet met normale TCP-portchecks kan worden getest. De plugin beschikt hiervoor over een eigen testmogelijkheid. | ||
| - | |||
| - | In-game kan bijvoorbeeld worden gebruikt: | ||
| - | |||
| - | ```text | ||
| - | /voicechat test < | ||
| - | ``` | ||
| - | |||
| - | Voor een proxy-opstelling kan daarnaast de voicechat-proxytest worden gebruikt: | ||
| - | |||
| - | ```text | ||
| - | / | ||
| - | ``` | ||
| - | |||
| - | De officiële documentatie beschrijft deze test voor het controleren van de verbinding tussen de proxy en een backendserver. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🛡️ Firewall en Fail2Ban | ||
| - | |||
| - | Firewalld en Fail2Ban hebben verschillende functies. | ||
| - | |||
| - | ```text | ||
| - | | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌─────────────┐ | ||
| - | │ firewalld | ||
| - | └──────┬──────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | toegestane | ||
| - | | ||
| - | │ | ||
| - | ▼ | ||
| - | SSH / overige | ||
| - | │ | ||
| - | ▼ | ||
| - | logbestanden | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌─────────────┐ | ||
| - | │ Fail2Ban | ||
| - | └──────┬──────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | tijdelijke | ||
| - | blokkade | ||
| - | ``` | ||
| - | |||
| - | Firewalld bepaalt welke netwerktoegang mogelijk is. | ||
| - | |||
| - | Fail2Ban reageert op herhaaldelijk ongewenst gedrag, bijvoorbeeld brute-forcepogingen op SSH. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🧩 Firewall per servertype | ||
| - | |||
| - | De firewallconfiguratie wordt afgestemd op de functie van de server. | ||
| - | |||
| - | | Server | ||
| - | | --------------------------- | ------------: | ||
| - | | **Velocity / Proxy** | ||
| - | | **Lobby** | ||
| - | | **Survival** | ||
| - | | **Events** | ||
| - | | **Toekomstige game-server** | intern | intern via voice proxy | Nee | | ||
| - | |||
| - | SSH is hierbij een aparte beheerfunctie en wordt alleen opengesteld wanneer noodzakelijk. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🚫 Geen onnodige poorten | ||
| - | |||
| - | De volgende aanpak wordt vermeden: | ||
| - | |||
| - | ```text | ||
| - | 25565/ | ||
| - | 24454/ | ||
| - | 25566/ | ||
| - | 25567/ | ||
| - | 25568/ | ||
| - | ... | ||
| - | ``` | ||
| - | |||
| - | De gewenste situatie is: | ||
| - | |||
| - | ```text | ||
| - | | ||
| - | │ | ||
| - | ┌─────────┴─────────┐ | ||
| - | │ │ | ||
| - | 25565/ | ||
| - | │ │ | ||
| - | ▼ ▼ | ||
| - | | ||
| - | │ │ | ||
| - | └─────────┬─────────┘ | ||
| - | ▼ | ||
| - | | ||
| - | ``` | ||
| - | |||
| - | Daarmee wordt het publieke aanvalsoppervlak beperkt. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🧱 Nieuwe netwerkdienst | ||
| - | |||
| - | Wanneer een nieuwe dienst een netwerkpoort nodig heeft, wordt eerst bepaald: | ||
| - | |||
| - | 1. Waarom is de dienst nodig? | ||
| - | 2. Moet deze publiek bereikbaar zijn? | ||
| - | 3. Kan de dienst via Velocity worden aangeboden? | ||
| - | 4. Kan de dienst uitsluitend intern luisteren? | ||
| - | 5. Welke bronadressen moeten toegang krijgen? | ||
| - | 6. Welk protocol wordt gebruikt? | ||
| - | 7. Welke firewallregel is noodzakelijk? | ||
| - | |||
| - | Pas daarna wordt de firewall aangepast. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🗑️ Poort verwijderen | ||
| - | |||
| - | Wanneer een dienst wordt verwijderd, wordt ook de bijbehorende firewallregel verwijderd. | ||
| - | |||
| - | Bijvoorbeeld: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --permanent --zone=public --remove-port=< | ||
| - | sudo firewall-cmd --reload | ||
| - | ``` | ||
| - | |||
| - | Daarna: | ||
| - | |||
| - | ```bash | ||
| - | sudo firewall-cmd --zone=public --list-all | ||
| - | ``` | ||
| - | |||
| - | Firewallregels mogen niet blijven bestaan zonder actieve reden. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 📝 Firewallwijzigingen documenteren | ||
| - | |||
| - | Structurele wijzigingen worden gedocumenteerd. | ||
| - | |||
| - | Bijvoorbeeld: | ||
| - | |||
| - | | Onderdeel | Waarde | ||
| - | | --------- | --------------------- | | ||
| - | | Server | ||
| - | | Zone | `public` | ||
| - | | Poort | `25565/ | ||
| - | | Dienst | ||
| - | | Bereik | ||
| - | | Reden | Minecraft-ingangspunt | | ||
| - | | Status | ||
| - | |||
| - | Voor Simple Voice Chat: | ||
| - | |||
| - | | Onderdeel | Waarde | ||
| - | | --------- | --------------------------------------- | | ||
| - | | Server | ||
| - | | Zone | `public` | ||
| - | | Poort | `< | ||
| - | | Dienst | ||
| - | | Bereik | ||
| - | | Backend | ||
| - | | Status | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔄 Wijzigingen en onderhoud | ||
| - | |||
| - | Bij iedere wijziging aan de netwerkarchitectuur wordt gecontroleerd of de firewallconfiguratie nog overeenkomt met de gewenste situatie. | ||
| - | |||
| - | Dit geldt bijvoorbeeld bij: | ||
| - | |||
| - | * nieuwe game-servers; | ||
| - | * nieuwe plugins; | ||
| - | * migratie naar een andere VM; | ||
| - | * wijziging van IP-adressen; | ||
| - | * invoering van Simple Voice Chat; | ||
| - | * wijziging van Velocity; | ||
| - | * verhuizing naar een andere Proxmox-node; | ||
| - | * uitbreiding van monitoring; | ||
| - | * nieuwe beheerinterfaces. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 📋 Firewall-baseline | ||
| - | |||
| - | Iedere Tulpencraft-server wordt minimaal gecontroleerd op: | ||
| - | |||
| - | * [ ] firewalld geïnstalleerd | ||
| - | * [ ] firewalld actief | ||
| - | * [ ] firewalld ingeschakeld bij boot | ||
| - | * [ ] juiste zone vastgesteld | ||
| - | * [ ] alleen noodzakelijke services toegestaan | ||
| - | * [ ] alleen noodzakelijke poorten toegestaan | ||
| - | * [ ] publieke en interne diensten onderscheiden | ||
| - | * [ ] luisterende poorten gecontroleerd met `ss` | ||
| - | * [ ] permanente configuratie gecontroleerd | ||
| - | * [ ] firewall na reload gecontroleerd | ||
| - | * [ ] SSH-toegang getest | ||
| - | * [ ] Minecraft-toegang getest | ||
| - | * [ ] backendservers niet publiek bereikbaar | ||
| - | * [ ] Simple Voice Chat UDP-configuratie gecontroleerd indien van toepassing | ||
| - | * [ ] voicechat via de proxy getest indien van toepassing | ||
| - | * [ ] firewallwijzigingen gedocumenteerd | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🛡️ Tulpencraft securitymodel | ||
| - | |||
| - | De firewall is één onderdeel van de totale beveiligingsarchitectuur. | ||
| - | |||
| - | ```text | ||
| - | INTERNET | ||
| - | │ | ||
| - | ▼ | ||
| - | ┌─────────────┐ | ||
| - | │ firewalld | ||
| - | └──────┬──────┘ | ||
| - | │ | ||
| - | | ||
| - | | ||
| - | TCP Minecraft | ||
| - | | ||
| - | | ||
| - | ┌────────────────────────────┐ | ||
| - | │ | ||
| - | │ mc-proxy001 | ||
| - | └─────────────┬──────────────┘ | ||
| - | │ | ||
| - | ▼ | ||
| - | Lobby | ||
| - | │ | ||
| - | | ||
| - | | ||
| - | | ||
| - | ``` | ||
| - | |||
| - | Daarbovenop worden onder andere toegepast: | ||
| - | |||
| - | * SELinux; | ||
| - | * SSH-hardening; | ||
| - | * Fail2Ban; | ||
| - | * least privilege; | ||
| - | * regelmatige updates; | ||
| - | * logging; | ||
| - | * monitoring; | ||
| - | * beperkte netwerktoegang. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🌷 Uitgangspunt | ||
| - | |||
| - | Het Tulpencraft-firewallbeleid kan worden samengevat als: | ||
| - | |||
| - | > **Een service die niet publiek bereikbaar hoeft te zijn, wordt niet publiek bereikbaar gemaakt.** | ||
| - | |||
| - | De Velocity Proxy is het centrale toegangspunt. | ||
| - | |||
| - | Backendservers blijven achter de proxy en worden niet zelfstandig aan internet blootgesteld. | ||
| - | |||
| - | Voor Simple Voice Chat wordt dezelfde architectuur gevolgd: de voicechatfunctie wordt via de Velocity Proxy aangeboden, zodat meerdere game-servers gebruik kunnen maken van voicechat zonder iedere backend afzonderlijk publiek open te zetten. De officiële Simple Voice Chat-proxyondersteuning is hier specifiek voor ontworpen. | ||
| - | |||
| - | --- | ||
| - | |||
| - | # 🔗 Gerelateerde documentatie | ||
| - | |||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | ||
| * [[technische-infrastructuur: | * [[technische-infrastructuur: | ||
| * [[technische-infrastructuur: | * [[technische-infrastructuur: | ||
| - | * [[technische-infrastructuur: | + | * [[technische-infrastructuur: |
| * [[technische-infrastructuur: | * [[technische-infrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | * [[serverinfrastructuur: | ||
| - | * [[plugins: | ||
| - | |||
| - | --- | ||
| - | |||
| - | > **Tulpencraft firewall baseline** | ||
| - | > | ||
| - | > De Tulpencraft-firewall volgt het principe **least exposure**. Alleen noodzakelijke netwerktoegang wordt toegestaan. De Velocity Proxy vormt het publieke Minecraft-toegangspunt en backendservers worden niet rechtstreeks aan het publieke internet blootgesteld. | ||