Source de cours/partage_connexion.php
<?
require ("../page.inc");
require ("lessons.inc");
$currentPage = new LessonPage("partage_connexion");
$currentPage->setContent('');
$currentPage->addChapter('general', 'Généralités', '
<p>
Partager une connexion permet de relier plusieurs machines à Internet (ou d\'une manière plus générale à un autre réseau) au travers d\'une seule machine (la <strong>passerelle</strong>). Toutes seront comme si elles avaient l\'adresse <acronym xml:lang="en" lang="en" title="Internet Protocol">IP</acronym> de celle physiquement connectée à Internet. Ceci est un cas particulier de <acronym xml:lang="en" lang="en" title="Network Address Translation">NAT</acronym>, ou <strong>translation d\'adresses</strong>, appelé dans Linux le <strong>Masquerading</strong>.
</p><p>
En quelques mots, lorsqu\'une machine désirant envoyer un paquet sur Internet le transmettra à la passerelle, cette dernière remplacera l\'adresse de l\'émetteur réel par la sienne. Ensuite, elle envoie le paquet au destinataire en utilisant un <a href="reseau.php#port">port</a> de son choix. Lorsque ce destinataire (un serveur web par exemple) renverra une réponse sur le port choisi, la passerelle saura à qui la transmettre sur le réseau interne. Elle fera donc alors une modification de l\'adresse de destination. Ce mécanisme est invisible pour l\'initiateur interne, du moment que l\'on a spécifié la passerelle à utiliser.
</p>
');
$currentPage->addChapter('gateway', 'Configurer la passerelle', '
<p>
Il faut tout d\'abord configurer la passerelle. Il s\'agit donc de la machine qui est connectée à Internet et à travers laquelle les autres passent. Cela suppose que le réseau interne est déjà configuré. L\'interface reliée à l\'extérieur doit être identifiée. Dans le cas d\'une connexion par modem, ce sera généralement ppp0. La commande suivante permet de la connaître :
</p>
<code class="terminal">
> netstat -rn | grep UG | gawk \'{print $8}\'
</code>
<p>
Elle affichera le nom de l\'interface. Le programme <strong>netstat</strong> permet de connaître diverses informations réseau (comme les connexions actives). Avec l\'option -r, ce sont les tables de routage qui sont affichées. L\'option -n permet d\'éviter la résolution de noms et donc d\'obtenir plus rapidement les informations. On recherche dans ce résultat l\'indicateur <acronym xml:lang="en" lang="en" title="Up">U</acronym> indiquant que la route est active, et le <acronym xml:lang="en" lang="en" title="Gateway">G</acronym> qui désigne une passerelle. S\'il y en a plusieurs, à vous de déterminer celle à utiliser.
</p><p>
Si votre adresse IP peut potentiellement changer à chaque connexion, comme par exemple lorsque l\'on se connecte avec un modem par l\'intermédiaire d\'un fournisseur d\'accès, la première commande à taper est la suivante :
</p>
<code class="terminal">
> iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
</code>
<p>
Si votre adresse IP est statique, il vaut mieux utiliser celle-là :
</p>
<code class="terminal">
> iptables -t nat -A POSTROUTING -o ppp0 -j SNAT --to-source xxx.xxx.xxx.xxx
</code>
<p>
En remplaçant xxx.xxx.xxx.xxx par l\'adresse statique. Avant de voir les différences, décrivons ce qui est commun dans les deux cas.
</p><p>
On utilise tout d\'abord la table nat de <a href="iptables.php#presentation">Netfilter</a> qui est utilisée pour les translations d\'adresses. On y récupère les paquets destinés à sortir (chaîne <strong>POSTROUTING</strong>) en passant par l\'interface de notre choix (ici ppp0). Ensuite ce qui change est la cible vers laquelle envoyer les paquets pour traitement.
</p><p>
Dans le premier cas, il s\'agit de <strong>MASQUERADE</strong> qui va réaliser le remplacement de l\'adresse source comme expliqué précédemment. Pour le deuxième, c\'est la même chose, si ce n\'est que l\'on spécifie cette adresse avec l\'option <strong>--to-source</strong>. La cible <acronym xml:lang="en" lang="en" title="Source Network Address Translation">SNAT</acronym> signifie Source NAT ce qui correspond bien à un changement de l\'adresse source.
</p><p>
La différence est dans le cas où la connexion vers l\'extérieur serait interrompue. La cible MASQUERADE ne permettra pas de récupérer les communications qui étaient en cours. En revanche, avec SNAT, on saura que l\'adresse d\'origine n\'a pas changée. Le noyau tentera alors de rétablir les connexions qui existaient auparavant.
</p><p>
Après qu\'une de ces deux commandes ait été utilisée, il faut activer la redirection. Cela se fait à l\'aide d\'un élément spécial du pseudo-sytème de fichiers /proc :
</p>
<code class="terminal">
> echo 1 > /proc/sys/net/ipv4/ip_forward
</code>
<p>
La suite de ces deux commandes peut être ajoutée dans un des fichiers lancés au démarrage car cela sera perdu après un arrêt de la machine. Certaines distributions utilisent par exemple /etc/rc.d/boot.local pour cela.
</p>
');
$currentPage->addChapter('route', 'Configurer les machines internes', '
<p>
Une fois cela réalisé, il faut configurer les machines sur le réseau interne pour leur dire d\'utiliser la passerelle préalablement configurée. On utilise l\'outil <strong>route</strong> qui permet de définir les tables de routages. La commande est la suivante :
</p>
<code class="terminal">
> route add default gw 192.168.1.1
</code>
<p>
192.168.1.1 est un exemple pris au hasard (dans les classes d\'adresses utilisées sur les réseaux internes) Cette valeur doit être remplacée par l\'adresse IP par laquelle les ordinateurs voient la passerelle depuis le réseau interne. Là encore cette commande doit être exécutée à chaque démarrage.
</p><p>
Cela suppose que le réseau interne est bien configuré. Il faut que la passerelle soit accessible depuis ces machines.
</p><p>
Pour vérifier la table de routage, il suffit de lancer le programme route sans aucun paramètre. L\'affichage devrait ressembler à ceci (seules les colonnes utiles sont indiquées ici) :
</p>
<pre class="terminal">
> route
Destination Passerelle Genmask Indic Iface
193.168.0.2 * 255.255.255.255 UH eth0
192.168.0.0 * 255.255.255.0 U eth0
default 192.168.0.1 0.0.0.0 UG eth0
</pre>
<p>
On suppose ici que l\'adresse de la machine sur le réseau interne est 192.168.0.2 et possède une seule carte réseau Ethernet (eth0). La première ligne indique cela. L\'indicateur <acronym xml:lang="en" lang="en" title="Host">H</acronym> de la quatrième colonne permet de savoir qu\'il s\'agit d\'une machine unique.
</p><p>
La ligne suivante est la route permettant d\'atteindre la passerelle. Sur le réseau interne, l\'accès se fait directement (pas de passerelle) par l\'interface eth0.
</p><p>
Enfin la dernière ligne est la plus intéressante dans ce cas. Elle indique que pour toutes les autres adresses de destination, la route par défaut passe par la passerelle 192.168.0.1.
</p>
');
$currentPage->addChapter('server', 'Permettre un serveur interne', '
<p>
Tout cela permet d\'initier des connexions uniquement depuis le réseau interne vers l\'extérieur. Or, il se peut que l\'on souhaite avoir un service proposé par une machine à l\'intérieur. Par exemple admettons que la machine d\'adresse 192.168.1.3 héberge un site web (port 80 par défaut) qui doivent être accessible. Toutes les demandes d\'accès à ce site se feront sur la passerelle. C\'est à elle ensuite de les transférer sur le serveur interne concerné. On utilise alors une translation d\'adresse de destination, qui est l\'opposé de ce qui a été exposé ci-dessus.
</p><p>
Voici dans ce cas-là la commande iptables à utiliser :
</p>
<code class="terminal">
> iptables -t nat -p tcp -A PREROUTING -j DNAT --destination-port 80 --to-destination 192.168.1.3:80
</code>
<p>
On utilise à nouveau la table nat car il s\'agit toujours d\'une translation d\'adresse. Mais cette translation est ici faite dès que le paquet pénètre la couche réseau (<strong>PREROUTING</strong>). Cela bien évidemment pour mettre la bonne adresse destination dès que possible afin que le routage s\'effectue correctement.
</p><p>
La cible est <acronym xml:lang="en" lang="en" title="Destination Network Address Translation">DNAT</acronym> (Destination NAT) qui est le pendant du SNAT. C\'est elle qui permet de modifier l\'adresse de destination des informations.
</p><p>
On trouve enfin les options nécessaires qui devront bien sûr être adaptées selon les besoins. Tout d\'abord <strong>--destination-port</strong> qui est le port de connexion depuis l\'extérieur. Il peut être totalement différent de celui sur la machine faisant office de serveur sur le réseau interne. L\'adresse de ce serveur est indiquée avec l\'option <strong>--to-destination</strong> prenant en paramètre l\'adresse et éventuellement un numéro de port (après les : ). Si le port n\'est pas précisé, c\'est le même que celui indiqué par --destination-port qui sera utilisé. En fait, c\'est tout simplement qu\'il n\'y aura pas de modification de cette valeur.
</p><p>
Il s\'agit ici aussi d\'un traitement invisible en dehors de la passerelle. Pour la personne qui demandera une page web, tout se passera comme si elle était fournie par la passerelle. A noter également que ce port ne doit bien évidemment pas être bloqué par des règles de pare-feu.
</p>
');
$currentPage->display();
?>
require ("../page.inc");
require ("lessons.inc");
$currentPage = new LessonPage("partage_connexion");
$currentPage->setContent('');
$currentPage->addChapter('general', 'Généralités', '
<p>
Partager une connexion permet de relier plusieurs machines à Internet (ou d\'une manière plus générale à un autre réseau) au travers d\'une seule machine (la <strong>passerelle</strong>). Toutes seront comme si elles avaient l\'adresse <acronym xml:lang="en" lang="en" title="Internet Protocol">IP</acronym> de celle physiquement connectée à Internet. Ceci est un cas particulier de <acronym xml:lang="en" lang="en" title="Network Address Translation">NAT</acronym>, ou <strong>translation d\'adresses</strong>, appelé dans Linux le <strong>Masquerading</strong>.
</p><p>
En quelques mots, lorsqu\'une machine désirant envoyer un paquet sur Internet le transmettra à la passerelle, cette dernière remplacera l\'adresse de l\'émetteur réel par la sienne. Ensuite, elle envoie le paquet au destinataire en utilisant un <a href="reseau.php#port">port</a> de son choix. Lorsque ce destinataire (un serveur web par exemple) renverra une réponse sur le port choisi, la passerelle saura à qui la transmettre sur le réseau interne. Elle fera donc alors une modification de l\'adresse de destination. Ce mécanisme est invisible pour l\'initiateur interne, du moment que l\'on a spécifié la passerelle à utiliser.
</p>
');
$currentPage->addChapter('gateway', 'Configurer la passerelle', '
<p>
Il faut tout d\'abord configurer la passerelle. Il s\'agit donc de la machine qui est connectée à Internet et à travers laquelle les autres passent. Cela suppose que le réseau interne est déjà configuré. L\'interface reliée à l\'extérieur doit être identifiée. Dans le cas d\'une connexion par modem, ce sera généralement ppp0. La commande suivante permet de la connaître :
</p>
<code class="terminal">
> netstat -rn | grep UG | gawk \'{print $8}\'
</code>
<p>
Elle affichera le nom de l\'interface. Le programme <strong>netstat</strong> permet de connaître diverses informations réseau (comme les connexions actives). Avec l\'option -r, ce sont les tables de routage qui sont affichées. L\'option -n permet d\'éviter la résolution de noms et donc d\'obtenir plus rapidement les informations. On recherche dans ce résultat l\'indicateur <acronym xml:lang="en" lang="en" title="Up">U</acronym> indiquant que la route est active, et le <acronym xml:lang="en" lang="en" title="Gateway">G</acronym> qui désigne une passerelle. S\'il y en a plusieurs, à vous de déterminer celle à utiliser.
</p><p>
Si votre adresse IP peut potentiellement changer à chaque connexion, comme par exemple lorsque l\'on se connecte avec un modem par l\'intermédiaire d\'un fournisseur d\'accès, la première commande à taper est la suivante :
</p>
<code class="terminal">
> iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
</code>
<p>
Si votre adresse IP est statique, il vaut mieux utiliser celle-là :
</p>
<code class="terminal">
> iptables -t nat -A POSTROUTING -o ppp0 -j SNAT --to-source xxx.xxx.xxx.xxx
</code>
<p>
En remplaçant xxx.xxx.xxx.xxx par l\'adresse statique. Avant de voir les différences, décrivons ce qui est commun dans les deux cas.
</p><p>
On utilise tout d\'abord la table nat de <a href="iptables.php#presentation">Netfilter</a> qui est utilisée pour les translations d\'adresses. On y récupère les paquets destinés à sortir (chaîne <strong>POSTROUTING</strong>) en passant par l\'interface de notre choix (ici ppp0). Ensuite ce qui change est la cible vers laquelle envoyer les paquets pour traitement.
</p><p>
Dans le premier cas, il s\'agit de <strong>MASQUERADE</strong> qui va réaliser le remplacement de l\'adresse source comme expliqué précédemment. Pour le deuxième, c\'est la même chose, si ce n\'est que l\'on spécifie cette adresse avec l\'option <strong>--to-source</strong>. La cible <acronym xml:lang="en" lang="en" title="Source Network Address Translation">SNAT</acronym> signifie Source NAT ce qui correspond bien à un changement de l\'adresse source.
</p><p>
La différence est dans le cas où la connexion vers l\'extérieur serait interrompue. La cible MASQUERADE ne permettra pas de récupérer les communications qui étaient en cours. En revanche, avec SNAT, on saura que l\'adresse d\'origine n\'a pas changée. Le noyau tentera alors de rétablir les connexions qui existaient auparavant.
</p><p>
Après qu\'une de ces deux commandes ait été utilisée, il faut activer la redirection. Cela se fait à l\'aide d\'un élément spécial du pseudo-sytème de fichiers /proc :
</p>
<code class="terminal">
> echo 1 > /proc/sys/net/ipv4/ip_forward
</code>
<p>
La suite de ces deux commandes peut être ajoutée dans un des fichiers lancés au démarrage car cela sera perdu après un arrêt de la machine. Certaines distributions utilisent par exemple /etc/rc.d/boot.local pour cela.
</p>
');
$currentPage->addChapter('route', 'Configurer les machines internes', '
<p>
Une fois cela réalisé, il faut configurer les machines sur le réseau interne pour leur dire d\'utiliser la passerelle préalablement configurée. On utilise l\'outil <strong>route</strong> qui permet de définir les tables de routages. La commande est la suivante :
</p>
<code class="terminal">
> route add default gw 192.168.1.1
</code>
<p>
192.168.1.1 est un exemple pris au hasard (dans les classes d\'adresses utilisées sur les réseaux internes) Cette valeur doit être remplacée par l\'adresse IP par laquelle les ordinateurs voient la passerelle depuis le réseau interne. Là encore cette commande doit être exécutée à chaque démarrage.
</p><p>
Cela suppose que le réseau interne est bien configuré. Il faut que la passerelle soit accessible depuis ces machines.
</p><p>
Pour vérifier la table de routage, il suffit de lancer le programme route sans aucun paramètre. L\'affichage devrait ressembler à ceci (seules les colonnes utiles sont indiquées ici) :
</p>
<pre class="terminal">
> route
Destination Passerelle Genmask Indic Iface
193.168.0.2 * 255.255.255.255 UH eth0
192.168.0.0 * 255.255.255.0 U eth0
default 192.168.0.1 0.0.0.0 UG eth0
</pre>
<p>
On suppose ici que l\'adresse de la machine sur le réseau interne est 192.168.0.2 et possède une seule carte réseau Ethernet (eth0). La première ligne indique cela. L\'indicateur <acronym xml:lang="en" lang="en" title="Host">H</acronym> de la quatrième colonne permet de savoir qu\'il s\'agit d\'une machine unique.
</p><p>
La ligne suivante est la route permettant d\'atteindre la passerelle. Sur le réseau interne, l\'accès se fait directement (pas de passerelle) par l\'interface eth0.
</p><p>
Enfin la dernière ligne est la plus intéressante dans ce cas. Elle indique que pour toutes les autres adresses de destination, la route par défaut passe par la passerelle 192.168.0.1.
</p>
');
$currentPage->addChapter('server', 'Permettre un serveur interne', '
<p>
Tout cela permet d\'initier des connexions uniquement depuis le réseau interne vers l\'extérieur. Or, il se peut que l\'on souhaite avoir un service proposé par une machine à l\'intérieur. Par exemple admettons que la machine d\'adresse 192.168.1.3 héberge un site web (port 80 par défaut) qui doivent être accessible. Toutes les demandes d\'accès à ce site se feront sur la passerelle. C\'est à elle ensuite de les transférer sur le serveur interne concerné. On utilise alors une translation d\'adresse de destination, qui est l\'opposé de ce qui a été exposé ci-dessus.
</p><p>
Voici dans ce cas-là la commande iptables à utiliser :
</p>
<code class="terminal">
> iptables -t nat -p tcp -A PREROUTING -j DNAT --destination-port 80 --to-destination 192.168.1.3:80
</code>
<p>
On utilise à nouveau la table nat car il s\'agit toujours d\'une translation d\'adresse. Mais cette translation est ici faite dès que le paquet pénètre la couche réseau (<strong>PREROUTING</strong>). Cela bien évidemment pour mettre la bonne adresse destination dès que possible afin que le routage s\'effectue correctement.
</p><p>
La cible est <acronym xml:lang="en" lang="en" title="Destination Network Address Translation">DNAT</acronym> (Destination NAT) qui est le pendant du SNAT. C\'est elle qui permet de modifier l\'adresse de destination des informations.
</p><p>
On trouve enfin les options nécessaires qui devront bien sûr être adaptées selon les besoins. Tout d\'abord <strong>--destination-port</strong> qui est le port de connexion depuis l\'extérieur. Il peut être totalement différent de celui sur la machine faisant office de serveur sur le réseau interne. L\'adresse de ce serveur est indiquée avec l\'option <strong>--to-destination</strong> prenant en paramètre l\'adresse et éventuellement un numéro de port (après les : ). Si le port n\'est pas précisé, c\'est le même que celui indiqué par --destination-port qui sera utilisé. En fait, c\'est tout simplement qu\'il n\'y aura pas de modification de cette valeur.
</p><p>
Il s\'agit ici aussi d\'un traitement invisible en dehors de la passerelle. Pour la personne qui demandera une page web, tout se passera comme si elle était fournie par la passerelle. A noter également que ce port ne doit bien évidemment pas être bloqué par des règles de pare-feu.
</p>
');
$currentPage->display();
?>
Si avez des problèmes ou des questions concernant ce fichier source, vous pouvez utiliser le Forum Sources du site