fix(satisfactory): ouvrir le port 8888/tcp Reliable Messaging

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 <noreply@anthropic.com>
This commit is contained in:
alkatrazz 2026-07-03 00:02:05 +02:00
parent bd169e5e1a
commit 8dbfa2f8dd
5 changed files with 35 additions and 15 deletions

View file

@ -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`.

View file

@ -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
}

View file

@ -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 |

View file

@ -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).

View file

@ -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"