Mise en place d'un VPN

FreeS/WAN : http://www.freeswan.org
OpenVPN : http://openvpn.sourceforge.net

Avertissement:
Ce document ne se veut pas être une fidèle traduction des documentation disponibles sur les sites ci-dessus, mais une simple adaptation de celles-ci agrémentées de quelques points qui pourraient poser problème.

 

Introduction :

FreeS/WAN et openVPN sont 2 VPNs intéressants pour des raisons bien différentes: le premier va être implémenté dans la future version d'IPV6, le second est très facile à mettre en place. Nous verrons ici comment réaliser une connexion en mode tunnel pour ces 2 logiciels!

FreeS/WAN

http://www.freeswan.org
(man et HOWTO détaillé présents sur le site)

Philosophie:
FreeS/WAN fonctionne, dans le mode tunnel grace a 2 serveurs présents aux 2 extrémités des 2 sous reseaux à relier.
Ces 2 serveurs nécessitent la même configuration de FreeS/WAN pour fonctionner (Cf fichier /etc/ipsec.conf) mais utilisé de façon symétrique.
Les serveurs se servent d'une interface ipsec (il peut y en avoir 4), alias d'une interface standard (eth0). Interface par laquelle vont transiter les informations cryptées.
Cette interface ipsec est obtenu lors de la recompilation du noyau avec le patch de FreeS/WAN.
Dans notre cas de tunnel, nous allons utiliser une authentification RSA, avec comparaison des clés aux 2 extrémités du vpn.

Prerequis:
- les sources du noyau afin les patcher et ainsi pouvoir utiliser FreeS/WAN (repertoire d'install sur deb: /usr/src)
- ssh pour le transfert de certains fichiers
Les 2 machines qui vont être reliées afin de créer le VPN seront représentées par la suite comme les machines left [L] ou right [R].

Mise en place sous debian:
* A gauche:
Installation/lancement du patch freeswan (kernel-patch-freeswan)
[L]# dselect (patch freeswan, sources noyau + dependances)
[L]# cp /usr/src/kernel-patches/all/apply/freeswan /usr/src/linux/
[L]# /usr/src/linux/freeswan
Recompilation du noyau
[L]# make config (menuconfig)
(choix des options de compilation laissé à vos soins, neanmoins:
CONFIG_IPSEC=y       (rubrique networking)
CONFIG_IPSEC_IPIP=y
CONFIG_IPSEC_AH=y

CONFIG_IPSEC_AUTH_HMAC_MD5=y
CONFIG_IPSEC_AUTH_HMAC_SHA1=y
CONFIG_IPSEC_ESP=y
CONFIG_IPSEC_ENC_3DES=y
CONFIG_IPSEC_EXT=y
CONFIG_IPSEC_IPCOMP=y
CONFIG_IPSEC_DEBUG=y)
[L]# make clean; make bzImage (make modules; make modules_install #optionnels)
Mise en place de Lilo (ou GRUB)
[L]# cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-fs
Modification de /etc/lilo.conf (menu.lst pour grub)
[L]# lilo
[L]# reboot

Installation/Configuration de FreeS/WAN
[L]# dselect (FreeS/WAN et toutes ses dépendances)
	\-> génération des clés et certificats (Cf répertoire /etc/ipsec.d/)
Création de la clé publique d'échange
[L]# ipsec rsasigkey --verbose 2048 > /root/clef-fs
	\-> copie du contenu dans /etc/ipsec.secrets (Cf fichier plus bas)
		\-> attention à la syntaxe!!!!
Fichier de configuration /etc/ipsec.conf
	\-> (Cf fichier plus bas)
Modification du fichier /etc/network/interfaces
spoofprotect=no (fonction prise en charge par ipsec)
[L]# /etc/init.d/networking restart
* A droite - Même démarche qu'à gauche :
La seule modification réside dans le fait que la droite est considérée comme la gauche et vice versa; il faut donc intervertir les renseignements du fichier de configuration précédemment créé.
PS: ce point est étrange ! Espérons que dans les versions futures "left" et "right" seront remplacées par "my" et "other"

Désormais, les 2 serveurs sont configurés. Il ne reste plus qu'à relancer le démon ipsec sur les 2 machines du vpn. A modifier le firewall, mais il n'est pas nécessaire de rajouter des routes puisque celles-ci sont comprises dans le fichier de configuration.
Ajout de règles au niveau du firewall (Netfilter):
# On declare l'interface:
DEV_EXT="ethX" # interface du reseau vers internet
DEV_INT="ethX" # interface du reseau interne
# On fixe les regles du firewall
iptables -A INPUT -p udp -i $DEV_EXT --sport 500 --dport 500 -j ACCEPT
iptables -A OUTPUT -p udp -o $DEV_EXT --sport 500 --dport 500 -j ACCEPT
iptables -A INPUT -p 50 -i $DEV_EXT -j ACCEPT
iptables -A OUTPUT -p 50 -o $DEV_EXT -j ACCEPT
iptables -A FORWARD -d $prive -i ipsec+ -j ACCEPT
iptables -A FORWARD -s $prive -i $DEV_INT -j ACCEPT
Lancement de FreeS/WAN:
Vu que les 2 machines sont identiques, il ne reste plus qu'a lancer la commande sur un des serveurs a une des extremites:
[L|R]# ipsec auto --up nom_de_la_connexion


Ci dessous figurent les fichiers de cofiguration:
------------------------------
Fichier /etc/ipsec.conf gauche
------------------------------
# /etc/ipsec.conf - FreeS/WAN IPsec configuration file
sic configuration
config setup
        interfaces="ipsec0=eth1"
        klipsdebug=none
        plutodebug=none
        plutoload=%search
        plutostart=%search
        #       uniqueids=yes
# defaults for subsequent connection descriptions
conn %default
        keyingtries=0
        #       disablearrivalcheck=no
        authby=rsasig
        #       leftrsasigkey=%dns
        #       rightrsasigkey=%dns
# sample VPN connection
conn vpn
        left=213.41.42.86
        leftsubnet=192.168.6.0/24
        right=213.41.42.87
        rightsubnet=192.168.7.0/24
        auto=add
        leftrsasigkey=0sAQNhwSfAyL/09N84...
        rightrsasigkey=0sAQN/McvSpoKxSk/DX+P...


-----------------------------
Fichier /etc/ipsec.conf droit
-----------------------------
# /etc/ipsec.conf - FreeS/WAN IPsec configuration file
# basic configuration
config setup
        interfaces="ipsec0=eth0"
        klipsdebug=none
        plutodebug=none
        plutoload=%search
        plutostart=%search
        #       uniqueids=yes
conn %default
        keyingtries=0
        #       disablearrivalcheck=no
        authby=rsasig
        #       leftrsasigkey=%dns
        #       rightrsasigkey=%dns
conn vpn
        auto=add
        left=213.41.42.87
        leftsubnet=192.168.7.0/24
        right=213.41.42.86
        rightsubnet=192.168.6.0/24
        leftrsasigkey=0sAQN/McvSpoKxSk/DX+P...
        rightrsasigkey=0sAQNhwSfAyL/09N84...


----------------------------
Fichier /etc/ipsec.secrets g
----------------------------
: RSA   {
        # RSA 2048 bits   formation6   Mon Aug  5 10:24:38 2002
        # for signatures only, UNSAFE FOR ENCRYPTION
        #pubkey=0sAQNhwSfAyL/09N84...
        #IN KEY 0x4200 4 1 AQNhwSfAyL/09N84...
        # (0x4200 = auth-only host-level, 4 = IPSec, 1 = RSA)
        Modulus: 0x61c127c0c8bff4f4df3868a58fe7e6997719286c343b765bc
        PublicExponent: 0x03
        # everything after this point is secret
        PrivateExponent: 0x104adbf576caa8d37a8966c642a6a66ee92edc1
        Prime1: 0xa22dc9e14edc29ca16a117e7c453283eacf5f486eb1feeb02
        Prime2: 0x9a4e4f7da8e891dd95ae2d6f291dcf44b990024ba3fc51e66
        Exponent1: 0x6c1e86963492c686b9c0ba9a82e21ad4734ea3049cbff4
        Exponent2: 0x66dedfa91b45b693b91ec8f4c613df8326600187c2a836
        Coefficient: 0x2a18ba68dcb96f47f293d7a150a52536fda0fcb6cf77
        }


----------------------------
Fichier /etc/ipsec.secrets d
----------------------------
: RSA   {
        # RSA 2048 bits   debian   Mon Aug  5 10:22:32 2002
        # for signatures only, UNSAFE FOR ENCRYPTION
        #pubkey=0sAQN/McvSpoKxSk/DX+P...
        #IN KEY 0x4200 4 1 AQN/McvSpoKxSk/DX+P...
        # (0x4200 = auth-only host-level, 4 = IPSec, 1 = RSA)
        Modulus: 0x7f31cbd2a682b14a4fc35fe3e566600d62c83e6463df7da4c5
        PublicExponent: 0x03
        # everything after this point is secret
        PrivateExponent: 0x1532f74dc66b1d8c62a08ffb50e665579076b510bb
        Prime1: 0xd5d71da88a461bbce6ba2bb2cfe402372b0d7ae240344a07509
        Prime2: 0x98458529b153811b02cb8b6e4a09545172bd91ef5f3e6974a3b
        Exponent1: 0x8e8f691b06d967d3447c1d21dfed56cf7208fc96d578315a
        Exponent2: 0x6583ae1bcb8d00bcac87b24986b0e2e0f7290bf4ea299ba3
        Coefficient: 0x7288279750ebec014f827f29f736efef731faa9eefaedd
        }