From 8dbfa2f8dd19873c46445ed8222122bb99f3613d Mon Sep 17 00:00:00 2001 From: alkatrazz Date: Fri, 3 Jul 2026 00:02:05 +0200 Subject: [PATCH] fix(satisfactory): ouvrir le port 8888/tcp Reliable Messaging MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Depuis la 1.1, le client ouvre un socket TCP :8888 en plus du jeu UDP :7777. Bloqué par firewalld, le join réussissait puis le client était déconnecté (~60 s) avec « connection to the host has been lost » (log client : LogReliableMessaging: Failed to connect to server socket). - firewalld gpu-01 : + 8888/tcp (variable satisfactory_reliable_port) - gateway s01 : DNAT + forward étendus à 8888/tcp - doc : tableau des 3 sockets + piège n°3 Co-Authored-By: Claude Fable 5 --- admin/ops/satisfactory.md | 20 ++++++++++++++++--- .../roles/gateway/templates/nftables.conf.j2 | 11 +++++----- ansible/roles/satisfactory_server/README.md | 3 ++- .../satisfactory_server/defaults/main.yml | 4 +++- .../roles/satisfactory_server/tasks/main.yml | 12 ++++++----- 5 files changed, 35 insertions(+), 15 deletions(-) diff --git a/admin/ops/satisfactory.md b/admin/ops/satisfactory.md index 223f448..6cb37fc 100644 --- a/admin/ops/satisfactory.md +++ b/admin/ops/satisfactory.md @@ -16,10 +16,18 @@ définissent **en jeu à la première connexion** (pas de fichier de config). ## Réseau -- **gpu-01 firewalld** : `7777/tcp` + `7777/udp` ouverts (gérés par le rôle). +Le serveur utilise **trois sockets** (Satisfactory ≥ 1.1) : + +| Port | Proto | Rôle | +|---|---|---| +| 7777 | UDP | Jeu | +| 7777 | TCP | API HTTPS (Server Manager) | +| 8888 | TCP | **Reliable Messaging** — bloqué = déconnexion ~60 s après chaque join | + +- **gpu-01 firewalld** : `7777/tcp+udp` + `8888/tcp` ouverts (gérés par le rôle). Les ports `7778/udp` et `27015/udp` encore ouverts sont des restes pré-1.0, inutiles. -- **storage-01 nftables** (rôle `gateway`) : DNAT `192.168.1.200:7777 → 192.168.10.20:7777` - (TCP+UDP) + règle forward associée. Redéploiement : `--tags gateway`. +- **storage-01 nftables** (rôle `gateway`) : DNAT `192.168.1.200 → 192.168.10.20` + (7777 TCP+UDP, 8888 TCP) + règles forward associées. Redéploiement : `--tags gateway`. ## Exploitation @@ -47,3 +55,9 @@ systemctl restart satisfactory-server `user_tmp_t`, le jeu héritait de `var_t` (/srv) — systemd (init_t) refuse d'exécuter ces types. Le rôle pose un fcontext **`bin_t`** sur `steamcmd/` et `server/` + `restorecon`. Symptôme : `Failed at step EXEC ... Permission denied`. +3. **Déconnexion ~60 s après chaque join** (« Your connection to the host has been + lost ») : le port **8888/tcp (Reliable Messaging)** n'était pas ouvert. Le join UDP + réussit, puis le client tente le socket TCP 8888, se fait rejeter par firewalld et + abandonne. Diagnostic dans le log **client** + (`.../FactoryGame/Saved/Logs/FactoryGame.log`) : + `LogReliableMessaging: Error: Failed to connect to server socket`. diff --git a/ansible/roles/gateway/templates/nftables.conf.j2 b/ansible/roles/gateway/templates/nftables.conf.j2 index a0aba9c..9450336 100644 --- a/ansible/roles/gateway/templates/nftables.conf.j2 +++ b/ansible/roles/gateway/templates/nftables.conf.j2 @@ -68,9 +68,10 @@ table inet filter { # Réponses WAN → cluster (connexions initiées depuis le cluster) iif {{ wan_interface }} oif {{ lan_interface }} ct state established,related accept - # Satisfactory — trafic DNATé (192.168.1.200:7777) → gpu-01:7777, quelle que soit - # la source (couvre un éventuel port-forward internet depuis la box) - ip daddr 192.168.10.20 tcp dport 7777 ct state new,established,related accept + # Satisfactory — trafic DNATé (192.168.1.200) → gpu-01, quelle que soit la source + # (couvre un éventuel port-forward internet depuis la box). + # 7777 = jeu/API ; 8888 = reliable messaging TCP (1.1) — bloqué = kick à ~60 s + ip daddr 192.168.10.20 tcp dport { 7777, 8888 } ct state new,established,related accept ip daddr 192.168.10.20 udp dport 7777 ct state new,established,related accept } @@ -84,8 +85,8 @@ table ip nat { type nat hook prerouting priority -100; # Satisfactory — DNAT WAN → serveur dédié sur gpu-01 - # (joignable via 192.168.1.200:7777 sans route vers 192.168.10.0/24) - iif {{ wan_interface }} tcp dport 7777 dnat to 192.168.10.20:7777 + # (joignable via 192.168.1.200 sans route vers 192.168.10.0/24) + iif {{ wan_interface }} tcp dport { 7777, 8888 } dnat to 192.168.10.20 iif {{ wan_interface }} udp dport 7777 dnat to 192.168.10.20:7777 } diff --git a/ansible/roles/satisfactory_server/README.md b/ansible/roles/satisfactory_server/README.md index 97d1ebf..6d2ecac 100644 --- a/ansible/roles/satisfactory_server/README.md +++ b/ansible/roles/satisfactory_server/README.md @@ -10,7 +10,8 @@ Steam `1690800`), lancé par systemd (`satisfactory-server.service`). | `satisfactory_user` | `satisfactory` | Utilisateur système du service | | `satisfactory_home` | `/srv/satisfactory` | Home + racine d'install | | `satisfactory_install_dir` | `/srv/satisfactory/server` | Fichiers du jeu (~10 Go) | -| `satisfactory_port` | `7777` | Port unique jeu + API HTTPS (TCP+UDP depuis la 1.0) | +| `satisfactory_port` | `7777` | Jeu (UDP) + API HTTPS (TCP) | +| `satisfactory_reliable_port` | `8888` | Reliable Messaging (TCP, ≥ 1.1) — **bloqué = kick à ~60 s** | | `satisfactory_update_on_start` | `true` | `steamcmd +app_update` en `ExecStartPre` à chaque (re)start | | `satisfactory_memory_max` | `16G` | `MemoryMax` systemd — protège llama-server (32 Go partagés) | | `satisfactory_nice` | `5` | Priorité CPU réduite vs llama-server | diff --git a/ansible/roles/satisfactory_server/defaults/main.yml b/ansible/roles/satisfactory_server/defaults/main.yml index 49acb22..6416f43 100644 --- a/ansible/roles/satisfactory_server/defaults/main.yml +++ b/ansible/roles/satisfactory_server/defaults/main.yml @@ -4,7 +4,9 @@ satisfactory_home: /srv/satisfactory satisfactory_steamcmd_dir: "{{ satisfactory_home }}/steamcmd" satisfactory_install_dir: "{{ satisfactory_home }}/server" satisfactory_app_id: 1690800 # Satisfactory Dedicated Server (Steam, login anonyme) -satisfactory_port: 7777 # port unique jeu + API HTTPS (TCP+UDP depuis la 1.0) +satisfactory_port: 7777 # jeu (UDP) + API HTTPS (TCP) +satisfactory_reliable_port: 8888 # socket TCP « Reliable Messaging » (depuis la 1.1) — + # bloqué = déconnexion ~60 s après chaque join satisfactory_update_on_start: true # steamcmd +app_update à chaque (re)démarrage du service # Garde-fous ressources : gpu-01 partage ses 32 Go avec llama-server (~10 Go résidents). diff --git a/ansible/roles/satisfactory_server/tasks/main.yml b/ansible/roles/satisfactory_server/tasks/main.yml index 8749318..4c532cf 100644 --- a/ansible/roles/satisfactory_server/tasks/main.yml +++ b/ansible/roles/satisfactory_server/tasks/main.yml @@ -108,14 +108,16 @@ daemon_reload: true state: started -# --- Firewall (7777 TCP+UDP : jeu + API HTTPS) --- +# --- Firewall --- +# 7777 : jeu (UDP) + API HTTPS (TCP). 8888 : reliable messaging (TCP, depuis la 1.1). -- name: Open game port in firewall +- name: Open game ports in firewall ansible.posix.firewalld: - port: "{{ satisfactory_port }}/{{ item }}" + port: "{{ item }}" permanent: true state: enabled immediate: true loop: - - tcp - - udp + - "{{ satisfactory_port }}/tcp" + - "{{ satisfactory_port }}/udp" + - "{{ satisfactory_reliable_port }}/tcp"