Guides
NAT
NAT source, redirection de ports et exemptions de NAT (nat44_ed).
SiHA exécute le moteur nat44_ed de VPP — une implémentation de NAT44
endpoint-dependent qui gère le NAT source dynamique, les mappings statiques
(1:1 / redirection de port) et les exemptions explicites de translation, le tout
piloté par des ressources COSI déclaratives.
Quatre types de ressources couvrent l’ensemble du cycle de vie du NAT :
| Ressource | Rôle |
|---|---|
NATInterfaceModes.nat.siha | Marque une interface comme INSIDE, OUTSIDE, ou les deux |
NATPools.nat.siha | Plage(s) d’adresses parmi lesquelles le SNAT dynamique choisit les IP traduites |
NATStaticMappings.nat.siha | Mapping 1:1 d’adresse ou redirection de port (DNAT / SNAT statique) |
NATIdentityMappings.nat.siha | Exempte un hôte (ou un port/protocole) de la translation |
Fonctionnement
nat44_ed suit les sessions de façon bidirectionnelle. Pour qu’une session se
forme, au moins une interface doit être marquée INSIDE (le côté face au client)
et au moins une OUTSIDE (le côté face à Internet). Le trafic provenant d’une
interface INSIDE subit un SNAT dynamique vers une adresse du pool, sauf s’il est
supplanté par un mapping statique ou d’identité.
Modes d’interface
# Mark the LAN-facing interface as INSIDE.
type: NATInterfaceModes.nat.siha
metadata: { namespace: nat, id: int }
spec:
interface: int # COSI id of an Interfaces.link.siha resource
mode: INSIDE
---
# Mark the WAN-facing interface as OUTSIDE.
type: NATInterfaceModes.nat.siha
metadata: { namespace: nat, id: ext }
spec:
interface: ext
mode: OUTSIDE
Valeurs mode valides : INSIDE, OUTSIDE, INSIDE_AND_OUTSIDE.
Pool d’adresses (SNAT dynamique)
type: NATPools.nat.siha
metadata: { namespace: nat, id: snat-pool }
spec:
ranges:
- { first: 203.0.113.100, last: 203.0.113.110 }
# vrf: tenant-a # omit for the default VRF (table 0)
ranges est une liste de plages IPv4 inclusives [first, last]. Un pool sans
aucune plage est valide mais ne fait rien — utile comme espace réservé.
Mapping statique (1:1 / redirection de port)
Les mappings statiques sont bidirectionnels : le trafic entrant vers
externalAddress:externalPort est traduit en localAddress:localPort, et le
trafic sortant depuis l’adresse locale est traduit vers l’adresse externe.
Redirection de port (DNAT) — rediriger TCP 443 vers un hôte interne :
type: NATStaticMappings.nat.siha
metadata: { namespace: nat, id: web-dnat }
spec:
externalAddress: 203.0.113.1
externalPort: 443
localAddress: 10.0.1.80
localPort: 443
protocol: tcp # name (tcp, udp, icmp, …) or a raw number
# vrf: "" # omit for the default VRF
protocol, externalPort et localPort doivent tous être définis ensemble, ou
tous omis (ce qui exprime un mapping 1:1 sur adresse seule, pour tout protocole).
protocol prend un nom (tcp, udp, icmp, icmp6, sctp) ou un numéro ;
sihactl lit et affiche le nom.
Exemption de NAT (mapping d’identité)
Sans mapping d’identité, chaque flux issu d’une interface INSIDE subit un SNAT. Un mapping d’identité exempte un hôte spécifique (ou un port par protocole) de la translation, de sorte qu’il apparaît sur le réseau avec sa propre adresse :
# Exempt the appliance's own loopback from SNAT (address-only).
type: NATIdentityMappings.nat.siha
metadata: { namespace: nat, id: lo-exempt }
spec:
address: 10.0.1.1
# port: 53
# protocol: udp # if set, both port and protocol must be set
# vrf: ""
port et protocol sont conjointement optionnels : les deux à zéro signifie que
tous les protocoles et ports pour cette adresse sont exemptés. Dès que l’un est
défini, l’autre doit l’être aussi.
Exploitation
S="sihactl --sihaconfig ~/.siha/config --addr <node-ip>:6443"
$S get natinterfacemode # list interface modes + status
$S get natpool # list address pools
$S get natstaticmapping # list static mappings
$S get natidentitymapping # list identity (exemption) mappings
$S nat sessions # dump active NAT44 translation sessions
nat sessions est un vidage en direct de l’état VPP — il n’est adossé à aucune
ressource COSI. Il affiche les tuples adresse/port inside, outside et
external-host, le protocole, la table VRF, les cumuls octets/paquets, et si la
session a expiré.
Chaque type de ressource possède un statut associé (par ex. NATPoolStatus) qui
rapporte la dernière erreur et les plages programmées ;
sihactl get natpool <id> -o yaml affiche à la fois le spec et le statut dans une
seule sortie.
Interaction avec la répartition de charge
NATLBMapping (le répartiteur de charge de SiHA) tourne sur le même moteur
nat44_ed que ces règles NAT : une seule table de sessions, coexistant sur
les mêmes interfaces sans conflit — évitez simplement de réutiliser une
adresse de pool NAT comme VIP de LB.