Projets 03 / 04

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.

État
Perso
Année
2025
Durée
2025, plusieurs mois
Rôle
Seul, admin système et réseau
Pour qui
Un Discord de 60 membres, 18 joueurs en même temps au maximum
La règle
Ne jamais donner l'adresse IP de la maison
Outils
Ubuntu Server, Docker, Crafty, SSH, Reverse proxy, Let's Encrypt, Cloudflare, TCPShield

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.

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.

04

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.

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.

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.

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.

Tous les projets

Contact

Parlons-en

pfery@outlook.fr