Outils pour utilisateurs

Outils du site


brouillon_ipsec

Ceci est une ancienne révision du document !


IPsec

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 authentifiée et/ou chiffrée: 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” … Mais c'est aussi “racoon” …

Voir 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

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 .

PC-A veut mettre en tunnel le réseau: 192.168.0.0/24
PC-B veut mettre en tunnel le réseau: 192.168.1.0/24

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…

avec IKE

ou plutot, avec racoon.

En fait, il faut juste laisser les politiques, et supprimer les protocoles souhaités.

Et bien sur, démarrer racoon

Voila.

Tips

iptables

$IPTABLES -A INPUT -i eth0 -p esp -j ACCEPT                    ; # ESP (ou -p 50)
$IPTABLES -A INPUT -i eth0 -p ah -j ACCEPT                     ; # AH (ou -p 51)
$IPTABLES -A INPUT -i eth0 -p udp --dport 500 -j ACCEPT        ; # pour IKE/racoon/pluto

Faire des bizarreries, comme autoriser les IP locales (192.168/16 10/8…) a voyager vers Internet… (sans oublier qu'en fait, ca passe par un tunnel!)

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)

Openswan

Lien: http://wiki.debian.org/HowTo/openswan

Malgré tout les tutorials, aucun ne fonctionne comme voulu.

Donc, j'abadonne openswan

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
brouillon_ipsec.1246321167.txt.gz · Dernière modification : 2009/06/30 00:19 de thierry