VPN Site à Site Cisco – Linux


Attention, cet article est ancien de 17 ans. Les versions systèmes / de logiciels / sites évoqués ont forcément évolués depuis. Merci de garder cette ancienneté en tête pendant votre lecture.

La gestion d’IPSEC par le noyau de linux, permet encore une fois de plus d’inclure linux comme solution viable dans le monde des réseaux, en tant que routeur IPSEC. Gràce à l’utilisationde linux, on peut faire grandement baisser les coûts en utilisan, par exemple, des serveurs dédiés à bas prix sous linux, pour en faire un point centralisant les connexions vpn.

Architecture

Nous utiliseraont le schéma suivant pour l’article :

vpn-cisco-linux

Le but de l’article est de créer un tunnel IPSEC entre le routeur cisco et le serveur linux, afin que les deux réseau locaux puissent
communiquer entre eux demanière tranparante.

Principe

De part la nature même de la gestion d’ipsec, que se soit en Cisco ou en Linux, les 2 routeurs n’auront pas d’interfaces virtuelles
pour symboliser ce tunnel.

pour diriger ce trafic corectemetn vers le tunnel, nous auront donc :

Sous Linux :

– Une route vers le réseau distant, pointant vers l’interface internet, mais qui sera en réalité dirigé
vers le tunnel (création automaique de la route par Openswan).

En cisco

– Une Access List, sélectionnant le trafic intérrésant sur l’interface internet, pour le faire passer vers le tunnel

Vous l’auez compris en lisant ces lignes, le principal, inconvénient d’IPSEC, est qu’a l’utilisation, on ne peut pas se fier uniquement
à la table routage pour faire des vérifiquation rapides (en cisco ou sous linux).

Machine Linux

Installation d’Openswan

Vous aurez besoin des fonctionnalistés IPSEC du noyau linux, pour cela, compilez les modules suivants :

Networking -> Networking Options
        (M) PF_KEY sockets
        (M) IP: AH transformations
        (M) IP: ESP transformations
        (M) IP: IPComp transformations
        (M) IP: tunnel transformations
        (M) IPsec user configuration interface

puis chargez les :

linux# modprobe af_key
linux# modprobe ah4
linux# modprobe esp4
linux# modprobe ipcomp
linux# modprobe xfrm4_tunnel
linux# modprobe xfrm_user

Vous pouvez maintenant lancer l’installation d’Openswan (ici pour gentoo) :

linux# emerge -a openswan ipsec-tools

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R   ] net-misc/openswan-2.4.4
[ebuild   R   ] net-firewall/ipsec-tools-0.6.3

Would you like to merge these packages? [Yes/No]

Verifiez qu’Openswan démmare correctement , en démarrant le service, puis en éxecutant la commande « ipsec verify » :

linux# /etc/init.d/ipsec start
 * Starting IPSEC ... ...
ipsec_setup: Starting Openswan IPsec 2.4.4...                       [ ok ]
linux# 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.4/K2.6.17-gentoo-r8 (netkey)
Checking for IPsec support in kernel                            [OK]
Checking for RSA private key (/etc/ipsec/ipsec.secrets)         [FAILED]
ipsec showhostkey: no default key in "/etc/ipsec/ipsec.secrets"
Checking that pluto is running                                  [OK]
Two or more interfaces found, checking IP forwarding            [OK]
Checking NAT and MASQUERADEing                                  [OK]
Checking for 'ip' command                                       [OK]
Checking for 'iptables' command                                 [OK]
Checking for 'setkey' command for NETKEY IPsec stack support    [OK]
Opportunistic Encryption Support                                [DISABLED]

– L’absence de clef RSA n’est pas important pour nous, puisque nous utiliseront des clefs pré-partagées.

– l’Opportunistic Encryption, et désactivé par défaut et doit le rester. Ul s’agit d’un protocol (interne aux porjets linux *swan), facilitant les création des tunnels..

ipsec.conf

Une des particulatirés (notament par rapport aux configurationde type Cisco), est que l’on parle d’hote « left » et « right ».

– l’hôte « left » est la machine linux elle même

– l’hôte « right » est la machine à l’autre bout du tunnel (en l’occurence le routeur cisco).

la configuration d’Openswan se trouve dans /etc/ipsec/ipsec.conf :

(on notera au passage qu’un maximumu d’informations sont dnas les parties « communes », afin de permets dajouter facielemtn de nouveaux tunnels).

# Openswan IPsec configuration file
version 2.0     # conforms to second version of ipsec.conf specification

config setup
        plutodebug = "all"
        klipsdebug = "all"
Pluto et Klips sont les partie IKE et IPSEC, l’option « all » nous permet d’avoir toutes les informations
nécéssaires pour debuger la config. une fois celle ci fonctionnelle, on pourra la remplacer par l’option « none »
        interfaces = %defaultroute
Utilise l’interface avec la route par défaut pour y joindre IPSEC
        uniqueids = yes
force la regénération de toutes les Asssociations de sécurité (SA) lorque la connexion est perdue
conn %default
défini les paramètres par défaut des toutes les connexions
        type = tunnel
        authby = secret
transport des paquets en mode tunnel, avec authentification de type clef pré-partagé.
        ike = 3des-sha1-modp1024
        esp = 3des-md5-96
configuration du cryptage pour les phases IKE et pour le tunnel IPSEC (attention, il faut
être cohérent avec la configuration appliéqu à l’autre pour tu tuunel!)
        pfs = no
désativation du « Perfect Forward Secrecy » (activé par defaut sinon)
        auto = add
la connexion est chargé automatiquement
        left = 82.1.1.1
IP de la machine linux
        leftid = @linux.vpnciscolinux.kimengumi.fr
Nom (dns) de la machine linux
        leftsubnet = 172.16.1.0/24
Résau local connecté à la machine linux
conn vpnlinuxcisco
Nom de connexion utilisé pour désigner le tunnel
        right = 82.2.2.2
IP du routeur Cisco
        rightid = @cisco.vpnciscolinux.kimengumi.fr
Nom (dns) du routeur Cisco
        rightsubnet = 172.16.2.0/24
Résau local connecté au routeur Cisco
#Disable Opportunistic Encryption
include /etc/ipsec/ipsec.d/examples/no_oe.conf

ipsec.secrets

Les clefs pré-partagés sont stockés dans le fichies /etc/ipsec/ipsec.secrets

La syntaxe de chaque ligne, pour un utilisation avec vérification des noms est:

@[nom (dns) du site 1] @[nom (dns) du site 2] : PSK « [clef pré-partagé] »

#  /etc/ipsec/ipsec.secrets
@linux.vpnciscolinux.kimengumi.fr @cisco.vpnciscolinux.kimengumi.fr : PSK "###MaClef###"

Firewall

Pensez bien a autoriser, à la fois le trafic venant du tunnel, ainsi que celui nécéssaire pour le créer

iptables -A INPUT -j ACCEPT -i eth0 -s 172.16.2.0/24
iptables -A INPUT -j ACCEPT -i eth0 -p udp -s 82.2.2.2 --sport isakmp --dport isakmp
iptables -A INPUT -j ACCEPT -i eth0 -p esp -s 82.2.2.2

Routeur Cisco

La configuration ressemble fortement à celle d’un VPN site à site cisco-cisco.à ceci près :

le tunnel GRE disparait, on sélectionne directement le trafic à crypter via une acces liste sur l’interface
de la route par défaut, pour le crypter et l’envoyer dans le tunnel.

Le tunnel sera alors complètement invisible pour la table de routge (sh ip route), le trafic étant « ponctionné » sur la route par défaut.

Configuration du routeur

hostname cisco
ip domain name kimengumi.net

Il est capitale que ces champs soient renseigné correctemetn car il sont utilisés pour l’authentification.
crypto isakmp policy 1
 encr 3des
 authentication pre-share
 group 2

correspond à la négocaitaion « ike = 3des-sha1-modp1024 » d’Openswan.
3des -> 3dessha implicite en cisco -> sha1group 2 -> modp1024
crypto isakmp key ###MaClef### address 82.1.1.1
crypto isakmp identity hostname

Clef prépartagé, utilisation du nom d’hote dans l’identification (implicite dans openswan)
crypto ipsec transform-set transf3des esp-3des esp-md5-hmac

Cryptage IPSEC, correspond à « esp = 3des-md5-96 » dans openswan
crypto map cryptvpn 1 ipsec-isakmp
 set peer 82.1.1.1
 set transform-set transf3des
 match address cryptverslinux

Association des différents clefs, cryptages, et traffic, dans une carte de cryptage
interface Ethernet0
 ip address 82.2.2.2 255.255.255.0
 ip access-group netin in
 ip nat outside
 crypto map cryptvpn

Association de la carte de cryptage à l’interface de la route par défaut
ip access-list extended cryptverslinux
 permit ip 172.16.2.0 0.0.0.255 172.16.1.0 0.0.0.255

Sélection du traffic a faire passer par le tunnel, et non sur internet.
ip access-list extended natlist
 deny   ip 172.16.2.0 0.0.255.255 172.16.1.0 0.0.0.255
 permit ip 172.16.2.0 0.0.0.255 any

SI il y a du NAT : La règle de NAT étant appliqué avant celle du tunnel, il faut rejeter le trafic dans le NAT
ip access-list extended netin
	(...)
 permit udp host 88.1.1.1 eq isakmp host 82.2.2.2 eq isakmp
 permit esp host 88.1.1.1 host 82.2.2.2

on autorise les protocles nécéssaires au bon fonctionnement d’IPSEC et ISAKMP

Tests et Diagnostiques

plusieurs outils sont disponibles en cisco et en linux :

Outils Cisco

Les commandes permettant de vérifier les status du vpn et de débuger sont :

cisco#show crypto isakmp sa
dst             src             state          conn-id slot status
82.2.2.2   81.1.1.1    QM_IDLE            118    0 ACTIVE

Permet de voir les associations de Sécurité (SA)
cisco#show crypto ipsec sa

interface: Ethernet0
    Crypto map tag: cryptvpn, local addr 82.2.2.2

   protected vrf: (none)
   local  ident (addr/mask/prot/port): (172.16.2.0/255.255.255.0/0/0)
   remote ident (addr/mask/prot/port): (172.16.1.0/255.255.0.0/0/0)
   current_peer 81.1.1.1 port 500
   local crypto endpt.: 82.2.2.2, remote crypto endpt.: 81.1.1.1
	(...)
     inbound esp sas:
        transform: esp-3des esp-md5-hmac ,
        in use settings ={Tunnel, }
        Status: ACTIVE
	(...)
     outbound esp sas:
        transform: esp-3des esp-md5-hmac ,
        in use settings ={Tunnel, }
        Status: ACTIVE
	(...)

Affiche l’état détailé des tunnel
cisco#  show crypto engine connection active

  ID Interface            IP-Address      State  Algorithm           Encrypt  Decrypt
 118 Ethernet0            82.2.2.2   set    HMAC_SHA+3DES_56_C        0        0
2005 Ethernet0            82.2.2.2   set    3DES+MD5                  0      526
2008 Ethernet0            82.2.2.2   set    3DES+MD5                540        0

Affiche les cryptages actifs des tunnel
cisco#debug crypto isakmp
Crypto ISAKMP debugging is on
cisco#debug crypto ipsec
Crypto IPSEC debugging is on

Permttent d’avoir toutes les étapes en cours de réalisation (logs trop long pour êtres mis en exemple)

Outils Linux

la commande « ipsec auto –verbose –up nom.de.la.connexion » permet de forcer l’initalisation d’un connexion avec affichage des étaoes à l’écran.

# ipsec auto --verbose --up vpnlinuxcisco
002 "vpnlinuxcisco" #11: initiating Quick Mode PSK+ENCRYPT+TUNNEL+UP {using isakmp#8}
117 "vpnlinuxcisco" #11: STATE_QUICK_I1: initiate
003 "vpnlinuxcisco" #11: ignoring informational payload, type IPSEC_RESPONDER_LIFETIME
002 "vpnlinuxcisco" #11: transition from state STATE_QUICK_I1 to state STATE_QUICK_I2
004 "vpnlinuxcisco" #11: STATE_QUICK_I2: sent QI2, IPsec SA established {ESP=>(...) xfrm=3DES_0-HMAC_MD5 }

Si vous avez gardé les options plutodebug = « all » et klipsdebug = « all » vous aurres accès au menen infos via Sysylog (ou autre).

Si vous faites un « ip route » , vous remarquez sans doute que le réseau distant est marqué directement sur l’intefrcae ethernet, cecia est normal,
les interfaces ipsec n’aparaissant pas dans les noyaux 2.6.

# ip route
82.1.1.0/24 dev eth0  proto kernel  scope link  src 82.1.1.1
172.16.2.0/24 dev eth0  scope link
172.16.1.0/24 dev eth1  proto kernel  scope link  src 172.16.1.254
127.0.0.0/8 dev lo  scope link
default via 88.1.1.254 dev eth0

Note sur le ping depuis Linux/Cisco

Si l’on fait un ping vers un des deux réseau locaux depuis le routeur de l’autre résau, le ping ne passera pas, car il utilise par défaut son interface
externe. Pensez donc bien à forcer le ping depuis l’interface locale, lorsque vous pignez depuis la machine linux ou le routeur cisco.

– depuis Cisco :

cisco#ping 172.16.1.254
Sending 5, 100-byte ICMP Echos to 172.16.1.254, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)

cisco#ping 172.16.1.254 source 172.16.2.254
Sending 5, 100-byte ICMP Echos to 172.16.1.254, timeout is 2 seconds:
Packet sent with a source address of 172.16.2.254
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 48/52/64 ms

– depuis Linux :

# ping 172.16.2.254 -c4
PING 172.16.2.254 (172.16.2.254) 56(84) bytes of data.-
4 packets transmitted, 0 received, 100% packet loss, time 3010ms

# ping 172.16.2.254 -I 172.16.1.254 -c4
PING 172.16.2.254 (172.16.2.254) from 172.16.1.254 : 56(84) bytes of data.
64 bytes from 172.16.2.254: icmp_seq=1 ttl=255 time=43.9 ms
64 bytes from 172.16.2.254: icmp_seq=2 ttl=255 time=43.3 ms
64 bytes from 172.16.2.254: icmp_seq=3 ttl=255 time=43.1 ms
64 bytes from 172.16.2.254: icmp_seq=4 ttl=255 time=43.0 ms
4 packets transmitted, 4 received, 0% packet loss, time 2999ms

Pour finir

IPSEC permet relativement facilement de faire communiquer des routeurs de marques et d’origines différnetes entre eux.
Il a aussi l’avantage d’être plus réactifs que d’autres protocoles de cryptages propriétaire (ou libres).

Malheuresement, Il rends plus ardue le routage, en ne permettant pas d’être vu directement comme un interface virtuelle.

, , ,

Les commentaires sont fermés.