% !TEX root =  ../Architecture_reseau_Mauvaisin.tex

% Chapitre: Liaison Virtuelle entre Nailloux et Tetaneutral.net
\chapter{Liaison Virtuelle Nailloux/Tetaneutral.net}
\label{chap:vpn}

% Section: Schéma de principe
\section{Schéma de principe}
\label{chap3:sec:schema}
La Figure \ref{fig:schema-vpn} présente le schéma de principe de la configuration du VPN établi entre la machine PC Nailloux et la machine gw.tetaneutral.net. Elle illustre également le routage des paquets entrant sur l'interface eth0 de PC Nailloux (connectée au réseau WiFi) entre PC Nailloux et Tetaneutral.net.


  \begin{figure}[htb]
  \centering
    \includegraphics[width=13cm]{./Figures/schema-vpn.eps}
    \caption{Scéma de principe de la configuration du VPN.}
    \label{fig:schema-vpn}
  \end{figure}

Nous allons décrire plus en détail le fonctionnement en expliquant le script "/root/mauvaisin.sh" exécuté par PC Nailloux. Un script probablement similaire est exécuté à l'autre bout du tunnel sur la machine gw.tetaneutral.net.


% Section: Schéma de principe
\section{Script de configuration du VPN}
\label{chap3:sec:script}
La Figure \ref{fig:script} donne le script de configuration utilisé sur la machine PC Nailloux pour établir le VPN et configurer le routage des paquets. Nous allons commenter pas à pas chacune des commandes executées par le script.

\begin{figure}[thb]
\begin{center}
\begin{small}
\begin{verbatim}
#!/bin/bash

echo 1 > /proc/sys/net/ipv4/ip_forward


ip link set eth0 up
ip addr add 172.31.68.1/24 dev eth0

openvpn --mktun --dev-type tun --dev tunmvs
ip link set tunmvs up
openvpn --dev tunmvs --dev-type tun --local 192.168.133.1 --lport 0 --proto udp \
 --daemon --remote 91.224.148.1 65014 --log-append vpn-65014.log --keepalive 10 30
ip addr add 10.0.29.2/24 dev tunmvs

ip route add 10.0.29.0/24 dev tunmvs table 68
ip route add default via 10.0.29.1 dev tunmvs table 68
ip rule add from 10.0.29.2 table 68

for i in 64 65 66 67 68 69 70 71 72 73 74 75 76 77; do
ip route add 91.224.148.${i}/32 dev eth0
ip rule add from 91.224.148.${i} table 68
done
\end{verbatim}
\end{small}
\caption{Script de configuration du VPN sur PC Nailloux. \label{fig:script}}
\end{center}
\end{figure}

La première ligne,

\begin{small}
\begin{verbatim}
echo 1 > /proc/sys/net/ipv4/ip_forward
\end{verbatim}
\end{small}

% XXXX remarque Matthieu : ce qui suit est approximatif. a corriger
\noindent permet de configurer la machine PC Nailloux comme un routeur. En effet, par défaut, une machine élimine tous les paquets IP dont elle n'est pas destinataire. En la configurant comme un routeur, on impose qu'elle examine ses tables de routage pour acheminer les paquets IP qu'elle reçoit et qui ne lui sont pas destinés.

Les commandes

\begin{small}
\begin{verbatim}
ip link set eth0 up
ip addr add 172.31.68.1/24 dev eth0
\end{verbatim}
\end{small}

\noindent permettent d'activer l'interface réseau eth0 dont l'adptateur est relié à une antenne WiFi, puis d'affecter l'adresse IP privée 172.31.68.1 à cette interface.

Les lignes suivantes

\begin{small}
\begin{verbatim}
openvpn --mktun --dev-type tun --dev tunmvs
ip link set tunmvs up
\end{verbatim}
\end{small}

\noindent permettent de créer une interface réseau de nom tunmvs et de type TUN (network TUNnel) grâce à l'outil openvpn \cite{openvpn}. Le nom tunmvs a probablement été choisi pour "Tunnel Mauvaisin". Pour rappel, les interfaces TUN et TAP sont des interfaces réseaux virtuelles \cite{tuntap}. Comme elles n'ont qu'une existence logicielle au niveau du noyau du système d'exploitation, elle diffèrent des interfaces traditionnelles comme eth0 qui elles sont associées à des adaptateurs réseaux. TUN permet de simuler une interface de niveau réseau opérant sur des paquets IP, alors que TAP va simuler une interface de niveau lien et opére donc sur des trames (par exemple des trames Ethernet). TUN est utilisé pour faire du routage, alors que TAP est utilisé pour faire une passerelle entre deux réseaux de niveau 2 (network bridging). La commande "ip link set tunmvs up" permet de rendre l'interface réseau virtuelle tunmvs active.

Les commandes

\begin{small}
\begin{verbatim}
openvpn --dev tunmvs --dev-type tun --local 192.168.133.1 --lport 0 --proto udp \
 --daemon --remote 91.224.148.1 65014 --log-append vpn-65014.log --keepalive 10 30
ip addr add 10.0.29.2/24 dev tunmvs
\end{verbatim}
\end{small}

\noindent permettent la création effective du VPN, puis affectent l'adresse IP privée 10.0.29.2 à l'interface tunmvs (avec un masque réseau de 255.255.255.0). L'appel à openvpn permet de déclarer que l'interface tunmvs est associé à un tunnel VPN établi entre les adresses locale 192.168.133.1 (adresse IP privée sur PC Nailloux) et distante 91.224.148.1 correspondant à l'hôte gw.tetaneutral.net. La communication avec cette hôte se fait sur le port 65014, en utilisant le protocole UDP\footnote{Comme la plupart des paquets IP transportés par le tunnel sont associés à des connexions TCP, et sont donc acquittés de bout-en-bout, l'utilisation de TCP pour le tunnel générerait probablement beaucoup de trafic supplémentaire et pas vraiment utile.}. Les anomalies constatées sur le VPN seront enregistrées dans le fichier "vpn-65014.log". Les paramètres du keepalive spécifient la fréquence à laquelle sera testée la connexion VPN (via du ping). Enfin, la seconde commande affecte l'adresse IP privée 10.0.29.2/24 à l'interface tunmvs, l'interface tunmvs sur gw.tetaneutral.net étant configurée avec l'adresse 10.0.29.1.

Le script crée ensuite une table de routage (la table 68) qu'il peuple avec quelques routes grâce aux commandes suivantes :

\begin{small}
\begin{verbatim}
ip route add 10.0.29.0/24 dev tunmvs table 68
ip route add default via 10.0.29.1 dev tunmvs table 68
ip rule add from 10.0.29.2 table 68
\end{verbatim}
\end{small}

La première ligne stipule que, dans la table 68, tout paquet destiné au réseau 10.0.29.0/24 (autrement dit les adresses 10.0.29.1 à 10.0.29.255) doit être routé sur l'interface tunmvs. La seconde commande stipule que, dans la table 68, tout paquet dont l'adresse est inconnue sera routé vers 10.0.29.1, c'est à dire l'interface tunmvs de gw.tetaneutral.net. Enfin, la dernière commande stipule que la table 68 sera utilisée pour les paquets arrivant de 10.0.29.2, c'est à dire l'interface tunmvs locale.

Enfin, les commandes   

\begin{small}
\begin{verbatim}
for i in 64 65 66 67 68 69 70 71 72 73 74 75 76 77; do
ip route add 91.224.148.${i}/32 dev eth0
ip rule add from 91.224.148.${i} table 68
done
\end{verbatim}
\end{small}

\noindent permettent de dire que :

\begin{itemize}
\item Les paquets destinés aux adresses 91.224.148.66 à 91.224.148.77, c'est à dire les IP publiques des adhérents de Mauvaisin, seront routés sur l'interface eth0 connectée au réseau WiFi.
\item Les paquets ayant pour source les adresses 91.224.148.66 à 91.224.148.77 affectées aux utilisateurs de Mauvaisin seront routés en utilisant la table 68, et donc envoyés sur l'interface VPN tunmvs.
\end{itemize}
