Openstuff Wiki : HowtoVPNPluto

HomePage :: Categories :: PageIndex :: RecentChanges :: RecentlyCommented :: Login/Register

Mise en place d'un VPN IPsec avec pluto


1. Présentation de la maquette


Nous allons mettre en place un VPN IPsec en utilisant le démon IKE pluto du projet OpenSwan ainsi que la pile IPsec par défaut du noyau: NETKEY. Nous aurons d'un coté un RAS ou serveur d'accès distant, et de l'autre un roadwarrior, une personne amenée à voyager. Donc d'un coté un serveur bien identifié avec une adresse publique et de l'autre un client pouvant aussi bien avoir une adresse IP publique qu'être devant un équipement réalisant du NAT.

Nous utiliserons uniquement des certificats x509 pour des raisons de maintenance et de répudiation. Pas de secret partagé donc. La mise en place du VPN se fera en deux étapes : en utilisant des certificats x509 autosignés dans un premier temps, puis via une autorité de certification.

2. Installation et premiers tests


2.1 Installation d'openswan


Sur une debian like, installation classique :
$ sudo apt-get install openswan


Durant l'installation on choisira :

2.2 Tests


Nous allons vérifier l'état du démon :
$ /etc/init.d/ipsec status
IPsec running  - pluto pid: 3377
pluto pid 3377
No tunnels up


OpenSwan fournit une commande permettant de réaliser un ensemble de tests basiques sur le noyau Linux et sur la configuration réseau de notre installation :
$ sudo ipsec verify
Checking your system to see if IPsec got installed and started correctly:
Version check and ipsec on-path                                 [OK]
Linux Openswan U2.4.6/K2.6.18-4-686 (netkey)                    
Checking for IPsec support in kernel                            [OK]
NETKEY detected, testing for disabled ICMP send_redirects       [OK]
NETKEY detected, testing for disabled ICMP accept_redirects     [OK]
Checking for RSA private key (/etc/ipsec.secrets)               [DISABLED]
ipsec showhostkey: no default key in "/etc/ipsec.secrets"     
Checking that pluto is running                                  [OK]
Two or more interfaces found, checking IP forwarding            [OK]
checking NAT and MASQUERADEing                                  
Checking for 'ip' command                                       [OK]
Checking for 'iptables' command                                 [OK]
Opportunistic Encryption Support                                [DISABLED]


Il est possible que vous ayez une erreur du style :
NETKEY detected, testing for disabled ICMP accept_redirects     [FAILED]
Please disable /proc/sys/net/ipv4/conf/*/accept_redirects
or NETKEY will accept bogus ICMP redirects!


Il faut désactiver les filtres anto-spoof et les redirections ICMP pour éviter que le noyau n'envoie des redirects pour les paquets provenant et à destination de la même interface. Ceci peut arriver avec l'utilisation de la pile NETKEY. De plus, l'ip_forwarding doit être activé au niveau du RAS. Ceci peut ce faire dynamiquement via la commande sysctl:
$ sudo sysctl -w net.ipv4.conf.all.accept_redirects="0"


Le fichier /etc/sysctl.conf pourra contenir tous nos paramètres qui seront appliqués dès le démarrage du serveur :
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.log_martians = 0


Il est également possible de réaliser des tests avancés. L'idée est de lancer de nombreuse vérification sur un serveur de test public (livetest.xelerance.net) pour être sûr qu'il n'y est pas de problème de filtrage, etc ...
$ sudo ipsec livetest


Lors de la rédaction de ce document, le serveur ne répondait pas.

2.3 Configuration du firewall


Le ou les firewall devront ouvrir les flux suivants :


3. Configuration d'OpenSwan


3.1 Organisations des fichiers


Deux fichiers de configuration sont utilisés :

Au niveau des certificats, tout est classé dans des répertoires :

Il reste deux autres répertoires :

3.2 configuration


Sur chaque machine, mettre les 2 certificats RASCert.pem et RoadwarriorCert.pem dans /etc/ipsec.d/certs. La clé privée, et uniquement celle correspondant au certificat de la machine, devra être dans /etc/ipsec.d/private.

Pour la génération des certificats, il possible de le faire en ligne de commande avec OpenSSL :
$ sudo openssl genrsa -out RASCert.key 2048
$ sudo openssl req -new -key RASCert.key -x509 -out RAS.cert


Passons à la configuration d'OpenSwan. Nous allons avoir l'ensemble de notre configuration dans le fichier ipsec.conf.

Sur le client (roadwarriors) :
version 2.0     # conforms to second version of ipsec.conf specification

# basic configuration
config setup
	    # NAT-TRAVERSAL support
	    nat_traversal=yes

# connection definitions
conn roadwarrior-RAS
	# RW
	left=%defaultroute
	leftcert=RoadwarriorCert.pem
	# RAS
	right=<ip publique RAS>
	rightsubnet=192.168.1.0/24
	rightcert=RASCert.pem
	# connection type
	type=tunnel
	auto=add


Sur le RAS (serveur VPN) :
version 2.0     # conforms to second version of ipsec.conf specification

# basic configuration
config setup
	    # NAT-TRAVERSAL support
	    nat_traversal=yes
	    virtual_private=%v4:192.168.128.0/24

# connection definitions
conn roadwarrior-RAS
	# RW
	left=%any
	leftcert=RoadwarriorCert.pem
	leftsubnet=vhost:%no,%priv
	# RAS
	right=<ip publique RAS>
	rightsubnet=192.168.1.0/24
	rightcert=RASCert.pem
	rightnexthop=<ip gateway RAS>
	# connection type
	type=tunnel
	auto=add



Relancer le démon pour prendre en compte les changements :
$ sudo /etc/init.d/ipsec restart


Regarder que pluto se lance bien :
$ sudo tail -f /var/log/daemon.log
Aug  3 14:44:01 openstuff ipsec_setup: ...Openswan IPsec stopped
Aug  3 14:44:01 openstuff ipsec_setup: Stopping Openswan IPsec...
Aug  3 14:44:01 openstuff ipsec_setup: KLIPS ipsec0 on eth0 192.168.128.2/255.255.255.0 broadcast 192.168.128.255
Aug  3 14:44:02 openstuff ipsec_setup: ...Openswan IPsec started
Aug  3 14:44:02 openstuff ipsec_setup: Starting Openswan IPsec 2.4.6...
Aug  3 14:44:02 openstuff ipsec_setup: insmod /lib/modules/2.6.20-16-server/kernel/net/key/af_key.ko
Aug  3 14:44:02 openstuff ipsec_setup: insmod /lib/modules/2.6.20-16-server/kernel/net/ipv4/xfrm4_tunnel.ko
Aug  3 14:44:02 openstuff ipsec_setup: insmod /lib/modules/2.6.20-16-server/kernel/net/xfrm/xfrm_user.ko


Vérifier que les certificats sont bien présents :
$ sudo ipsec auto --listall
000  
000 List of Public Keys:
000  
000 Aug 06 17:08:48 2007, 2048 RSA Key AwEAAcqqr, until Sep 11 11:06:47 2011 ok
[...]
000 Aug 06 17:08:48 2007, 2048 RSA Key AwEAAfDWq, until Sep 02 14:59:42 2007 ok
[...]
000 List of X.509 End Certificates:
000  
000 Aug 06 17:08:48 2007, count: 2
[...]
000        pubkey:   2048 RSA Key AwEAAcqqr, has private key
[...]
000 Aug 06 17:08:48 2007, count: 2
[...]


Ici nous avons bien les deux certificats et notre clé privée (private key).

3.3 Mise en place du VPN


Nous allons maintenant monter le VPN. Sur le client :
$ sudo ipsec auto --up roadwarrior-RAS
104 "roadwarrior-RAS" #1: STATE_MAIN_I1: initiate
003 "roadwarrior-RAS" #1: received Vendor ID payload [Openswan (this version) 2.4.6  X.509-1.5.4 LDAP_V3 PLUTO_SENDS_VENDORID PLUTO_USES_KEYRR]
003 "roadwarrior-RAS" #1: received Vendor ID payload [Dead Peer Detection]
003 "roadwarrior-RAS" #1: received Vendor ID payload [RFC 3947] method set to=110
106 "roadwarrior-RAS" #1: STATE_MAIN_I2: sent MI2, expecting MR2
003 "roadwarrior-RAS" #1: NAT-Traversal: Result using 3: i am NATed
108 "roadwarrior-RAS" #1: STATE_MAIN_I3: sent MI3, expecting MR3
004 "roadwarrior-RAS" #1: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_RSA_SIG cipher=oakley_3des_cbc_192 prf=oakley_md5 group=modp1536}
117 "roadwarrior-RAS" #2: STATE_QUICK_I1: initiate
004 "roadwarrior-RAS" #2: STATE_QUICK_I2: sent QI2, IPsec SA established {ESP=>0x3bd2814d <0x1a87aed6 xfrm=AES_0-HMAC_SHA1 NATD=88.171.141.210:4500 DPD=none}


Une fois la SA établie, nous allons pouvoir tester: le roadwarrior ping une machine dans le subnet du RAS :
$ ping 192.168.1.3


Du côté du RAS on vérifie que le flux est bien de l'IPsec :
$ sudo tcpdump -ni any host <ip publique roadwarior>
tcpdump: WARNING: Promiscuous mode not supported on the "any" device
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 96 bytes
17:53:43.575893 IP <ip publique roadwarior>.4500 > <ip publique RAS>.4500: UDP-encap: ESP(spi=0x3bd2814d,seq=0xa), length 132
17:53:43.576335 IP <ip publique RAS>.4500 > <ip publique roadwarior>4500: UDP-encap: ESP(spi=0x1a87aed6,seq=0xa), length 132


3.4 Utilisation d'une CA


Cette fois-ci, nous allons autoriser tous les certificats signés par l'autorité de certification et non plus un certificat donné autosigné. Nous allons créer nous même la CA pour les besoins du test, mais ceci ne remplacera pas une vraie PKI.

Création de l'autorité de certification :
$ openssl req -x509 -days 3650 -newkey rsa:2048 -keyout caKey.pem -out caCert.pem
$ mkdir -p demoCA/newcerts/
$ touch demoCA/index.txt
$ echo "01" > demoCA/serial


Création des certificats par notre CA :
$ openssl req -newkey rsa:2048 -keyout RAS.key -out RASReq.pem
$ openssl ca -in RASReq.pem -days 365 -out RASCert.pem -notext -cert caCert.pem -keyfile caKey.pem
$ openssl req -newkey rsa:2048 -keyout Roadwarrior.key -out RoadwarriorReq.pe
$ openssl ca -in RoadwarriorReq.pem -days 365 -out RoadwarriorCert.pem -notext -cert caCert.pem -keyfile caKey.pem


Copie des certificats sur le RAS :
$ sudo cp caCert.pem /etc/ipsec.d/cacerts/
$ sudo cp RASCert.pem /etc/ipsec.d/certs/
$ sudo cp RAS.key /etc/ipsec.d/private/


De la même manière, sur le roadwarrior il faudra copier les fichiers suivants : caCert.pem, RoadwarriorCert.pem, Roadwarrior.key

Chaque serveur possède une clé privée protégée par une passphrase, nous allons indiquer à pluto de nous les demander :
$ sudo vi /etc/ipsec.secrets
: RSA /etc/ipsec.d/private/RAS.key %prompt


Il aurait été possible de mettre directement la passphrase dans pluto :
: RSA /etc/ipsec.d/private/Roadwarrior.key "passphrase super secrète"


La configuration du démon devient la suivante
config setup
	    # NAT-TRAVERSAL support
	    nat_traversal=yes

# connection definitions
conn roadwarrior-RAS
	# RW
	left=%defaultroute
	leftcert=RoadwarriorCert.pem
	# RAS
	right=<ip publique RAS>
	rightsubnet=192.168.1.0/24
	rightid="C=FR, ST=France, O=OpenStuff, CN=<fqdn du RAS>, E=<email>"
	# connection type
	type=tunnel
	auto=add


config setup
	    # NAT-TRAVERSAL support
	    nat_traversal=yes
	    virtual_private=%v4:192.168.128.0/24

# connection definitions
conn roadwarrior-RAS
	# RW
	left=%any
	leftrsasigkey=%cert
	leftid="C=FR, ST=France, O=OpenStuff, CN=*, E=*"
	leftsubnet=vhost:%no,%priv
	# RAS
	right=<ip publique RAS>
	rightsubnet=192.168.1.0/24
	rightcert=RASCert.pem
	rightnexthop=<gateway RAS>
	# connection type
	type=tunnel
	auto=add


Puis, nous relançons le démon et nous donnons la passphrase :
$ sudo /etc/init.d/ipsec restart
$ sudo ipsec auto --rereadsecrets
040 need passphrase for '/etc/ipsec.d/private/RAS.key'
Enter secret:
004 valid passphrase, private key loaded successfully


Vérification des clés: nous devons avoir la clé privée + certificat de la machine, mais aussi le CA
$ sudo ipsec auto --listall
000  
000 List of Public Keys:
000  
000 Aug 07 13:26:59 2007, 2048 RSA Key AwEAAegd8, until Aug 06 10:59:05 2008 ok
[...CERTIFICAT DE LA MACHINE...]
000  
000 List of X.509 End Certificates:
000  
000 Aug 07 13:26:59 2007, count: 1
[...CERTIFICAT DE LA MACHINE + CLE PRIVE... (pubkey:   2048 RSA Key AwEAAegd8, has private key)]
000  
000 List of X.509 CA Certificates:
000  
000 Aug 07 13:26:59 2007, count: 1
[...CERTIFICAT DU CA...]


Puis enfin, la mise en place du VPN :
$ sudo ipsec auto --up "roadwarrior-RAS"
104 "roadwarrior-RAS" #1: STATE_MAIN_I1: initiate
003 "roadwarrior-RAS" #1: received Vendor ID payload [Openswan (this version) 2.4.6  X.509-1.5.4 LDAP_V3 PLUTO_SENDS_VENDORID PLUTO_USES_KEYRR]
003 "roadwarrior-RAS" #1: received Vendor ID payload [Dead Peer Detection]
003 "roadwarrior-RAS" #1: received Vendor ID payload [RFC 3947] method set to=110 
106 "roadwarrior-RAS" #1: STATE_MAIN_I2: sent MI2, expecting MR2
003 "roadwarrior-RAS" #1: NAT-Traversal: Result using 3: i am NATed
108 "roadwarrior-RAS" #1: STATE_MAIN_I3: sent MI3, expecting MR3
004 "roadwarrior-RAS" #1: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_RSA_SIG cipher=oakley_3des_cbc_192 prf=oakley_md5 group=modp1536}
117 "roadwarrior-RAS" #2: STATE_QUICK_I1: initiate
004 "roadwarrior-RAS" #2: STATE_QUICK_I2: sent QI2, IPsec SA established {ESP=>0x1a751514 <0xd7d4da8e xfrm=AES_0-HMAC_SHA1 NATD=88.171.141.210:4500 DPD=none}


Si vous relancez un ipsec auto --listall, vous allez voir que le certificat de l'autre machine est apparu dans la partie List of Public Keys.
Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki
Page was generated in 0.0895 seconds