Pièce 03 · Projet perso · 2025
Serveur Minecraft moddé, chez moi
Un vieux PC chez moi, Ubuntu Server, et Crafty, un panneau d'admin pour serveurs Minecraft, qui tourne dans Docker. Dessus, un serveur moddé pour un Discord de 60 membres, avec 18 joueurs connectés en même temps au plus fort.
Au quotidien, ça a surtout voulu dire gérer des crashs, des modpacks compliqués à installer, un Crafty capricieux dès qu'il fallait installer quelque chose, et des problèmes de droits admin entre Crafty et moi. Et derrière tout ça, une règle : aucun joueur ne devait avoir l'adresse IP de la maison.
- Rôle
- Seul, admin système et réseau
- Quand
- 2025, plusieurs mois
- Pour qui
- Un Discord de 60 membres, 18 joueurs en même temps au maximum
- Outils
- Ubuntu Server, Docker, Crafty, SSH, reverse proxy, Let's Encrypt, Cloudflare, TCPShield
- La règle
- Ne jamais donner l'adresse IP de la maison
Le problème de l'adresse
Ouvrir un port sur sa box, c'est donner l'adresse IP de la maison à chaque joueur qui se connecte. Cette adresse ne change pas, elle situe le foyer à peu près, et une attaque qui la sature coupe Internet à toute la maison.
Avant de configurer quoi que ce soit, j'ai listé ce que je voulais éviter :
- qu'un joueur lise l'adresse de la maison dans son client
- qu'une attaque par saturation coupe Internet à toute la maison
- que quelqu'un prenne la main sur SSH ou sur Crafty, et de là sur le reste du réseau
- que les identifiants d'admin passent en clair
Comment c'est branché
Aucun client ne parle directement à la machine. Les joueurs passent par TCPShield, un relais anti-DDoS qui ne donne que sa propre adresse. L'accès à Crafty passe par un reverse proxy en HTTPS avec un certificat Let's Encrypt. SSH n'accepte que les clés.
Les choix
TCPShield devant le serveur
Écarté : une redirection de port sur la box
Une redirection de port marche, mais elle donne l'adresse de la maison. Avec TCPShield devant, les joueurs ne connaissent que l'adresse du relais, et une attaque par saturation arrive sur lui, pas sur ma connexion. Ça ajoute quelques millisecondes de latence. Pour un serveur Minecraft, c'est négligeable.
Crafty derrière un reverse proxy
Écarté : ouvrir Crafty sur Internet
Crafty n'est pas fait pour être exposé tel quel. Il n'écoute qu'en local, et un reverse proxy s'occupe du HTTPS avec un certificat Let's Encrypt qui se renouvelle tout seul. Je ne me fais pas confiance pour y penser tous les 90 jours.
SSH par clé uniquement
Écarté : un mot de passe fort
Un port SSH ouvert se fait tester en continu par des robots. Un mot de passe, même long, reste devinable en théorie, et réutilisable s'il fuit ailleurs. J'ai coupé l'authentification par mot de passe : les tentatives continuent, elles n'aboutissent plus à rien.
# /etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication no
Ce qui a coincé
Crafty, Docker et moi
Crafty tourne dans un conteneur Docker. Il faisait des caprices dès qu'il fallait installer un modpack, et les modpacks eux-mêmes n'étaient pas simples à installer. J'ai aussi eu des problèmes de droits admin entre Crafty et mon propre compte, et plusieurs crashs du serveur. Les services sont passés en redémarrage automatique en cas d'échec. Mais un vieux PC reste un vieux PC : coupure de courant, disque grand public, et personne pour surveiller.
L'adresse pouvait fuir par ailleurs
Un relais devant ne sert à rien si l'adresse réelle traîne ailleurs : un vieil enregistrement DNS, un sous-domaine oublié, un autre service sur la même machine. J'ai vérifié tous les enregistrements DNS du domaine, et fait en sorte que le serveur refuse les connexions qui n'arrivent pas par le relais.
Tout le monde avait la même adresse
Avec le relais, toutes les connexions semblent venir de TCPShield. Les bans par adresse ne marchent plus, et les journaux ne disent plus qui est qui. J'ai configuré le serveur pour lire l'adresse réelle que le relais transmet, en n'acceptant cette information que si elle vient du relais. Sinon, n'importe qui pourrait annoncer l'adresse de son choix.
Où ça en est
60 membres sur le Discord du serveur
18 joueurs connectés en même temps, au plus fort
Il a tourné plusieurs mois. Il a planté plusieurs fois, jamais à cause d'une attaque.
À reprendre
Aucune supervision. J'apprenais les pannes par les joueurs. Une sonde externe qui vérifie que le serveur répond et m'envoie un message, c'est une heure de travail.
Aucune sauvegarde ailleurs que sur la machine. Un seul disque, dans un seul boîtier, chez moi. Une panne de disque effaçait des mois de construction des joueurs. Ce n'est pas arrivé, j'ai eu de la chance.
Pas de réseau séparé. Le serveur était sur le même réseau que les PC de la maison. Quelqu'un qui l'aurait compromis avait accès au reste. Un réseau invité ou un VLAN aurait limité les dégâts.