Annexe N. Firewalling et partage de connexion Internet

Important

Cette partie requiert des connaissances de base en réseau. Lien vers une formation VIA à ce sujet.

Le partage de connexion Internet se fait sous Linux grâce aux fonctions de firewalling du noyau... d'où le regroupement des explications sur le firewalling et sur le partage de connexion Internet dans ce chapitre !

Le partage de connexion Internet

L'idée est d'ajouter à votre ordinateur sous Linux la fonction de serveur NAT, qui va vous permettre de partager votre connexion avec d'autres machines. Votre ordinateur sous Linux aura deux interfaces réseau :

  • une interface connectée à Internet via une connexion modem par exemple : cette interface aura une adresse IP publique (interface eth0 sur les schémas) ;

  • une interface connectée à votre réseau local doté d'un adressage privé : cette interface servira de passerelle pour les ordinateurs du réseau local (interface eth1 sur les schémas).

Figure N.1. Schéma d'un NAT avec 2 machines

Schéma d'un NAT avec 2 machines

Figure N.2. Schéma d'un NAT avec plusieurs machines

Schéma d'un NAT avec plusieurs machines

Note

FAI = Fournisseur d'Accès Internet.

Avec cette configuration, seul le serveur NAT est directement joignable depuis Internet ; les ordinateurs du réseau local ne sont a priori pas joignables directement depuis Internet... sauf si on fait du port forwarding. Par exemple, pour que le serveur Web qui tourne sur le port 80 de la machine dont l'adresse IP est 192.168.0.3 soit joignable de l'extérieur via le serveur NAT, il faut forwarder les requêtes TCP arrivant sur le port 80 du serveur NAT vers la machine dont l'IP est 192.168.0.3... et la réponse à la requête sera alors correctement forwardée vers Internet au client qui a initié la requête.

Note

Pour améliorer les temps de réponses des requêtes DNS, il pourra être intéressant de mettre en place un serveur DNS de type indépendant sur le serveur NAT, comme expliqué au chapitre ???, et d'indiquer dans la configuration réseau des ordinateurs du réseau local l'adresse 192.168.0.1 comme premier serveur DNS.

Etablir des règles de firewalling et/ou de partage de connexion

Configuration du noyau

Le noyau doit avoir les fonctions de firewalling activées. Si vous ne les avez pas compilées dans votre noyau actuel, vous devrez recompiler le noyau en vous référant aux chapitres ??? et ???.

Apprendre la syntaxe iptables

La syntaxe d'iptables est très complète... et je n'ai malheureusement pas l'intention de l'expliquer dans cette annexe. Je l'ai personnellement apprise dans le Hors Série Linux Magazine n°12 dédié aux firewalls. Si vous maîtrisez l'anglais, vous pouvez vous attaquer au Tutoriel iptables.

Configurer iptables

Le paquet iptables, qui contient le programme du même nom qui permet de configurer les fonctions de firewalling des noyaux Linux 2.4 et 2.6, est normalement installé par défaut.

Nous allons mettre en place deux scripts à l'aide de mes fichiers d'exemple :

  • le script /etc/network/if-pre-up.d/iptables-start qui démarre les règles de filtrage :

    # cp ~/fichiers-config/iptables-start /etc/network/if-pre-up.d/
    

    ou :

    % wget http://formation-debian.via.ecp.fr/fichiers-config/iptables-start
    # cp iptables-start /etc/network/if-pre-up.d/
    
  • le script /etc/network/if-post-down.d/iptables-stop qui arrête le filtrage :

    # cp ~/fichiers-config/iptables-stop /etc/network/if-post-down.d/
    

    ou :

    % wget http://formation-debian.via.ecp.fr/fichiers-config/iptables-stop
    # cp iptables-stop /etc/network/if-post-down.d/
    

N'oubliez pas de rendre ces scripts exécutables :

# chmod 755 /etc/network/if-pre-up.d/iptables-start
# chmod 755 /etc/network/if-post-down.d/iptables-stop

Avec le configuration que nous venons de mettre en place, le script iptables-start s'exécutera automatiquement juste avant de configurer les interfaces réseau, et le script iptables-stop s'exécutera automatiquement juste après la déconfiguration des interfaces réseau.

Vous pouvez également démarrer et d'arrêter le filtrage iptables en exécutant ces scripts "à la main" en tant que root.

Personnaliser les règles de filtrage

Personnalisez mon script d'exemple /etc/network/if-pre-up.d/iptables-start qui contient les règles de filtrage :

#!/bin/sh
# /etc/network/if-pre-up.d/iptables-start
# Script qui démarre les règles de filtrage "iptables"
# Formation Debian GNU/Linux par Alexis de Lattre
# http://formation-debian.via.ecp.fr/

# REMISE à ZERO des règles de filtrage
iptables -F
iptables -t nat -F


# DEBUT des "politiques par défaut"

# Je veux que les connexions entrantes soient bloquées par défaut
iptables -P INPUT DROP

# Je veux que les connexions destinées à être forwardées
# soient acceptées par défaut
iptables -P FORWARD ACCEPT

# Je veux que les connexions sortantes soient acceptées par défaut
iptables -P OUTPUT ACCEPT

# FIN des "politiques par défaut"


# DEBUT des règles de filtrage

# Pas de filtrage sur l'interface de "loopback"
iptables -A INPUT -i lo -j ACCEPT

# J'accepte le protocole ICMP (i.e. le "ping")
iptables -A INPUT -p icmp -j ACCEPT

# J'accepte le protocole IGMP (pour le multicast)
iptables -A INPUT -p igmp -j ACCEPT

# J'accepte les packets entrants relatifs à des connexions déjà établies
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Décommentez les deux lignes suivantes pour que le serveur FTP éventuel
# soit joignable de l'extérieur
#iptables -A INPUT -p tcp --dport 20 -j ACCEPT
#iptables -A INPUT -p tcp --dport 21 -j ACCEPT

# Décommentez la ligne suivante pour que le serveur SSH éventuel
# soit joignable de l'extérieur
#iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Décommentez la ligne suivante pour que le serveur de mail éventuel
# soit joignable de l'extérieur
#iptables -A INPUT -p tcp --dport 25 -j ACCEPT

# Décommentez les deux lignes suivantes pour que le serveur de DNS éventuel
# soit joignable de l'extérieur
#iptables -A INPUT -p tcp --dport 53 -j ACCEPT
#iptables -A INPUT -p udp --dport 53 -j ACCEPT

# Décommentez la ligne suivante pour que le serveur Web éventuel
# soit joignable de l'extérieur
#iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# Décommentez les deux lignes suivantes pour que le serveur CUPS éventuel
# soit joignable de l'extérieur
#iptables -A INPUT -p tcp --dport 631 -j ACCEPT
#iptables -A INPUT -p udp --dport 631 -j ACCEPT

# Décommentez les deux lignes suivantes pour que le serveur Samba éventuel
# soit joignable de l'extérieur
#iptables -A INPUT -p tcp --dport 139 -j ACCEPT
#iptables -A INPUT -p udp --dport 139 -j ACCEPT

# Décommentez la ligne suivante pour que des clients puissent se connecter
# à l'ordinateur par XDMCP)
#iptables -A INPUT -p udp --dport 177 -j ACCEPT

# Décommentez la ligne suivante pour que l'odinateur puisse se connecter
# par XDMCP à une machine distante)
#iptables -A INPUT -p tcp --dport 6001 -j ACCEPT

# Décommentez la ligne suivante pour que le serveur CVS éventuel
# soit joignable de l'extérieur via le mécanisme de "pserver"
# (si les utilisateurs accèdent au serveur CVS exclusivement via SSH,
# seule la ligne concernant le serveur SSH doit être décommentée)
#iptables -A INPUT -p tcp --dport 2401 -j ACCEPT

# Décommentez la ligne suivante pour pouvoir reçevoir des flux VideoLAN
# (ce sont des flux UDP entrants sur le port 1234)
#iptables -A INPUT -p udp --dport 1234 -j ACCEPT

# Décommentez la ligne suivante pour pouvoir reçevoir des annonces SAP
# (ce sont des annonces de session multicast)
#iptables -A INPUT -p udp -d 224.2.127.254 --dport 9875 -j ACCEPT

# Décommentez les 3 lignes suivantes pour pouvoir utiliser GnomeMeeting
#iptables -A INPUT -p tcp --dport 30000:33000 -j ACCEPT
#iptables -A INPUT -p tcp --dport 1720 -j ACCEPT
#iptables -A INPUT -p udp --dport 5000:5006 -j ACCEPT

# La règle par défaut pour la chaine INPUT devient "REJECT"
# (il n'est pas possible de mettre REJECT comme politique par défaut)
iptables -A INPUT -j REJECT

# FIN des règles de filtrage


# DEBUT des règles pour le partage de connexion (i.e. le NAT)

# Décommentez la ligne suivante pour que le système fasse office de
# "serveur NAT" et remplaçez "eth0" par le nom de l'interface connectée
# à Internet
#iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Si la connexion que vous partagez est une connexion ADSL, vous
# serez probablement confronté au fameux problème du MTU. En résumé,
# le problème vient du fait que le MTU de la liaison entre votre
# fournisseur d'accès et le serveur NAT est un petit peu inférieur au
# MTU de la liaison Ethernet qui relie le serveur NAT aux machines qui
# sont derrière le NAT. Pour résoudre ce problème, décommentez la ligne
# suivante et remplaçez "eth0" par le nom de l'interface connectée à
# Internet.
#iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS -o eth0 --clamp-mss-to-pmtu

# FIN des règles pour le partage de connexion (i.e. le NAT)


# DEBUT des règles de "port forwarding"

# Décommentez la ligne suivante pour que les requêtes TCP reçues sur
# le port 80 de l'interface eth0 soient forwardées à la machine dont
# l'IP est 192.168.0.3 sur son port 80 (la réponse à la requête sera
# forwardée au client)
#iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.3:80

# FIN des règles de "port forwarding"

Configurer le réseau pour le partage de connexion

Si vous désirez mettre en place un partage de connexion Internet, il faut commencer par bien configurer les interfaces réseau du serveur NAT. Par exemple, pour un serveur NAT dont l'interface réseau connectée au réseau extérieur est eth0 avec configuration par DHCP et dont l'interface connectée au réseau local est eth1, le fichier /etc/network/interfaces doit ressembler à l'exemple suivant :

# /etc/network/interfaces
# Fichier de configuration d'exemple des interfaces réseau
# pour faire un serveur NAT
# Formation Debian GNU/Linux par Alexis de Lattre
# http://formation-debian.via.ecp.fr/

# Plus d'informations dans "man interfaces"


# L'interface "loopback"
auto lo
iface lo inet loopback

# L'interface "eth0" connectée à Internet (configuration par DHCP)
auto eth0
iface eth0 inet dhcp

# L'interface "eth1" connectée au réseau local (IP privée fixe)
auto eth1
iface eth1 inet static
    address 192.168.0.1
    netmask 255.255.255.0
    broadcast 192.168.0.255

Enfin, il faut activer la fonction de forwarding IP du noyau, en modifiant ainsi le fichier /etc/sysctl.conf :

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.conf.default.forwarding=1
# Uncomment the next line to enable packet forwarding for IPv6
net.ipv6.conf.default.forwarding=1

Démarrer le firewalling et/ou le partage de connexion

Une fois que vous avez bien configuré le fichier /etc/network/interfaces et personnalisé le script /etc/network/if-pre-up.d/iptables-start selon vos besoins, demandez au système de reconfigurer le réseau :

# /etc/init.d/networking restart

Afficher la configuration iptables

Pour afficher la configuration iptables actuelle, tapez :

  • pour la table filter :

    # iptables -v -L
    
  • pour la table nat :

    # iptables -v -L -t nat