Ports et pare-feu
Le jeu des joueurs se connecte directement à ton serveur, sur un seul port : 25252 par défaut (GamePort dans la configuration). Le jeu l’utilise en UDP, le téléchargement des mondes en TCP : ouvre les deux.
L’assistant de configuration en fait l’essentiel : il ouvre le port sur ta box par UPnP et le fait tester par NodeWorld depuis internet. Cette page sert pour ce qu’il ne peut pas faire, et quand le test échoue.
Sur la machine
Linux (ufw)
sudo ufw allow 25252/udp
sudo ufw allow 25252/tcpWindows
Installé en service, le serveur a sa règle dans le Pare-feu Windows Defender : rien à faire. Sans le service, le premier lancement demande si le serveur peut utiliser le réseau : autorise-le. Sinon, ouvre un PowerShell en administrateur :
New-NetFirewallRule -DisplayName "NodeWorld Server UDP" -Direction Inbound -Protocol UDP -LocalPort 25252 -Action Allow
New-NetFirewallRule -DisplayName "NodeWorld Server TCP" -Direction Inbound -Protocol TCP -LocalPort 25252 -Action AllowSur ta box
À la maison, la machine est derrière ta box internet. L’assistant de configuration demande à la box de rediriger le port par UPnP ; avec Upnp: true dans la configuration, le serveur le redemande à chaque démarrage et toutes les 30 minutes, parce qu’une box l’oublie quand elle redémarre. La plupart des box acceptent ; sur certaines, l’UPnP est désactivé dans les réglages.
Sinon, redirige-le toi-même : dans les réglages de la box, redirige le port 25252, en UDP et en TCP, vers l’adresse locale de la machine (192.168.1.20, par exemple ; l’assistant l’affiche). Le nom de la page change d’une box à l’autre : redirection de ports, NAT, serveur virtuel.
Mets ensuite dans PublicAddress ton adresse IP publique, ou mieux, un nom de domaine qui pointe dessus (ton IP peut changer). Si la box redirige un autre port extérieur vers 25252, mets ce port extérieur dans PublicPort.
Quand ton fournisseur partage ton adresse
Certains fournisseurs d’accès donnent la même adresse IPv4 à plusieurs abonnés (CGNAT). L’assistant de configuration te prévient quand il le voit : l’adresse internet de ta box n’est alors pas publique (de 100.64.x.x à 100.127.x.x, par exemple). Personne de l’extérieur ne peut joindre un serveur derrière, redirection de port ou pas. Demande à ton fournisseur une adresse IPv4 publique, ou prends un serveur loué.
Sur un serveur loué
Une machine louée ou dans le cloud a souvent aussi un pare-feu dans le panneau de son hébergeur (groupe de sécurité, règles de pare-feu) : ouvre aussi 25252 en UDP et en TCP à cet endroit.
Vérifier
Arrête le serveur et relance son assistant avec --setup : son test du port dit si NodeWorld joint le port en UDP et en TCP, et liste ce qu’il faut vérifier sinon. Au lancement, le journal du serveur affiche Public Endpoint: avec l’adresse et le port donnés aux joueurs. Demande à un ami en dehors de ton réseau de rejoindre ton serveur depuis Explorer. Si le jeu dit Ce serveur n’est pas disponible. ou charge sans fin, le port n’est pas ouvert depuis l’extérieur.
Ce que les scripts des mondes atteignent
Les scripts FL# d'un monde qui tournent sur ton serveur peuvent faire des requêtes web et ouvrir des WebSockets vers n'importe quelle adresse : aucun joueur n'est là pour l'autoriser. Cela comprend ce que ta machine voit et qu'Internet ne voit pas :
- les services de la machine elle-même (
127.0.0.1,localhost) : un panneau d'administration, une base de données, l'API d'un autre programme ; - ton réseau local : ta box, un NAS, les autres ordinateurs ;
- sur une machine dans le cloud (AWS, Google Cloud, Azure…), l'adresse de métadonnées
169.254.169.254, qui peut donner les identifiants de la machine.
NodeWorld n'en bloque rien sur un serveur. N'installe que des mondes de confiance, et si tu veux tenir leurs scripts à l'écart de ces adresses, bloque-les dans le pare-feu de la machine.
L'adresse de métadonnées du cloud
Sur une machine dans le cloud, pour toute la machine :
sudo ufw deny out to 169.254.169.254New-NetFirewallRule -DisplayName "Block cloud metadata" -Direction Outbound -RemoteAddress 169.254.169.254 -Action BlockLa machine et le réseau local, pour le serveur seulement
Linux : le serveur tourne sous l'utilisateur de son service ; ces règles refusent les nouvelles connexions de cet utilisateur vers la machine et le réseau local, sauf ses recherches de noms (127.0.0.53, systemd-resolved). Elles valent pour tous les programmes de cet utilisateur : sur une machine qui sert aussi à autre chose, fais tourner le serveur sous un utilisateur à lui. Si cat /etc/resolv.conf montre un serveur de noms sur ton réseau (192.168.1.1, par exemple), ajoute pour lui une ligne ACCEPT comme celles de 127.0.0.53, après elles (-I met chaque règle en premier, avant les règles d'ufw).
U=$(systemctl show -p User --value nodeworld-server); [ -n "$U" ] || U=$(whoami)
for net in 127.0.0.0/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 169.254.0.0/16 100.64.0.0/10; do
sudo iptables -I OUTPUT -m owner --uid-owner "$U" -m conntrack --ctstate NEW -d "$net" -j REJECT
done
sudo iptables -I OUTPUT -m owner --uid-owner "$U" -d 127.0.0.53 -p udp --dport 53 -j ACCEPT
sudo iptables -I OUTPUT -m owner --uid-owner "$U" -d 127.0.0.53 -p tcp --dport 53 -j ACCEPTCes règles se perdent au prochain démarrage de la machine : sudo apt install iptables-persistent les garde (il propose d'enregistrer les règles du moment).
Windows : une règle pour le programme du serveur seulement (celui du service, ou mets le chemin de ton NodeWorld.Server.exe dans $exe). Windows ne filtre pas les connexions d'un programme vers la machine elle-même (127.0.0.1) : un service de la machine qui écoute là reste joignable, protège-le par un mot de passe ou arrête-le.
$path = (Get-CimInstance Win32_Service -Filter "Name='NodeWorldServer'").PathName
$exe = if ($path.StartsWith('"')) { $path.Split('"')[1] } else { $path.Split(' ')[0] }
New-NetFirewallRule -DisplayName "NodeWorld scripts: no local network" -Direction Outbound -Program $exe -RemoteAddress 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,169.254.0.0/16,100.64.0.0/10 -Action BlockLes scripts d'un monde qui essaient une adresse bloquée reçoivent une erreur, et ton journal montre une ligne [Web] avec l'adresse et la raison.
