Paul Féry

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.

Chemins réseau vers le serveur Les joueurs passent par TCPShield, un relais anti-DDoS, qui transmet au serveur Minecraft. L'administration de Crafty passe par un reverse proxy avec un certificat TLS. SSH n'accepte que les clés. L'adresse IP de la maison n'est jamais donnée aux clients. Joueurs jusqu'à 18 Admin Crafty navigateur Moi poste admin TCPShield relais anti-DDoS cache l'IP réelle Reverse proxy HTTPS Let's Encrypt LA MAISON — IP JAMAIS DONNÉE Minecraft moddé port non exposé Crafty (Docker) écoute en local SSH clés uniquement TCP relais HTTPS local SSH, clé publique
Deux chemins séparés pour le jeu et pour l'admin. L'adresse de la maison n'apparaît dans aucun des deux.

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
Les deux lignes qui comptent dans la configuration SSH.

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.

En-tête du panneau Crafty : serveur en ligne, depuis combien de temps, utilisation processeur et mémoire, version 1.7.10, modpack GT: New Horizons, onglets terminal, journaux, sauvegardes.
Le panneau Crafty, sur un autre de mes serveurs (GT: New Horizons). Les journaux sont coupés de la capture.

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