IPNAT(5) Formats de fichiers de FreeBSD
ipnat, ipnat.conf - format de fichier de traduction d'adresses réseau (NAT)
Les fichiers acceptés par ipnat sont construits sous forme de règles :
règle :: = map | mapblock | redir. map ::= mapit nom-if masque "->" masque [ mapport ] . mapblock ::= "map-block" nom-if masque "->" masque [ ports ] . redir ::= "rdr" nom-if [ specfrom ] masque "->" ip [ ports ] [ tcpudp ] . ports ::= "ports" numéroport | "auto" . mapit ::= "map" | "bimap" . masque ::= ip "/" bits | ip "/" masque | ip "netmask" masque . mapport ::= "portmap" tcpudp numéroport ":" numéroport . specfrom ::= "from" ip "/" masque . tcpudp ::= "tcp" | "udp" | "tcp/udp" . numéroport ::= nombres { nombres } | "auto" . nom-if ::= 'A' - 'Z' { 'A' - 'Z' } nombres .
nombres ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' .
Dans leur forme standard, les règles NAT doivent commencer par map suivi de l'interface (nomif) pour laquelle l'adresse source des paquets sortants est à ré-écrire.
Les paquets à ré-écrire ne peuvent être sélectionnés qu'avec l'adresse source originale. Un masque réseau doit accompagner l'adresse IP.
L'adresse sélectionnée pour remplacer l'originale est choisie à partir de paires numéro IP-masque réseau. Un masque ne contenant que des 1 pour indiquer un hôte est valide. En revanche s'il en contient 31 (255.255.255.254) il ne l'est pas puisqu'il est impossible d'en tirer une adresse IP, de diffusion et de sous-réseau.
Lors du ré-adressage des paquets TCP et UDP, il est aussi possible de modifier le numéro de port source. Soit TCP, soit UDP, soit les deux peuvent être sélectionnés par chaque règle avec un intervalle de numéros de ports à ré-adresser donné sous la forme numéro-de-port: numéro-de-port.
Les commandes intégrées au filtre IP de NAT sont :
map
pour faire correspondre une adresse ou un réseau à un autre de manière irrégulière.
rdr
pour rediriger des paquets issus d'une paire adresse-port vers une autre.
bimap
pour mettre en place une NAT bidirectionnelle entre une adresse IP externe et une adresse IP interne.
map-block
pour mettre en place une traduction d'adresses IP statiques basé sur un algorithme qui fait la correspondance entre les adresses à traduire et une réserve de destinations.
D'une manière générale, dans une traduction ou une redirection de paquets, l'adresse sujette au changement est étroitement liée au protocole pour déterminer si elle doit être modifiée. En cas de redirection, il est aussi possible de sélectionner des paquets provenant d'un ensemble d'adresses à l'aide de from, de même que du port destinataire obligatoire. Le paquet correspondant à la règle est à gauche du "->" de chaque règle.
A la droite du "->" se trouvent l'adresse et le port qui seront écrits dans le paquet si celui-ci correspond aux contraintes de gauche. Le cas de la redirection (rdr) est encore plus simple : la nouvelle adresse de destination est spécifiée dans la règle. Dans les règles map, l'adresse de destination sera celle d'un couple nouvelle source-destination avéré unique. Si le paquet est un paquet TCP ou UDP, les ports source et destination entrent aussi en compte. Si le couple existe déja, IP Filter commence par augmenter le numéro de port en respectant l'intervalle spécifié par portmap puis, si aucun couple n'est unique, augmente l'adresse source dans l'intervalle du masque réseau. Si aucun couple unique ne peut être trouvé, le paquet n'est pas traduit. La commande map-block est plus limitée dans sa recherche de nouveau couples libres et uniques. Elle se base sur un algorithme qui détermine quelle doit être la nouvelle adresse source à partir des ports disponibles (l'adresse IP n'est jamais modifiée et le numéro de port reste dans l'intervalle déterminé).
IP Filter comprend quelques mandataires (proxy) simples, qui se chargent dans le noyau. Ils permettent à des canaux secondaires de s'ouvrir sans avoir à forcer les paquets à partir vers les programmes utilisateur.
Le vrai mandatage transparent doit être effectué à l'aide de redirections (rdr) vers l'hôte local (127.0.0.1). Le programme mandataire se charge de déterminer, par /dev/ipnat, la vrai source et adresse de la connexion.
Cette section concerne la commande map et ses variations.
Pour changer les adresses IP internes du réseau 10 en celles du réseau 209.1.2.0 sur 8 bits du FAI, par l'interface ppp0, inscrivez :
map ppp0 10.0.0.0/8 -> 209.1.2.0/24Le problème évident est que nous essayons de transformer 16 millions d'adresses en seulement 254. Pour éviter ce goulot d'étranglement, on peut augmenter les 254 adresses en utilisant les correspondances de ports TCP/UDP :
map ppp0 10.0.0.0/8 -> 209.1.2.0/24 portmap tcp/udp 1025:65000qui nous mène à 527 566 adresses, loin de la quantité disponible sur le réseau 10. En combinant les règles, les spécifications deviennent :
map ppp0 10.0.0.0/8 -> 209.1.2.0/24 portmap tcp/udp 1025:65000 map ppp0 10.0.0.0/8 -> 209.1.2.0/24Ainsi, les paquets TCP et UDP peuvent voir leurs ports transformés alors que les autres protocoles, ICMP par exemple, ne voient que leur adresse IP transformée. Dans certains cas, il est préférable d'utiliser le mot clef auto à la place de l'intervalle pour garantir à tous un accès simultané. Cependant, dans l'exemple ci-dessus, le comportement sera d'associer un port par adresse IP puisqu'il faut réduire 24 bits en 8. Un bon exemple d'utilisation peut être :
map ppp0 172.192.0.0/16 -> 209.1.2.0/24 portmap tcp/udp autopermettant à chaque adresse IP d'être associée à une petite réserve de ports (252). Mais le problème est que la commande map indique à NAT d'utiliser la paire adresse-port disponible suivante pour les connexions sortantes. Il est donc difficile de voir la relation entre les adresses-ports externes et internes. Là intervient la directive map-block :
map-block ppp0 172.192.0.0/16 -> 209.1.2.0/24 ports autoIl résultera que 172.192.0.0/24 sera mis en correspondance avec 209.1.2.0/32 et chaque adresse de 172.192.0.0 à 172.192.0.255 aura sa réserve de 252 ports. Si pour quelque raison l'utilisateur de la machine 172.192.0.2 (par exemple) a besoin de 260 connexions sortantes simultanées, il sera limité à 252 avec map-block et sera simplement "translaté" vers l'adresse IP suivante avec map.
/dev/ipnat
/etc/services
/etc/hosts
Version française le 26 juillet 2000 par Guillain SEUILLOT <Guillain@lycosmail.com>