Chapitre 38. Pare-feu et partage de connexion Internet

1. Le partage de connexion Internet
2. Etablir des règles de filtrage et de partage de connexion
[Important] Important

Cette partie requiert des connaissances de base en réseau. Vous pouvez consulter une formation VIA à ce sujet.

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

1. Le partage de connexion Internet

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

[Important] Important

Si vous êtes connecté derrière une *box fournie par votre FAI, celle-ci joue déjà ce rôle de routeur NAT. Plutôt que de configurer votre ordinateur, vous devez alors utiliser l'interface d'administration de votre modem routeur pour y définir la configuration réseau souhaitée.

  • 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 38.1. Schéma d'un NAT avec 2 machines

Schéma d'un NAT avec 2 machines

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

Schéma d'un NAT avec plusieurs machines

Avec cette configuration, seul le routeur 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 transfert de port. 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, il faut transférer les requêtes TCP arrivant sur le port 80 du routeur NAT vers la machine dont l'adresse est 192.168.0.3, et la réponse à la requête sera alors correctement transférée vers Internet au client qui a initié la requête.

[Note] 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 routeur NAT, comme expliqué dans le wiki, et d'indiquer dans la configuration réseau des ordinateurs du réseau local l'adresse 192.168.0.1 comme premier serveur DNS.

2. Etablir des règles de filtrage et de partage de connexion

2.1. 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 pare-feux. Si vous maîtrisez l'anglais, vous pouvez vous attaquer au tutoriel iptables.

2.2. Configurer iptables

Le paquet iptables, qui contient le programme du même nom qui permet de configurer les fonctions de filtrage IP 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/iptables.up.rules qui définit les règles de filtrage IPv4 :

    # cp ~/fichiers-config/iptables.up.rules /etc/
    

    ou :

    % wget http://formation-debian.via.ecp.fr/fichiers-config/iptables.up.rules
    # cp iptables.up.rules /etc/
    
  • le script /etc/network/ip6tables.up.rules qui définit les règles de filtrage IPv6 :

    # cp ~/fichiers-config/ip6tables.up.rules /etc/
    

    ou :

    % wget http://formation-debian.via.ecp.fr/fichiers-config/ip6tables.up.rules
    # cp ip6tables.up.rules /etc/
    

Il faut maintenant demander de charger ces définitions à l'initialisation du réseau de votre système. Éditez pour cela le fichier /etc/network/interfaces, et ajoutez ces deux lignes à la définition de l'interface connectée à Internet :

iface eth0 …
    …
    pre-up iptables-restore < /etc/iptables.up.rules
    pre-up ip6tables-restore < /etc/ip6tables.up.rules

Vous pouvez également démarrer le filtrage en chargeant ces définitions à la main, en tant que root, avec la commande ip[6]tables-restore < /etc/ip[6]tables.up.rules.

2.3. Personnaliser les règles de filtrage

Personnalisez mes définitions d'exemple /etc/ip[6]tables.up.rules qui contiennent les règles de filtrage :

# /etc/iptables.up.rules
# Script qui démarre les règles de filtrage IPv4
# Formation Debian GNU/Linux par Alexis de Lattre
# http://formation-debian.via.ecp.fr/

# iptables-restore(8) remet implicitement à zéro toutes les règles

# Les instructions qui suivent concernent la table « filter »,
# c'est-à-dire… le filtrage.
*filter

#########################
# Politiques par défaut #
#########################
# Les politiques par défaut déterminent le devenir d'un paquet auquel
# aucune règle spécifique ne s'applique.

# Les connexions entrantes sont bloquées par défaut
-P INPUT DROP
# Les connexions destinées à être routées sont acceptées par défaut
-P FORWARD ACCEPT
# Les connexions sortantes sont acceptées par défaut
-P OUTPUT ACCEPT

######################
# Règles de filtrage #
######################
# Nous précisons ici des règles spécifiques pour les paquets vérifiant
# certaines conditions.

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

# Accepter le protocole ICMP (notamment le ping)
-A INPUT -p icmp -j ACCEPT

# Accepter le protocole IGMP (pour le multicast)
-A INPUT -p igmp -j ACCEPT

# Accepter les packets entrants relatifs à des connexions déjà
# établies : cela va plus vite que de devoir réexaminer toutes
# les règles pour chaque paquet.
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

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

# Décommentez la ligne suivante pour que le serveur de courrier éventuel soit
# joignable de l'extérieur. Laissez bien smtps et submission si vous avez
# activé les services SMTPS et soumission de messages… L'option --dports
# permet de traiter plusieurs ports en une fois.
#-A INPUT -p tcp --dports smtp,smtps,submission -j ACCEPT

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

# Décommentez la ligne suivante pour que le serveur Web éventuel
# soit joignable de l'extérieur.
#-A INPUT -p tcp --dport http -j ACCEPT
# Si vous avez activé le HTTPS…
#-A INPUT -p tcp --dport https -j ACCEPT

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

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

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

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

# Décommentez la ligne suivante pour pouvoir recevoir des flux VideoLAN.
#-A INPUT -p udp --dport 1234 -j ACCEPT

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

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

# Décommentez la ligne suivante pour pouvoir partager de la musique par
# DAAP.
#-A INPUT -p tcp --dport daap -j ACCEPT

# Décommentez la ligne suivante pour que votre ordinateur
# annonce son nom et ses services par mDNS sur le réseau local (cela
# permet de le contacter sous « son nom d'hôte ».local).
#-A INPUT -p udp -d 224.0.0.251 --dport mdns -j ACCEPT

# La règle par défaut pour la chaine INPUT devient REJECT (contrairement
# à DROP qui ignore les paquets, avec REJECT, l'expéditeur est averti
# du refus). Il n'est pas possible de mettre REJECT comme politique par
# défaut. Au passage, on note les paquets qui vont être jetés, ça peut
# toujours servir.
-A INPUT -j LOG --log-prefix "paquet IPv4 inattendu "
-A INPUT -j REJECT

COMMIT

# Les instructions qui suivent concernent la table « nat ».
*nat

########################
# Partage de connexion #
########################

# Décommentez la ligne suivante pour que le système fasse office de
# routeur NAT et remplacez « eth0 » par le nom de l'interface
# connectée à Internet.
#-A POSTROUTING -o eth0 -j MASQUERADE


########################
# Redirections de port #
########################

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

COMMIT

####################
# Problème de MTU… #
####################

# Les instructions qui suivent concernent la table « mangle », c'est
# à dire l'altération des paquets
*mangle

# Si la connexion que vous partagez est une connexion ADSL directement gérée
# par votre ordinateur, 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
# remplacez « eth0 » par le nom de l'interface connectée à Internet.
#-A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS -o eth0 --clamp-mss-to-pmtu

COMMIT

2.4. 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 routeur NAT. Par exemple, pour un routeur 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 transfert IP du noyau, en modifiant ainsi le fichier /etc/sysctl.conf :

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

Ces paramètres seront appliqués au prochain démarrage. Pour les appliquer dès maintenant :

# sysctl -p

2.5. Démarrer le filtrage ou le partage de connexion

Une fois que vous avez bien configuré le fichier /etc/network/interfaces et personnalisé le script /etc/iptables.up.rules selon vos besoins, demandez au système de recharger ces règles :

    # iptables-restore < /etc/iptables.up.rules

2.6. 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