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 :

RessourceRôle
NATInterfaceModes.nat.sihaMarque une interface comme INSIDE, OUTSIDE, ou les deux
NATPools.nat.sihaPlage(s) d’adresses parmi lesquelles le SNAT dynamique choisit les IP traduites
NATStaticMappings.nat.sihaMapping 1:1 d’adresse ou redirection de port (DNAT / SNAT statique)
NATIdentityMappings.nat.sihaExempte 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.