Serveur Minecraft moddé, chez moi
Un vieux PC sous Ubuntu Server, Crafty dans Docker, TCPShield devant pour ne jamais donner l'adresse IP de la maison.
01 — Contexte
Le point de départ
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.
02
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
03
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.
04
Les choix
-
TCPShield devant le serveur
Écarté :
une redirection de port sur la boxUne 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 InternetCrafty 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 fortUn 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.
PubkeyAuthentication yes
PasswordAuthentication no
05
Ce qui a coincé
- Crafty, Docker et moiCrafty 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 ailleursUn 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 adresseAvec 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.
06
Où ça en est
- 60membres sur le Discord du serveur
- 18joueurs connectés en même temps, au plus fort
Il a tourné plusieurs mois. Il a planté plusieurs fois, jamais à cause d'une attaque.

07
À 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.