Ceci est une ancienne révision du document !
Table des matières
IPsec
Même chose que OpenVPN, mais differement…
Liens:
- ipsec-tools
- openswan
- strongswan
les bases
IPsec permet 2 choses:
- authentification des connexions
- chiffrements des connexions
Son fonctionnement est au niveau de la couche 3 , donc IP .
C'est a dire que les applications n'ont pas conscience que l'IP utilisé est chiffré: c'est transparent.
Protocoles:
- AH = Authentification Header
- ESP = Encapsulating Security Payload
Authentification (AH) | permet d'être sur que c'est bien l'IP qui a composé le message, et qu'il n'a pas été modifié |
Chiffrement (ESP) | permet de garantir que personne (sauf le destinataire) ne peut décrypter le contenu |
2 modes de fonctionnement:
- transport : authentifier/chiffrer les communications entre 2 IP (public ou local)
- tunnel : authentifier/chiffer un tunnel entre 2 LAN
pluto
: c'est “ike” … package ike-scan
ipsec-tools
Lien: http://www.linuxplusvalue.be/mylpv.php?id=179
Soit un “PC-A” avec une IP publique “IP-A” |
Soit un “PC-B” avec une IP publique “IP-B” |
Avec IPSEC, il faut commencer par les bases…
# aptitude install ipsec-tools
Sens unique
On va configurer l'authentification et le chiffrement dans un sens uniquement, du PC-A vers PC-B.
Sur PC-A , editer, /etc/ipsec-tools.conf
afin d'avoir:
flush; spdflush; # Associations # (le comment faire) # ----------------- # authentification IP-A -> IP-B add <IP-A> <IP-B> ah 15700 -A hmac-md5 "1234567890123456"; add <IP-A> <IP-B> esp 15701 -E 3des-cbc "123456789012123456789012"; spdadd <IP-A> <IP-B> any -P out ipsec esp/transport//require ah/transport//require;
Le mieux:
# /etc/init.d/setkey restart
Le possible, mais a eviter:
# /etc/ipsec-tools.conf
Un premier test:
$ ping <IP-B>
Et tcpdump retourne:
IP-A > IP-B: AH(spi=0x00003d54,seq=0x8): ESP(spi=0x00003d55,seq=0x8), length 88 ...
Ce qui veut dire que la couche IP vers IP-B est authentifié et chiffré.
mais PC-A et PC-B ne peuvent plus communiquer ! |
On va juste mettre les “associations” pour que PC-B puisse decoder et répondre…
Sur PC-B, editer /etc/ipsec-tools.conf
afin d'avoir:
flush; spdflush; # authentification IP-A -> IP-B add <IP-A> <IP-B> ah 15700 -A hmac-md5 "1234567890123456"; add <IP-A> <IP-B> esp 15701 -E 3des-cbc "123456789012123456789012";
Et voila!
C'est authentifié et chiffré de PC-A vers PC-B.
C'est sans sécurité de PC-B vers PC-A.
Et maintenant, les 2 PC se voient !
PC-B communique sans authentification et chiffrement ! |
2 sens
PC-A:
# authentification IP-A -> IP-B add <IP-A> <IP-B> ah 15700 -A hmac-md5 "1234567890123456"; # authentification IP-B -> IP-A add <IP-B> <IP-A> ah 24500 -A hmac-md5 "1234567890123456"; # chiffrement IP-A -> IP-B add <IP-A> <IP-B> esp 15701 -E 3des-cbc "123456789012123456789012"; # chiffrement IP-A -> IP-B add <IP-B> <IP-A> esp 24501 -E 3des-cbc "123456789012123456789012"; # Politique de securité (SP) # (le quand faire) # --------------------------- spdadd <IP-A> <IP-B> any -P out ipsec esp/transport//require ah/transport//require; spdadd <IP-B> <IP-A> any -P in ipsec esp/transport//require ah/transport//require;
# /etc/init.d/setkey restart
PC-B, il faut juste changer la “politique”:
... # Politique de securité (SP) # (le quand faire) # --------------------------- spdadd <IP-B> <IP-A> any -P out ipsec esp/transport//require ah/transport//require; spdadd <IP-A> <IP-B> any -P in ipsec esp/transport//require ah/transport//require;
# /etc/init.d/setkey restart
Voila, les communications sont authentifiés et chiffrés dans les 2 sens.
IKE
Lien: http://www.linuxplusvalue.be/mylpv.php?id=178
IKE permet d'avoir une gestion des clés plus souple, avec regénération de nouvelles clés.
Donc, c'est vachement mieux.
IKE vient avec “racoon” … ouai, c'est super clair.
IKE vient avec Racoon.
Installer
# aptitude install racoon
Configurer
En partant de l'exemple ci-dessus.
On reprend les mêmes configurations, sauf qu'on ne garde que la “politique de sécurité” (donc, on vire ce qui concerne les clés).
Ceci, parce ce que c'est IKE, euh, Racoon qui gère les clés maitenant.
Donc, le PC-A a pour config:
flush; spdflush; # Politique de securité (SP) # (le quand faire) # --------------------------- spdadd <IP-A> <IP-B> any -P out ipsec esp/transport//require ah/transport//require; spdadd <IP-B> <IP-A> any -P in ipsec esp/transport//require ah/transport//require;
# /etc/init.d/setkey restart
Alors que PC-B a pour config, sa symetrique: PC-B, il faut juste changer la “politique”:
flush; spdflush; # Politique de securité (SP) # (le quand faire) # --------------------------- spdadd <IP-B> <IP-A> any -P out ipsec esp/transport//require ah/transport//require; spdadd <IP-A> <IP-B> any -P in ipsec esp/transport//require ah/transport//require;
# /etc/init.d/setkey restart
Racoon
Mettre les clés partagés dans:
/etc/racoon/psk.txt
Pour PC-A :
IP-B password2
Pour PC-B :
IP-A password2
Et faire en sorte d'avoir dasn /etc/racoon/racoon.conf
:
remote anonymous { exchange_mode main,aggressive; # TJ ------ doi ipsec_doi; my_identifier address; lifetime time 2 min; initial_contact on; proposal_check obey; # --------- proposal { encryption_algorithm 3des; hash_algorithm sha1; authentication_method pre_shared_key; dh_group modp1024; } generate_policy off; } sainfo anonymous { pfs_group modp768; #pfs_group 1; lifetime time 2 min; encryption_algorithm 3des; #authentication_algorithm hmac_md5; authentication_algorithm hmac_sha1; compression_algorithm deflate; }
Et puis, sur les 2 PC:
# /etc/init.d/racoon restart
Test
Ca devrait pinguer.
Il doit y avoir de bonne chose dans les logs.
Et setkey -D
retourne de belles infos.
Firewall
Autoriser le protocole “udp” avec le port “500” pour que “IKE/racoon” soit heureux.
Help
algo dispo
$ man setkey
setkey
Afficher les SA
# setkey -D
Afficher les SDP
# setkey -DP
Je cherche encore a comprendre…
Tunnel
Liens:
au putain
LAN-2-LAN
Aprés de tréééééés longues recherches, voici ce que j'ai compris:
le tunnel ne fonctionne que pour les IP LAN-2-LAN |
En clair, si vous voulez entrer dans le tunnel, il faut que l'IP source et destination appartiennent au tunnel !
Aucun routage ne pourra être forcé dans le tunnel.
forward
Il faut autoriser le Forward…
# echo "1" > /proc/sys/net/ipv4/ip_forward
simple
Liens:
On va faire un tunnel trés simple sans racoon .
Donc, si nécessaire, faire d'abord:
# /etc/init.d/racoon stop
Sur PC-A, editer /etc/ipsec-tools.conf
afin d'avoir:
flush; spdflush; add <IP-A> <IP-B> esp 34501 -m tunnel -E 3des-cbc "123456789012123456789012"; add <IP-B> <IP-A> esp 34502 -m tunnel -E 3des-cbc "123456789012123456789012"; # Tunnel # PC-A -> PC-B spdadd 192.168.0.0/24 192.168.1.0/24 any -P out ipsec esp/tunnel/<IP-A>-<IP-B>/require; # PC-A <- PC-B spdadd 192.168.1.0/24 192.168.0.0/24 any -P in ipsec esp/tunnel/<IP-B>-<IP-A>/require;
Et puis:
# /etc/init.d/setkey restart
Maintenant sur PC-B, editer /etc/ipsec-tools.conf
afin d'avoir:
flush; spdflush; add <IP-A> <IP-B> esp 34501 -m tunnel -E 3des-cbc "123456789012123456789012"; add <IP-B> <IP-A> esp 34502 -m tunnel -E 3des-cbc "123456789012123456789012"; # Tunnel # PC-B -> PC-A spdadd 192.168.1.0/24 192.168.0.0/24 any -P out ipsec esp/tunnel/<IP-B>-<IP-A>/require; # PC-B <- PC-A spdadd 192.168.0.0/24 192.168.1.0/24 any -P in ipsec esp/tunnel/<IP-A>-<IP-B>/require;
Et puis:
# /etc/init.d/setkey restart
Pour tester, c'est plus compliqué:
- il faut que l'IP source soit dans l'un des LAN, et que l'IP destinataire soit dans l'un des autres LAN.
- il faut activer le forward entre interface (si on fait un test a partir d'un autre poste)
- il faut autoriser le firewall a balancer des IP local sur le WAN !
Soit le cas de figure suivant:
- PC-A a une IP 192.168.0.x
- PC-B a une IP 192.168.1.y
Alors on peut faire:
# nc -s 192.168.0.x 192.168.1.y 22 SSH-2.0-OpenSSH_5.1p1 Debian-5
Dans le genre bizarre, il a fallut autoriser (vite fait) le firewall avec un règle comme cela:
$IPTABLES -A INPUT -i $WAN_IF -d 192.168.0.0/16 -s 192.168.0.0/16 -j ACCEPT
Et oui: du WAN arrive des IP locales…
LAN-2-LAN
Test sur le même LAN
exemple
Soit 2 becannes sur le même LAN, mais souhaitant partagé “secretement” un reseau …
PC-A (“serveur”) : IP: 172.16.0.33 LAN SECRET: 192.168.50/24
PC-B (“client”) : IP: 172.16.0.39 LAN SECRET: aucun
Sur PC-A:
# cat /etc/ipsec.secrets 172.16.0.33 172.16.0.39 : PSK "le_mot_de_passe_secret" # cat /etc/ipsec.conf version 2.0 # conforms to second version of ipsec.conf specification config setup nhelpers=0 conn mynet authby=secret left=172.16.0.33 leftsubnet=192.168.50.0/24 right=172.16.0.39 auto=start include /etc/ipsec.d/examples/no_oe.conf
Copier ipsec.secrets
et ipsec.conf
sur le “PC_B”.
Inverser les IP dans le fichier ipsec.secrets
, afin d'avoir:
172.16.0.39 172.16.0.33 : PSK "le_mot_de_passe_secret"
Puis, sur chacun des PC:
# /etc/init.d/ipsec start (ou restart)
Un test montre que les requetes ARP passent aussi !?
explications
(sous réserve d'avoir bien compris!)
- “left” : c'est “soi-même”, ou plus exactement: l'IP a gauche dans
ipsec.secrets
. - “leftnexthop” : c'est la gateway . Par defaut: “%direct” ( On peut mettre aussi “%defaultroute” )
- “leftsubnet” : le reseau a partager
- “right” : c'est l'autre
Les 2 ne sont pas obligés de partager…
pluto
# cat /var/log/syslog | grep pluto Jun 24 11:43:29 xxxxxx ipsec__plutorun: 104 "mynet" #1: STATE_MAIN_I1: initiate Jun 24 11:43:29 xxxxxx ipsec__plutorun: ...could not start conn "mynet"
ike-scan
# aptitude install ike-scan # /etc/init.d/ipsec stop # ike-scan -M 172.16.0.33 Starting ike-scan 1.9 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/) 172.16.0.33 Main Mode Handshake returned HDR=(CKY-R=46746e295468b2d5) SA=(Enc=3DES Hash=SHA1 Auth=PSK Group=2:modp1024 LifeType=Seconds LifeDuration(4)=0x00007080) VID=4f45606c50487c5662707575 VID=afcad71368a1f1c96b8696fc77570100 (Dead Peer Detection v1.0)
Test sur 2 IP Public
Faire partager un reseau local, entre 2 IP public.
conf
“IP_PUBLIC_20” et “IP_PUBLIC_15” sont a remplacer respectivement par les IP public.
Sur “PUBLIC_20”:
# cat ipsec.secrets IP_PUBLIC_20 IP_PUBLIC_15 : PSK "le_mot_de_passe_secret"
# cat ipsec.conf version 2.0 # conforms to second version of ipsec.conf specification config setup nat_traversal=yes nhelpers=0 conn mynet authby=secret left=IP_PUBLIC_20 leftsubnet=192.168.1.0/24 leftnexthop=IP_PUBLIC_15 right=IP_PUBLIC_15 rightnexthop=IP_PUBLIC_20 auto=start include /etc/ipsec.d/examples/no_oe.conf
Sur IP_PUBLIC_15 :
(Simple inversion)
# cat ipsec.secrets IP_PUBLIC_15 IP_PUBLIC_20 : PSK "le_mot_de_passe_secret"
Et “ipsec.conf” identique.
detaillons
Au niveau IP, c'est un peu étrange…
Sur IP_PUBLIC_A :
# route -n Table de routage IP du noyau Destination Passerelle Genmask Indic Metric Ref Use Iface IP_PUBLIC_15 0.0.0.0 255.255.255.255 UH 0 0 0 eth0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 ...
Sur IP_PUBLIC_B :
# route -n Table de routage IP du noyau Destination Passerelle Genmask Indic Metric Ref Use Iface 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 ...
Au niveau du firewall IP_PUBLIC_A :
WAN_IF=eth0 WIFI_IF=eth1 # ipsec test
$IPTABLES -A INPUT -i $WAN_IF -p 50 -s IP_PUBLIC_15 -j ACCEPT ; # ESP $IPTABLES -A INPUT -i $WAN_IF -p 51 -s IP_PUBLIC_15 -j ACCEPT ; # AH $IPTABLES -A INPUT -i $WAN_IF -s IP_PUBLIC_15 -d 192.168.1.0/24 -j ACCEPT $IPTABLES -A OUTPUT -o $WAN_IF -d IP_PUBLIC_15 -s 192.168.1.0/24 -j ACCEPT $IPTABLES -A FORWARD -i $WAN_IF -o $WIFI_IF -j ACCEPT $IPTABLES -A FORWARD -i $WIFI_IF -o $WAN_IF -j ACCEPT