Funk-lab/ansible/roles/gateway/templates/nftables.conf.j2
ALI YESILKAYA 507f4822f0
feat(ansible): serveur dédié Satisfactory sur gpu-01 (#74)
* feat(ansible): serveur dédié Satisfactory sur gpu-01

- Nouveau rôle satisfactory_server : install steamcmd (login anonyme,
  app 1690800), service systemd avec update auto en ExecStartPre,
  MemoryMax=16G + Nice=5 (protège le llama-server), firewalld 7777 tcp+udp
- Retries steamcmd (« Missing configuration » rc=8 au premier run)
- Fcontext SELinux bin_t sur steamcmd/ et server/ (203/EXEC sinon)
- gateway : DNAT 192.168.1.200:7777 → gpu-01:7777 (TCP+UDP) + forward
- Doc admin/ops/satisfactory.md (accès, exploitation, pièges rencontrés)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

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

* docs(satisfactory): accès internet via IPv4 full-stack Free

Le remap de port Freebox (17777→7777) ne fonctionne pas : le serveur
annonce ses ports dans le protocole (externe = interne obligatoire).
Option IPv4 full-stack activée → redirections 1:1 7777 tcp+udp + 8888 tcp
vers funk-s01, DNAT existant inchangé.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 00:56:28 +02:00

99 lines
3.8 KiB
Django/Jinja

#!/usr/sbin/nft -f
# Géré par Ansible — ne pas modifier manuellement
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# Loopback
iif lo accept
# Connexions établies
ct state established,related accept
# ICMP
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
# SSH depuis le LAN domestique et le LAN cluster
tcp dport 22 ip saddr { 192.168.1.0/24, 192.168.10.0/24 } accept
# DNS + DHCP (dnsmasq)
udp dport 53 ip saddr 192.168.10.0/24 accept
tcp dport 53 ip saddr 192.168.10.0/24 accept
udp dport 67 iif {{ lan_interface }} accept
# NFS
tcp dport { 111, 2049 } ip saddr 192.168.10.0/24 accept
udp dport { 111, 2049 } ip saddr 192.168.10.0/24 accept
# Services données (accès cluster uniquement)
tcp dport { 5432, 6333, 6334, 9000, 9001 } ip saddr 192.168.10.0/24 accept
# Monitoring — node_exporter (scraping par Prometheus : nœuds cluster + pods 10.42/16)
tcp dport 9100 ip saddr { 192.168.10.0/24, 10.42.0.0/16 } accept
# AlertManager webhook → Hermes monitor (pods k8s 10.42/16 + nœuds cluster)
tcp dport 9093 ip saddr { 192.168.10.0/24, 10.42.0.0/16 } accept
# Hermes gateway (accès LAN domestique + cluster + pods k8s pour alertmanager webhook)
tcp dport 8080 ip saddr { 192.168.1.0/24, 192.168.10.0/24, 10.42.0.0/16 } accept
# Hermes dashboard (poste admin uniquement)
tcp dport 9119 ip saddr {{ hermes_dashboard_allowed_ip }} accept
# LiteLLM proxy (pods k8s 10.42/16 + nœuds cluster + LAN domestique pour client vocal)
tcp dport 4000 ip saddr { 192.168.1.0/24, 192.168.10.0/24, 10.42.0.0/16 } accept
# Postfix relay SMTP (pods k8s 10.42/16 + nœuds cluster)
tcp dport 25 ip saddr { 192.168.10.0/24, 10.42.0.0/16 } accept
# Hermes auto-improve trigger server (pods k8s 10.42/16 + nœuds cluster)
tcp dport 9095 ip saddr { 192.168.10.0/24, 10.42.0.0/16 } accept
log prefix "nft-drop: " drop
}
chain forward {
type filter hook forward priority 0; policy drop;
# Forwarding LAN cluster → WAN (NAT sortant)
iif {{ lan_interface }} oif {{ wan_interface }} ct state new,established,related accept
# Forwarding LAN domestique → LAN cluster (accès admin depuis le poste perso)
iif {{ wan_interface }} oif {{ lan_interface }} ip saddr 192.168.1.0/24 ct state new,established,related accept
# 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) → 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
}
chain output {
type filter hook output priority 0; policy accept;
}
}
table ip nat {
chain prerouting {
type nat hook prerouting priority -100;
# Satisfactory — DNAT WAN → serveur dédié sur gpu-01
# (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
}
chain postrouting {
type nat hook postrouting priority 100;
# NAT masquerade pour le LAN cluster
oif {{ wan_interface }} ip saddr 192.168.10.0/24 masquerade
}
}