# **TP02 – Routage, NAT, Filtrage & FTP (with-routers.imn)**

# **tp02.SCR.3.2**

## **0\. Rappels sur la topologie & les adresses**

**Réseaux privés (RFC 1918\)**

* S1 : 172.16.1.0/24

* S2 : 172.16.2.0/24

* S3 : 172.16.3.0/24

**Réseaux publics (routables)**

| Adresse utilisée | Masque | Réseau CIDR | Plage |
| ----- | ----- | ----- | ----- |
| 37.37.37.1 | /22 | 37.37.36.0/22 | 37.37.36.0 – 37.37.39.255 |
| 45.45.45.254 | /21 | 45.45.40.0/21 | 45.45.40.0 – 45.45.47.255 |
| 62.62.62.253 | /19 | 62.62.48.0/19 | 62.62.48.0 – 62.62.79.255 |
| 37.37.37.254 | /22 | 37.37.36.0/22 | même réseau que ci-dessus |
| 45.45.45.253 | /21 | 45.45.40.0/21 | même réseau que ci-dessus |
| 62.62.62.254 | /19 | 62.62.48.0/19 | même réseau que ci-dessus |

**PARTIE I – Topologie with-routers.imn**

## **I.1 Construction de la topologie**

* Partir d’une copie de `two-gateways.imn` du TP précédent.

* Renommer/adapter pour obtenir `with-routers.imn` avec les mêmes noms / adresses que dans l’énoncé.

**I.2 Configuration de GW1 (n10)**  
`node n10 {`  
    `type host`  
    `network-config {`  
        `hostname GW1`  
        `!`  
        `interface eth1`  
         `ip address 172.16.2.253/24`  
         `mac address 42:00:aa:00:00:09`  
        `!`  
        `interface eth0`  
         `ip address 172.16.1.253/24`  
         `mac address 42:00:aa:00:00:08`  
        `!`  
        `interface lo0`  
         `type lo`  
         `ip address 127.0.0.1/8`  
         `ipv6 address ::1/128`  
        `!`  
    `}`  
    `canvas c0`  
    `iconcoords {288 240}`  
    `labelcoords {288 276}`  
    `interface-peer {eth0 n0}`  
    `interface-peer {eth1 n1}`  
    `custom-configs {`  
        `custom-config-id default {`  
            `custom-command /bin/sh`  
            `config {`  
                `# --- IP ---`  
                `ip addr add 127.0.0.1/8 dev lo0`  
                `ip addr add 172.16.1.253/24 dev eth0`  
                `ip addr add 172.16.2.253/24 dev eth1`  
                `ip -6 addr add ::1/128 dev lo0`

                `# --- Forwarding ---`  
                `sysctl -w net.ipv4.ip_forward=1`

                `# --- ROUTES ---`  
                `# Route par défaut vers GW2`  
                `ip route add 0.0.0.0/0 via 172.16.2.254`

                `# --- NAT ---`  
                `# S1 -> S2 (pour les réponses)`  
                `iptables -t nat -A POSTROUTING \`  
                    `-s 172.16.1.0/24 -d 172.16.2.0/24 \`  
                    `-j SNAT --to-source 172.16.2.253`

                `# --- FILTRAGE ---`  
                `# 1. Autoriser les connexions déjà établies`  
                `iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT`

                `# 2. S1 <-> S2 : AUTORISÉ`  
                `iptables -A FORWARD -s 172.16.1.0/24 -d 172.16.2.0/24 -j ACCEPT`  
                `iptables -A FORWARD -s 172.16.2.0/24 -d 172.16.1.0/24 -j ACCEPT`

                `# 3. S1 -> S3 : BLOQUÉ`  
                `iptables -A FORWARD -s 172.16.1.0/24 -d 172.16.3.0/24 -j DROP`

                `# 4. Politique par défaut`  
                `iptables -P FORWARD DROP`

                `# Services`  
                `rpcbind`  
                `inetd`  
            `}`  
        `}`  
    `}`  
    `custom-enabled true`  
    `custom-selected default`  
`}`

**I.3 Configuration de GW2 (n11)**  
`node n11 {`  
    `type host`  
    `network-config {`  
        `hostname GW2`  
        `!`  
        `interface eth2`  
         `ip address 45.45.45.254/21`  
         `mac address 42:00:aa:00:00:0c`  
        `!`  
        `interface eth1`  
         `ip address 172.16.3.254/24`  
         `mac address 42:00:aa:00:00:0b`  
        `!`  
        `interface eth0`  
         `ip address 172.16.2.254/24`  
         `mac address 42:00:aa:00:00:0a`  
        `!`  
        `interface lo0`  
         `type lo`  
         `ip address 127.0.0.1/8`  
         `ipv6 address ::1/128`  
        `!`  
    `}`  
    `canvas c0`  
    `iconcoords {624 360}`  
    `labelcoords {624 396}`  
    `interface-peer {eth0 n1}`  
    `interface-peer {eth1 n2}`  
    `interface-peer {eth2 n3}`  
    `custom-configs {`  
        `custom-config-id default {`  
            `custom-command /bin/sh`  
            `config {`  
                `# --- IP ---`  
                `ip addr add 127.0.0.1/8 dev lo0`  
                `ip addr add 172.16.2.254/24 dev eth0`  
                `ip addr add 172.16.3.254/24 dev eth1`  
                `ip addr add 45.45.45.254/21 dev eth2`  
                `ip -6 addr add ::1/128 dev lo0`

                `# --- Forwarding ---`  
                `sysctl -w net.ipv4.ip_forward=1`

                `# --- ROUTES vers autres réseaux publics ---`  
                `ip route add 37.37.36.0/22 via 172.16.2.253 dev eth0`  
                `ip route add 62.62.48.0/19 via 172.16.2.253 dev eth0`

                `# --- NAT ---`  
                `# S1/S2 -> Internet`  
                `iptables -t nat -A POSTROUTING \`  
                    `-s 172.16.1.0/24 -o eth2 \`  
                    `-j SNAT --to-source 45.45.45.254`  
                `iptables -t nat -A POSTROUTING \`  
                    `-s 172.16.2.0/24 -o eth2 \`  
                    `-j SNAT --to-source 45.45.45.254`

                `# S2 <-> S3`  
                `iptables -t nat -A POSTROUTING \`  
                    `-s 172.16.2.0/24 -d 172.16.3.0/24 \`  
                    `-j SNAT --to-source 172.16.3.254`  
                `iptables -t nat -A POSTROUTING \`  
                    `-s 172.16.3.0/24 -d 172.16.2.0/24 \`  
                    `-j SNAT --to-source 172.16.2.254`

                `# --- FILTRAGE ---`  
                `# 1. Connexions établies`  
                `iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT`

                `# 2. S2 <-> S3 : AUTORISÉ`  
                `iptables -A FORWARD -s 172.16.2.0/24 -d 172.16.3.0/24 -j ACCEPT`  
                `iptables -A FORWARD -s 172.16.3.0/24 -d 172.16.2.0/24 -j ACCEPT`

                `# 3. S3 -> S1 : BLOQUÉ`  
                `iptables -A FORWARD -s 172.16.3.0/24 -d 172.16.1.0/24 -j DROP`

                `# 4. S1/S2 -> Internet : AUTORISÉ`  
                `iptables -A FORWARD -s 172.16.1.0/24 -d 45.45.40.0/21 -j ACCEPT`  
                `iptables -A FORWARD -s 172.16.2.0/24 -d 45.45.40.0/21 -j ACCEPT`  
                `iptables -A FORWARD -s 172.16.1.0/24 -d 37.37.36.0/22 -j ACCEPT`  
                `iptables -A FORWARD -s 172.16.2.0/24 -d 37.37.36.0/22 -j ACCEPT`

                `# 5. S3 -> Internet : BLOQUÉ`  
                `iptables -A FORWARD -s 172.16.3.0/24 -d 45.45.40.0/21 -j DROP`  
                `iptables -A FORWARD -s 172.16.3.0/24 -d 37.37.36.0/22 -j DROP`

                `# 6. Politique par défaut`  
                `iptables -P FORWARD DROP`

                `# Services`  
                `rpcbind`  
                `inetd`  
            `}`  
        `}`  
    `}`  
    `custom-enabled true`  
    `custom-selected default`  
`}`

**I.4 Configuration des PCs (routes par défaut)**

Exemple pour **pc2 (n7)** :

`node n7 {`  
    `type pc`  
    `network-config {`  
        `hostname pc2`  
        `!`  
        `interface eth0`  
         `ip address 172.16.2.2/24`  
         `mac address 42:00:aa:00:00:05`  
        `!`  
        `interface lo0`  
         `type lo`  
         `ip address 127.0.0.1/8`  
         `ipv6 address ::1/128`  
        `!`  
        `# Route par défaut vers GW2`  
        `ip route 0.0.0.0/0 172.16.2.254`  
        `!`  
    `}`  
    `# ...`  
`}`

(Le même principe s’applique aux autres PCs si nécessaire.)

**I.5 Tests de connectivité**

À lancer après démarrage de la topo :

`# S1 -> public`  
`sudo himage pc1 ping -c 1 37.37.37.1`

`# S2 -> public`  
`sudo himage pc2 ping -c 1 37.37.37.1`

`# public -> public`  
`sudo himage pc ping -c 1 45.45.45.2`

`# même réseau public`  
`sudo himage host1 ping -c 1 37.37.37.1`

`# public -> privé (doit échouer)`  
`sudo himage pc ping -c 1 172.16.2.2`  
`# -> Destination Net Unreachable`

**I.6 Analyse NAT avec tcpdump**

Ping depuis **pc2** vers l’hôte public :

`# Sur pc (public)`  
`sudo himage pc tcpdump -i eth0 -n icmp`

`# Sur pc2 (S2)`  
`sudo himage pc2 tcpdump -i eth0 -n icmp`

`# Ping`  
`sudo himage pc2 ping -c 2 37.37.37.1`

* Sur **pc2** : tu vois `172.16.2.2 -> 37.37.37.1`

* Sur **pc** : tu vois `45.45.45.254 -> 37.37.37.1`

 Le routeur GW2 fait du **SNAT** : il remplace la source privée `172.16.2.2` par son IP publique `45.45.45.254`.

**PARTIE II – Service FTP avec DNAT**

## **II.1 Création de with-ftp-service.imn**

`cp with-routers.imn with-ftp-service.imn`

**II.2 Ajout du serveur FTP (n14) sur S2**  
`node n14 {`  
    `type host`  
    `network-config {`  
        `hostname FTP`  
        `!`  
        `interface eth0`  
         `ip address 172.16.2.10/24`  
         `mac address 42:00:aa:00:00:0f`  
        `!`  
        `interface lo0`  
         `type lo`  
         `ip address 127.0.0.1/8`  
         `ipv6 address ::1/128`  
        `!`  
    `}`  
    `canvas c0`  
    `iconcoords {480 120}`  
    `labelcoords {480 156}`  
    `interface-peer {eth0 n1}  # switch2`  
    `custom-configs {`  
        `custom-config-id default {`  
            `custom-command /bin/sh`  
            `config {`  
                `# Démarrer le serveur FTP`  
                `/usr/sbin/in.ftpd &`  
                `# (ou autre commande selon l’image)`  
            `}`  
        `}`  
    `}`  
    `custom-enabled true`  
    `custom-selected default`  
`}`

`link l14 {`  
    `nodes {n1 n14}`  
    `bandwidth 0`  
`}`

**II.3 DNAT sur GW2 pour exposer FTP**

**Dans la config de GW2 (n11)**, ajouter :

`# --- DNAT FTP depuis Internet vers le serveur interne ---`

`# Port 21 (contrôle)`  
`iptables -t nat -A PREROUTING \`  
    `-d 45.45.45.254 -p tcp --dport 21 \`  
    `-j DNAT --to-destination 172.16.2.10:21`

`# Port 20 (données, mode actif)`  
`iptables -t nat -A PREROUTING \`  
    `-d 45.45.45.254 -p tcp --dport 20 \`  
    `-j DNAT --to-destination 172.16.2.10:20`

`# Autoriser le forwarding vers le serveur FTP`  
`iptables -A FORWARD -d 172.16.2.10 -p tcp --dport 21 -j ACCEPT`  
`iptables -A FORWARD -d 172.16.2.10 -p tcp --dport 20 -j ACCEPT`

`# Autoriser FTP depuis S1 et S2 (accès direct à 172.16.2.10)`  
`iptables -A FORWARD -s 172.16.1.0/24 -d 172.16.2.10 -p tcp --dport 21 -j ACCEPT`  
`iptables -A FORWARD -s 172.16.2.0/24 -d 172.16.2.10 -p tcp --dport 21 -j ACCEPT`

Rappel :

* **PREROUTING** : avant le routage, on peut faire du **DNAT** (changer la destination).

* Ici on publie le service FTP interne `172.16.2.10` sur l’IP publique **45.45.45.254**.

**II.4 Vérification du serveur FTP**  
`# Le service écoute bien sur 21/tcp`  
`sudo himage FTP ss -na --tcp`  
`# Doit montrer : LISTEN sur *:21`

`# Port FTP dans /etc/services`  
`sudo himage FTP cat /etc/services | grep ftp`  
`# -> ftp 21/tcp`

**II.5 Tests d’accès FTP**  
`# 1. Depuis pc (public) vers IP publique : OK`  
`sudo himage pc ftp 45.45.45.254`

`# 2. Depuis pc (public) vers IP privée : NON routable`  
`sudo himage pc ftp 172.16.2.10`  
`# -> Network is unreachable`

`# 3. Depuis pc1 (S1) vers IP privée : OK`  
`sudo himage pc1 ftp 172.16.2.10`

`# 4. Depuis pc2 (S2) vers IP privée : OK`  
`sudo himage pc2 ftp 172.16.2.10`

`# 5. Depuis host1 (réseau public 45.45.45.0/21) : OK`  
`sudo himage host1 ftp 45.45.45.254`

**II.6 Analyse FTP avec tcpdump**  
`# Sur pc (public)`  
`sudo himage pc tcpdump -i eth0 -n tcp port 21`

`# Sur FTP (serveur interne)`  
`sudo himage FTP tcpdump -i eth0 -n tcp port 21`

`# Connexion FTP`  
`sudo himage pc ftp 45.45.45.254`

* Côté **pc** : connexion `37.37.37.1 -> 45.45.45.254:21`

* Côté **FTP** : connexion `172.16.2.254 -> 172.16.2.10:21`

 GW2 fait :

* **DNAT** : `45.45.45.254:21` → `172.16.2.10:21` (destination modifiée)

* **SNAT** : `37.37.37.1` → `172.16.2.254` (source modifiée pour que les réponses repartent bien via GW2)

**Récapitulatif des règles essentielles**

### **Sur GW1**

`# NAT S1 -> S2`  
`iptables -t nat -A POSTROUTING \`  
    `-s 172.16.1.0/24 -d 172.16.2.0/24 \`  
    `-j SNAT --to-source 172.16.2.253`

`# Filtrage`  
`iptables -A FORWARD -s 172.16.1.0/24 -d 172.16.2.0/24 -j ACCEPT  # S1 -> S2`  
`iptables -A FORWARD -s 172.16.2.0/24 -d 172.16.1.0/24 -j ACCEPT  # S2 -> S1`  
`iptables -A FORWARD -s 172.16.1.0/24 -d 172.16.3.0/24 -j DROP    # S1 ->/ S3`

### **Sur GW2**

`# NAT S1/S2 -> Internet`  
`iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth2 \`  
    `-j SNAT --to-source 45.45.45.254`  
`iptables -t nat -A POSTROUTING -s 172.16.2.0/24 -o eth2 \`  
    `-j SNAT --to-source 45.45.45.254`

`# DNAT FTP`  
`iptables -t nat -A PREROUTING -d 45.45.45.254 -p tcp --dport 21 \`  
    `-j DNAT --to-destination 172.16.2.10:21`

`# Filtrage (extraits)`  
`iptables -A FORWARD -s 172.16.2.0/24 -d 172.16.3.0/24 -j ACCEPT  # S2 -> S3`  
`iptables -A FORWARD -s 172.16.3.0/24 -d 172.16.1.0/24 -j DROP    # S3 ->/ S1`  
`iptables -A FORWARD -s 172.16.1.0/24 -d 45.45.40.0/21 -j ACCEPT  # S1 -> Internet`  
`iptables -A FORWARD -s 172.16.3.0/24 -d 45.45.40.0/21 -j DROP    # S3 ->/ Internet`  
