# Réseau — nftables, routage, NAT

Tout ce qui suit s'exécute sur **storage-01** sauf mention contraire.

---

## Interfaces réseau storage-01

| Interface | IP | Rôle |
|---|---|---|
| `enp4s0` | `192.168.1.200` | WAN — vers Freebox (LAN domestique) |
| `enp6s0f3u2c2` | `192.168.10.1` | LAN cluster — vers machines |

> Noms contre-intuitifs : `enp6s0f3u2c2` est une carte USB-Ethernet (cluster),
> `enp4s0` est la carte PCIe (WAN).

---

## Route statique poste perso

Pour atteindre le LAN cluster depuis le poste (`192.168.1.10`) :

```bash
# Route permanente (NetworkManager)
nmcli connection modify enp12s0 +ipv4.routes "192.168.10.0/24 192.168.1.200"
nmcli connection up enp12s0

# Vérifier
ip route | grep 192.168.10
ping 192.168.10.20   # gpu-01
```

La route statique Freebox (`192.168.10.0/24 → 192.168.1.200`) est aussi configurée
dans l'interface Freebox pour que tous les équipements du LAN domestique puissent
atteindre le cluster.

---

## nftables

Géré par Ansible — rôle `gateway`, template `nftables.conf.j2`.
**Ne jamais modifier manuellement** — les changements seront écrasés au prochain `ansible-playbook`.

```bash
# Voir toutes les règles actives
sudo nft list ruleset

# Voir les paquets bloqués (logs kernel)
sudo journalctl -k | grep nft-drop

# Recharger après modification manuelle d'urgence
sudo systemctl reload nftables

# Appliquer via Ansible (méthode correcte)
ansible-playbook -i inventory.yml playbooks/storage-01.yml --tags gateway
```

### Ports ouverts

| Port | Proto | Source | Service |
|---|---|---|---|
| 22 | TCP | 192.168.1.0/24, 192.168.10.0/24 | SSH |
| 53 | TCP/UDP | 192.168.10.0/24 | DNS (dnsmasq) |
| 111, 2049 | TCP/UDP | 192.168.10.0/24 | NFS |
| 5432 | TCP | 192.168.10.0/24 | PostgreSQL |
| 6333, 6334 | TCP | 192.168.10.0/24 | Qdrant |
| 8080 | TCP | 192.168.1.0/24, 192.168.10.0/24 | Hermes gateway |
| 9000, 9001 | TCP | 192.168.10.0/24 | MinIO |
| 9093 | TCP | 192.168.10.0/24 | AlertManager webhook (réception alertes Prometheus) |
| 9100 | TCP | 192.168.10.0/24 | node_exporter (métriques Prometheus — inclut ROCm via textfile_collector) |
| 9119 | TCP | 192.168.1.10 uniquement | Hermes dashboard |

> **Règle nftables importante** : les règles doivent être insérées **avant** la règle `drop` terminale.
> Utiliser `nft insert rule inet filter input position <handle_avant_drop>` et non `nft add rule`
> (qui ajoute en fin de chaîne, après le drop).
> Vérifier l'ordre : `sudo nft -n -a list chain inet filter input`

### Forwarding

```
LAN domestique (192.168.1.0/24) → LAN cluster (192.168.10.0/24) : new+established (admin)
LAN cluster → WAN : new+established (NAT sortant pour les nœuds)
WAN → LAN cluster : established+related uniquement (réponses NAT)
```

---

## IP Forwarding

```bash
# Vérifier (doit être = 1)
sysctl net.ipv4.ip_forward
```

---

## DNS — /etc/hosts storage-01

```bash
cat /etc/hosts
# 192.168.10.20 gpu-01   ← ajouté manuellement (dnsmasq non utilisé par storage-01 lui-même)
```

> storage-01 utilise 1.1.1.1 / 9.9.9.9 comme resolvers, pas son propre dnsmasq.
> Les entrées critiques doivent être dans `/etc/hosts`.

---

## Debug NAT / forwarding

```bash
# Depuis gpu-01 — vérifier que le trafic sort par storage-01
ssh gpu-01 "curl -s https://ifconfig.me"    # doit retourner l'IP publique Freebox
ssh gpu-01 "traceroute 8.8.8.8"

# Paquets passant par le NAT
sudo nft list table ip nat

# Tester le routage depuis le poste perso
traceroute 192.168.10.20
ping 192.168.10.11   # compute-01
```

---

## Commandes utiles

```bash
# Table de routage storage-01
ip route show

# Stats trafic interfaces
ip -s link show enp4s0
ip -s link show enp6s0f3u2c2

# Connexions actives
ss -tnp
```
