---
title: "Administration réseaux : Le firewall et le NAT"
date: 2022-02-07
tags: ["IPv4", "iptables"]
categories: ["Administration Réseaux", "Cours"]
---

## Historique

 * 1990 ipfwadm: creation des tables `INPUT`, `OUTOUT`, `FORWARD`. Support de
    TCP, UDP et ICMP.
 * ipchains: evolution de ipfwadm, ajout du supportd'`IP` et des chaines. Les
     paquets pouvaient passer plusieurs fois par les tables lors du NAT
 * 2004 iptables: ajout des tables `filter`, `nat`, `mangle`
 * 2012 nftables: supression des commandes satellites (gestion de l'arp). Ajout
     de flexibilité (creation de tables, regles avec plusieurs actions ...)
 * now BPF: machine virtuelle dans le noyau pour gérerle filtrage    

## IPTable

### table

Regroupement de règles ayant un but commun: ﬁlter pour le filtrage, nat pour la
translation d'adresses et mangle pour le marquage de paquets:

 * filter
   * OUTPUT
   * INPUT
   * NAT
 * nat
   * POSTROURING
   * PREROUTING
   * OUTPUT

### La translation d'adresse

#### Dans le cas du NAT statique

```
# paquet sortant
# On fait la modification du paquet le plus tard possible
iptables -t nat -A POSTROUTING -s <@A> -j SNAT --to-source <@P>

# paquet entrant
# On fait la modification le plus tot possible
iptables -t nat -A PREROUTING -d <@P>-j DNAT --to-destination <@A>
```

#### Dans le cadre du NAT dynamique

```
# Paquets sortants
iptables -t nat -A POSTROUTING -s <@Net_priv> -o eth1 -j MASQUERADE
```

Il est possible de faire plusieurs commande `MASQUERADE` si l'on a plusieurs
sorties et plusieurs réseau interne par exemple

Maitenant si on veut rendre une machne accessible de l'exterieur sur le port 80
par exemple :

```
iptables -t nat-A PREROUTING -p tcp --dport 80 -d<@IP_gateway> -j DNAT --to <@>
```

## Le pare-feu

Premiere ligne de defense de notre infrastructure. Philosophie generale: ce qui
vient de l'exterieur n'est pas de confiance, ce qui sort de notre reseau l'est.

Les services accessibles depuis l'exterieurs (serveur web par ex.) sont
positionnés dans une DMZ.

### Les polices par defaut d'iptable

 * ACCEPT
 * DROP
 * REJECT

On preferera utiliser `DROP` que `REJECT` : non seulement on donne des
information sur la machine, mais en plus on consomme de la ressource (trame ICMP
envoyee en retour).

### technique avancée

Il est possible de limiter les connexions vers le serveur web à 10 par minutes

```
iptables -A FORWARD -p tcp --dport 80 -d <@srv_web> -m limit --limit 10/m -j
ACCEPT
```

Il est aussi possible de filtrer les paquets en fonction de leur état. Via le
tuple `<@source, @destination, src_port, dest_port>` le pare-feu est en mesure
de stocker l'état de la connexion. Elle peut être de 3 formes:

 * NEW (paquet `SYN` reçu du client)
 * ESTABLISHED (`SYN + ACK` complet -- poignée de main terminée)
 * RELATED (connexion relative à une déjà établie)
 * INVALID

```
# autoriser les nouvelles connexions en HTTP
iptables -A FORWARD -p tcp --dport 80 -d <@srv_web> -m state --state NEW, ESTABLISHED

# On peut factoriser tous les established, on ne peut de toutes manière pas
# passer en ESTABLISHED dans passer avant par un NEW
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
```

#### INVALID: le cas du scan de port

Une premiere facon de faire du scan avec la methodedu `SYNScan` : on envoie des
syn sur un ensemblede ports.

Il est aussi possile de faire du `NULLScan`: On envoie un segment TCP avec tous
les champs mis à `null` Si le port est ouvert alors il n'y aura pas de reponse,
S'il est ferme, le serveur renvoie un `RST-ACK`

`INVALID` permet donc de gérer le cas du `NullScan` explicitement.
