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 !
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 | |
---|---|
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).
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 | |
---|---|
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. |
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.
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.
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
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
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
Pour afficher la configuration iptables actuelle, tapez :
pour la table filter :
#
iptables -v -L
pour la table nat :
#
iptables -v -L -t nat