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 :
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"
nécéssaires pour debuger la config. une fois celle ci fonctionnelle, on pourra la remplacer par l’option « none »
interfaces = %defaultroute
uniqueids = yes
conn %default
type = tunnel authby = secret
ike = 3des-sha1-modp1024 esp = 3des-md5-96
être cohérent avec la configuration appliéqu à l’autre pour tu tuunel!)
pfs = no
auto = add
left = 82.1.1.1
leftid = @linux.vpnciscolinux.kimengumi.fr
leftsubnet = 172.16.1.0/24
conn vpnlinuxcisco
right = 82.2.2.2
rightid = @cisco.vpnciscolinux.kimengumi.fr
rightsubnet = 172.16.2.0/24
#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.