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.x installé
  • Un client sous Windows XP avec le client VPN TheGreenBow v2.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
 
doc/openbsd/ipsec.txt · Dernière modification: 2009/12/23 22:36 (édition externe)     Haut de page