Bonjour!
J'ai résolu le problème!
La solution est la suivante :
- quand on veut avoir sur une seule machine avec un noyau 2.6.x les deux fonctions "point d'entrée d'un tunnel IPsec" et "masquage de réseau privé" (règles iptables "SNAT" et "DNAT" ou bien "MASQUERADE"),
il faut impérativement utiliser au moins un noyau 2.6.16 et la version 1.3.5 de "NetFilter/iptables" : j'ai donc mis à jour Ubuntu 6.06 (noyau 2.6.15) vers la version 6.10 qui est fournie avec un noyau 2.6.17 et iptables 1.3.5;
- pour que l'explication qui suit soit plus claire, je redonne la topologie du réseau (elle apparaît avec la commande "ipsec auto --status"):
- Code: Tout sélectionner
192.168.0.0/24===212.0.0.78...212.0.0.14===100.0.0.0/24
La machine que je veux configurer est celle de gauche, d'adresse IP publique valant 212.0.0.78 et d'adresse IP privée 192.168.0.1.
- voici le fichier "/etc/ipsec.conf" que j'utilise :
- Code: Tout sélectionner
version 2.0
config setup
nat_traversal=no
interfaces=%defaultroute
plutowait=no
conn mon_vpn
left=212.0.0.78
leftsourceip=192.168.0.1
leftsubnet=192.168.0.0/24
right=212.0.0.14
rightsourceip=100.0.0.1
rightsubnet=100.0.0.0/24
keyexchange=ike
ikelifetime=240m
keylife=3600s
pfs=yes
compress=no
authby=secret
keyingtries=0
auto=start
#Disable Opportunistic Encryption
include /etc/ipsec.d/examples/no_oe.conf
- et voici le fichier "/etc/ipsec.secrets" :
- Code: Tout sélectionner
212.0.0.78 212.0.0.14 : PSK "mettre_ici_le_secret_partagé_par_les_deux_routeurs"
- Ensuite il faut configurer le pare-feu pour que le tunnel puisse s'établir. L'échange des secrets partagés nécessite l'ouverture du port UDP 500 dans les deux sens :
- Code: Tout sélectionner
iptables --append INPUT --source $ADRESSE_IP_ROUTEUR_DISTANT --protocol udp --sport 500 --dport 500 --jump ACCEPT
iptables --append OUTPUT --destination $ADRESSE_IP_ROUTEUR_DISTANT --protocol udp --sport 500 --dport 500 --jump ACCEPT
- Il faut aussi autoriser le protocole ESP puisque c'est le protocole qui sert à encapsuler les paquets "tunnelés" :
- Code: Tout sélectionner
iptables --append INPUT --protocol esp --source $ADRESSE_IP_ROUTEUR_DISTANT --jump ACCEPT
iptables --append OUTPUT --protocol esp --destination $ADRESSE_IP_ROUTEUR_DISTANT --jump ACCEPT
- Pour éviter le conflit entre le SNAT et le tunnel IPsec, au niveau de NetFilter, il faut exclure le réseau distant de la translation d'adresse source qui est effectuée pour tous les paquets à destination d'Internet. Donc au lieu de :
- Code: Tout sélectionner
iptables --table nat --append POSTROUTING --out-interface eth0 --jump SNAT --to-source $ADRESSE_IP_PUBLIQUE
il faut mettre :
- Code: Tout sélectionner
iptables --table nat --append POSTROUTING --out-interface eth0 --destination ! 100.0.0.0/24 --jump SNAT --to-source $ADRESSE_IP_PUBLIQUE
- Pour que les paquets en provenance du réseau distant soient acceptés, il faut avoir ceci :
- Code: Tout sélectionner
iptables --append FORWARD --match policy --dir in --pol ipsec --mode tunnel --tunnel-src 100.0.0.1 --tunnel-dst 192.168.0.1 --jump ACCEPT
- On autorise aussi, évidemment, les paquets circulant dans l'autre sens :
- Code: Tout sélectionner
iptables --append FORWARD --match policy --dir out --pol ipsec --mode tunnel --tunnel-src 192.168.0.1 --tunnel-dst 100.0.0.1 --jump ACCEPT
- Il faut aussi autoriser le routeur à recevoir les messages ICMP de type "fragmentation-needed" à partir de l'extérieur, car sinon certains gros paquets ne passeront pas à travers le tunnel (
plus d'information sur le filtrage des paquets ICMP) :
- Code: Tout sélectionner
iptables --append INPUT --protocol icmp --icmp-type fragmentation-needed --jump ACCEPT
Voilà! Avec tout ça, ça fonctionne! J'espère que les indications ci-dessus seront utiles à d'autres personnes et que ça leur évitera les nombreuses heures de recherche que j'y ai passé.
Cordialement,
Geceo