Configurer une passerelle IPsec
Auteur : Olivier BOYER - oboyer () ajoute ! org
Mots clés
IPsec, OpenBSD 3.9, isakmpd, ipsecctl, Linux 2.6.x, ipsec-tools, racoon, TheGreenBow
Introduction
Ce document décrit comment configurer une passerelle IPsec (ESP mode tunnel) de type host to network avec échange de clés dynamique sous OpenBSD 3.9. Les protocoles IPsec sont utilisés ici pour assurer la confidentialité des échanges entre des clients wifi et le réseau local cablé, mais aussi entre le réseau wifi et l'Internet. Les configurations mises en oeuvre dans ce document peuvent tout aussi bien s'appliquer à l'accès à travers Internet au système d'information d'une structure.
Présentation de la maquette
- Une passerelle IPsec sous OpenBSD 3.9
- Un client sous Linux 2.6.x avec le paquetage
ipsec-tools v0.6.xinstallé - Un client sous Windows XP avec le client VPN
TheGreenBowv2.50.019 installé. - L'échange des clés est fait dynamiquement en IKE.
- L'authentification des entités communiquantes (passerelle et clients) est faite par le mécanisme de “clé partagée” (
Pre-Shared Key)
Adressage IP :
- passerelle : 192.168.100.1
- client Linux : 192.168.100.2
- client Windows : 192.168.100.3
- client en multi-boot Linux/Windows : 192.168.100.5
Bref rappel IPsec
Voici un datagramme IPv4 (ou paquet) émis sur le réseau :
----------------------------
IPv4 |orig IP hdr | | |
|(any options)| TCP | Data |
----------------------------
Voici le même datagramme IPv4, mais transmis en ESP mode tunnel :
|<--- original paquet -->|
-----------------------------------------------------------
IPv4 | new IP hdr* | | orig IP hdr | | | ESP | ESP|
|(any options)| ESP | (any options) |TCP|Data|Trailer|Auth|
-----------------------------------------------------------
|<--------- encrypted ---------->|
|<----------- authenticated ---------->|
Ainsi dans une communication ESP mode tunnel, un pirate qui essaie d'écouter sur la liaison ne voit passer les adresses IP (source et destination) du datagramme et sait que le datagramme est protégé par IPsec ESP. Le pirate est incapable de :
- modifier ou de rejouer un paquet, puisqu'il est authentifié
- lire le contenu du paquet, puisqu'il est crypté
Seul le destinataire du datagramme peut lire son contenu, et est sûr de l'identité de l'émetteur.
Note
Toutes les commandes présentées ici, sont à exécuter, sauf mention contraire, en tant qu'administrateur de la machine.
Pré-requis
- Le système de la passerelle (OpenBSD 3.9) doit :
- être installé, configuré et fonctionnel,
- avoir sa carte réseau wifi configurée en mode
access point.
- Sur le système du client Linux 2.6.x doit :
- être installé,
- être en adressage IP static,
- avoir sa carte réseau wifi installée et reconnue par le système,
- avoir le paquetage
ipsec-tools(version supérieure à v0.6) installé.
- Le système du client Windows XP doit :
- être installé,
- être en adressage IP static,
- avoir sa carte réseau wifi installée et reconnue par le système,
- avoir le produit
TheGreenBow vpn client(version supérieure à v2.50.019) installé.
Configuration de la passerelle
Autoriser le passage des paquets réseau
Pour autoriser le passage des paquets réseau (ip forwarding), exécutez la commande suivante :
# sysctl net.inet.ip.forwarding=1
Pour que la modification soit effective à chaque démarrage de la machine, ajoutez la ligne suivante au fichier /etc/sysctl.conf :
net.inet.ip.forwarding=1
Fichier /etc/ipsecctl.conf
# cas 1 : client racoon (linux)
ike esp from any to 192.168.100.2 \
main auth hmac-sha1 enc blowfish \
quick auth hmac-sha1 enc blowfish \
psk "MAPSK"
# cas 2 : client TheGreenBow (Windows)
ike esp from any to 192.168.100.3 \
main auth hmac-sha1 enc aes \
quick auth hmac-sha1 enc aes \
psk "MAPSK"
# cas 3: client en multi-boot theGreenBow (Windows) ou racoon (linux)
# TheGreenBow v2.50.019 ne supporte pas :
# - le sha2 pour l'authentification
# - le blowfish pour l'encription
ike esp from any to 192.168.100.5 \
main auth hmac-sha1 enc aes \
quick auth hmac-sha1 enc aes \
psk "MAPSK"
#EOF
Remarque 1
Dans la configuration ci-dessus, la passerelle IPsec tente d'établir le tunnel IPsec, dès que le processus isakmpd est démarré. Ce comportement est souhaitable dans le cas d'une liaison IPsec permanente.
Cependant, dans le cadre d'un tunnel IPsec à la demande, isakmpd tente désespérement d'initier un tunnel vers un hôte absent, et enregistre ses tentatives via syslogd. Les fichiers de log peuvent vite se retrouver saturés. Il est donc souhaitable de configurer isakmpd sur la passerelle IPsec pourqu'il attende les demandes de connexions des hôtes distants. Le mot clé passive est fait pour.
Supposons, par exemple, que le client 192.168.100.3 soit un client non permanent. La définition du tunnel IPsec sera donc comme suit :
# client: TheGreenBow (Windows)
ike passive esp from any to 192.168.100.3 \
main auth hmac-sha1 enc aes \
quick auth hmac-sha1 enc aes \
psk "MAPSK"
Remarque 2
Vous pouvez générer une clé partagée plus grande, via la commande suivante :
# echo MAPSK | openssl dgst -md5 79ba4b887d48d86cd19256eba7f034ba
Fichier /etc/pf.conf
Ajoutez les lignes suivantes au fichier /etc/pf.conf :
set skip on enc0 pass quick proto esp keep state pass quick proto udp to port isakmp keep state
Démarrer les services
Manuellement
# pfctl -e -Fa -f /etc/pf.conf # /sbin/isakmpd -K # /sbin/ipsecctl -F -f /etc/ipsecctl.conf
Automatiquement au démarrage de la machine
Ajoutez les lignes suivantes au fichier /etc/rc.conf.local :
isakmpd_flags="-K"
Ajoutez les lignes suivantes au fichier /etc/rc.local :
# Start ipsecctl
if [ -f /etc/ipsecctl.conf ] ; then
echo -n 'ipsecctl'
/sbin/ipsecctl -f /etc/ipsecctl.conf
fi
Suivre l'évolution des tunnels
Traces d'execution d'isakmpd
Vous pouvez facilement voir le trafic réseau durant les négociation de la Phase1 IKE par la commande suivante :
# tcpdump -qtn udp port 500
Pour une vue plus détaillée de la négociation, il faut utiliser le mécanisme de “dump” fournit par le démon isakmpd(8) lui-même. Pour cela, il faut démarrer le démon isakmpd(8) avec l'option -L. Le “dump” est envoyé, par défaut, dans le fichier /var/run/isakmpd.pcap. L'option -l permet d'indiquer un autre fichier.
# pkill isakmpd # isakmpd -KL # tcpdump -v -s 1500 -r /var/run/isakmpd.pcap
SA et flow IPsec
Pour voir le contenu de la base des Security Associations, et des flow IPsec, exécutez la commande suivante :
# ipsecctl -sa
Configuration du client Linux
L'adresse IP du client Linux est : 192.168.100.2
Dans cette configuration, le client n'est pas en multi-boot linux/windows. L'entrée correspondante dans le fichier de configuration de la passerelle IPSec est le cas 1.
Modifiez comme suit les différents fichiers de configuration :
fichier /etc/ipsec.conf
#!/usr/sbin/setkey -f
flush;
spdflush;
spdadd 192.168.100.2/32 0.0.0.0/0 any -P out ipsec
esp/tunnel/192.168.100.2-192.168.100.1/require;
spdadd 0.0.0.0/0 192.168.100.2/32 any -P in ipsec
esp/tunnel/192.168.100.1-192.168.100.2/require;
fichier /etc/racoon/psk.txt
# 192.168.100.1 == IP de la passerelle 192.168.100.1 MAPSK
fichier /etc/racoon/racoon.conf
path pre_shared_key "/etc/racoon/psk.txt";
remote 192.168.100.1 {
exchange_mode main;
dpd_delay 5;
proposal {
encryption_algorithm blowfish;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group modp1024;
}
}
sainfo anonymous {
pfs_group modp1024;
encryption_algorithm blowfish,aes;
authentication_algorithm hmac_sha1;
compression_algorithm deflate; # necessaire mais pas utilise
}
Démarrer le tunnel sous linux
# chmod 400 /etc/racoon/psk.txt # racoon -f /etc/racoon/racoon.conf # setkey -f /etc/ipsec-tools.conf
ou, en utilisant les scripts de démarrage :
# /etc/init.d/ipsec-setkey start # /etc/init.d/racoon start
Voir l'état des clés, et flow ipsec
# setkey -D
Configuration du client Windows
L'adresse IP du client Windows est : 192.168.100.3
Dans cette configuration, le client n'est pas en multi-boot linux/windows. L'entrée correspondante dans le fichier de configuration de la passerelle IPSec est le cas 2.
Lancer le client vpn TheGreenBow, puis faites une configuration identique à celle ci-dessous :
phase1: * Nom: test,
Interface: 192.168.100.3
Adresse routeur distant: 192.168.100.1
* Cle partagee: MAPSK
* IKE:
Chiffrement: AES 128,
Authentification: SHA,
Groupe de cle: DH1024
phase2: * Nom: test
Adresse du Client VPN: 192.168.100.3
* Type d'adresse: Adresse Subnet
Adresse reseau distant: 0.0.0.0
Masque erseau: 0.0.0.0
* ESP
Chiffrement: AES 128
Authentification: SHA
Mode: Tunnel
* PFS: group DH1024
Cliquez sur "Sauver et Appliquer",
Puis, pour ouvrir le tunnel cliquez sur : "Ouvrir le tunnel"
Configuration du client en multiboot Linux/Windows
L'adresse IP du client en multiboot est : 192.168.100.5
L'entrée correspondante dans le fichier de configuration de la passerelle IPSec est le cas 3.
Configuration du client Windows
La configuration du client Windows TheGreenBow est identique à celle du paragraphe précédent. Il faut, seulement, remplacer l'adresse IP du client 192.168.100.3 par l'adresse IP 192.168.100.5.
Configuration du client Linux
La configuration du client Linux diffère légèrement de l'exemple de cas 1. En effet, le client Windows TheGreenBow ne supporte pas l'algorithme d'encryption blowfish. Il faut donc le remplacer par un supporté, dans cet exemple, ce sera l'algorithme aes.
fichier /etc/ipsec.conf
Le fichier /etc/ipsec.conf est identique au fichier présenté dans le cas 1. Seule l'adresse IP du client change : il faut remplacer l'adresse 192.168.100.2 par 192.168.100.5.
#!/usr/sbin/setkey -f
flush;
spdflush;
spdadd 192.168.100.5/32 0.0.0.0/0 any -P out ipsec
esp/tunnel/192.168.100.5-192.168.100.1/require;
spdadd 0.0.0.0/0 192.168.100.5/32 any -P in ipsec
esp/tunnel/192.168.100.1-192.168.100.5/require;
fichier /etc/racoon/psk.txt
La clé secrète partagée est toujours la même, la configuration du fichier /etc/racoon/psk.txt ne change pas, par rapport au cas 1.
# 192.168.100.1 == IP de la passerelle 192.168.100.1 MAPSK
fichier /etc/racoon/racoon.conf
La configuration du fichier /etc/racoon/racoon.conf est quasiment identique à celle du cas 1. Seul l'algorithme d'encryption change. Il faut remplacer l'algorithme blowfish par aes.
path pre_shared_key "/etc/racoon/psk.txt";
remote 192.168.100.1 {
exchange_mode main;
dpd_delay 5;
proposal {
encryption_algorithm aes;
hash_algorithm sha1;
authentication_method pre_shared_key;
dh_group modp1024;
}
}
sainfo anonymous {
pfs_group modp1024;
encryption_algorithm blowfish,aes;
authentication_algorithm hmac_sha1;
compression_algorithm deflate; # necessaire mais pas utilise
}
Sniffer une liaison wifi sous Linux
C'est très facile, même sans avoir d'adresse IP dans le réseau wifi. Pour ce faire, utiliser le très connu ethereal disponible sous Unix et Windows à l'adresse : http://www.ethereal.com.
Pour bien sniffer TOUS les paquets wifi (appelés 'wlan' sous ethereal) vous devez :
Configurer votre carte wifi en mode promiscuité
Exécutez la commande suivante :
# ifconfig <int> promisc
Configurer la carte wifi en mode moniteur
Exécutez la commande suivante :
# iwconfig <int> mode monitor
En general le mode par défaut est Managed (cas d'un reseau avec un Access Point). Sous Linux, il faut avoir installé le paquetage wireless-tools en version supérieure à la 'v25' pour pouvoir changer le mode de sa carte wifi (… et bien sur que le pilote de la carte le supporte).
Appliquer un filtre [optionel]
Pour ne pas être trop polué par le trafic IEE802.11, vous pouvez appliquer le filtre ethereal suivant :
"! (wlan.da == ff:ff:ff:ff:ff:ff)"
Liens
- RFC1825: Security Architecture for the Internet Protocol
- RFC1829: The ESP DES-CBC Transform
- RFC2709: Security Model with Tunnel-mode IPsec for NAT Domains
- RFC2663: IP Network Address Translator (NAT) Terminology and Considerations
- RFC2406: ESP
- RFC2402: AH
- RFC2409: IKE