Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
freebsd:ipsec_natt_roadwarrior [2007/03/30 16:20]
hotbox
freebsd:ipsec_natt_roadwarrior [2010/01/12 13:29] (current)
Line 1: Line 1:
 +====== ipsec-tools,​ NAT-Traversal et Roadwarrior ======
  
 +**ATTENTION BIP BIP**
 +
 +Il se trouve que pour les possesseurs de carte rezal bge(4), la configuration __roadwarrior__ (et pas NAT-T) fontionne mal (seulement icmp et forwarding..). J'ai pu pour le moment tester ce howto uniquement avec xe(4) et sis(4) donc des retours d'​expérience sont souhaités pour les autres chipsets.
 +
 +===== Intro =====
 +
 +Du fait de la complexité à sa mise en oeuvre[1], dans le monde du libre IPSec est souvent delaissé au profit d'​OpenVPN ou d'​autres solutions SSL plus simples à configurer.
 +Pourtant, moyennant un effort considérable de ton cerveau, tu peux arriver à faire des trucs qui rOOXOoor à l'aide d'​IPsec.
 +Notamment établir un tunnel alors que t'es derrière une gateway qui renifle le pas-bon, ou bien encore forwarder tout ton trafic sur un endroit plus sûr (et, évidemment,​ de manière cryptée).
 +
 +Mmmh je sens que je commence à t'​interesser toi, petit lutin.
 +
 +Ainsi, malgrés IPv6 qui devait arriver hier je crois, ce n'est encore pas chose faite, et il faut bien avouer que la plupart des réseaux se retrouvent NATé (nouvel adjectif grand robert) et qu'on est loin d'​avoir exorcisé NATAN (je me surpasse la).
 +
 +Heureusement pour toi lutin, le petit article qui va suivre va te permettre de réaliser tes reves les plus fous !!
 +
 +Pour simplifier les choses au maximum, voilà un petit dessin qui explique comment planter des radis dans un sol plein de prod' :
 +
 +{{ http://​zone4.gcu-squad.org/​~lesaint/​natt_bg.png }}
 +
 +Comme tu peux le remarquer, le tunnel s'​établit en faisant fi de notre passerelle "​ronfleur"​ qui est pourtant seule visible depuis l'​extérieur.
 +Cette magie, cher lutin, s'​appelle le NAT-Traversal ou natt pour les intimes..
 +
 +Enfin, en guise de dessert, et comme tu es un guerrier nomade qui combat le sale (lutinroadwarrior),​ je vais t'​enseigner l'art de te déplacer sans bouger.. un petit dessin peut-être ?
 +
 +{{ http://​zone4.gcu-squad.org/​~lesaint/​roadwarrior_bg.png }}
 +
 +Pour ceux qui mettent en doute mon talent d'​artiste,​ le but ici est de faire "comme si" notre machine se situait dans le reseau 172.16.1.0/​24
 +
 +Ca commence à faire long pour une introduction,​ mais avant de passer aux choses sérieuses..
 +
 +
 +===== Prérequis =====
 +
 +Pour rédiger cet article, j'ai utilisé uniquement des FreeBSD 6.2-STABLE, cependant :
 +
 +  * La passerelle qui sert le NAT peut etre installée sous n'​importe quel OS il faut juste s'​assurer de l'​ouverture de deux ports.
 +  * Il est possible de faire la meme chose avec Linux et NetBSD qui supportent tout deux ipsec-tools et NAT-T
 +  * Il te faut 3 machines pour être à l'aise
 +  * Il te faut déjà connaitre IPsec, son fonctionnement avec des certificats et donc savoir comment mettre en place un '​simple'​ tunnel (tu pourras faire un tour dans les références afin d'​upgrader ton cerveau).
 +
 +  * Bien entendu, les connaissances de base pour l'​utilisation avancée de ton systeme (recompilation noyau etc..) te seront demandées.
 +
 +En ce qui concerne OpenBSD, le démon frequemment utilisé s'​appelle isakmpd donc à vous de contribuer :)
 +
 +===== Echauffement des vertèbres =====
 +
 +Bien, pour commencer efficacement il te faut un système tout frais afin de s'​assurer qu'en cas de soucis tu ne te perdras pas dans un trou noir, la technique du déplacement sans bouger étant risquée.
 +
 +Alors voici le topo (reprend le petit schema 1 ca aide) :
 +
 +Sur la partie gauche nous avons 2 machines :
 +
 +  * ronfleur, qui est la passerelle / firewall blabla et qui NAT les machines situées dans le réseau 192.168.1.0/​24 dont "​chaudière"​
 +
 +        IP interface externe : 10.0.0.1 (ou n'​importe quelle ip publique)
 +        IP interface interne : 192.168.1.254/​24
 +
 +  * chaudière, qui elle aussi possède deux interfaces et qui va nous servir de tunnel ipsec end-point
 +
 +        IP interface externe : 192.168.1.200/​24
 +        IP interface interne : 192.168.2.200/​24
 +
 +Enfin sur la partie de droite nous avons une machine :
 +
 +  * cornichon, qui est à l'​autre bout du tunnel et qui possède deux interfaces
 +
 +        IP interface externe : 10.0.0.2 (même principe que pour ronfleur)
 +        IP interface interne : 172.16.0.254/​24
 +
 +Oui lutin, le but ici est de faire communiquer notre réseau 192.168.2.0/​24 avec 172.16.0.0/​24.
 +
 +Ca, c'​etait le topo general, maintenant concentrons nous sur chaque becane !
 +
 +
 +
 +===== Le dormeur doit se réveiller =====
 +
 +Commençons par le plus simple : "​ronfleur",​ dans mon cas c'est un FreeBSD 6.2 qui sert de gateway / firewall et enfin NAT pour permettre à mon reseau de communiquer avec le monde extérieur et violent. Mais cela pourrait être un linux, un NetBSD embarqué dans un grille-pain,​ cela n'a pas d'​importance et c'est bien le but !
 +Simplement, il faut s'​assurer que ton firewall laisse passer le trafic UDP sur les __ports 500__ et __4500__.
 +
 +
 +
 +===== Et que ça chauffe ! =====
 +
 +__La configuration de "​chaudière"​ et de "​cornichon"​ sera similaire dans sa partie configuration système__. Il va falloir patcher les sources du système, recompiler le tout et installer ipsec-tools comme il faut (tm).
 +
 +**IMPORTANT** !!
 +
 +Dans cet exemple, j'ai patché le système pour utiliser la pile IPSec KAME, le patch permet dorénavant aussi l'​utilisation d'​IPSEC_FAST qui, combiné avec device crypto(4) (amis possesseurs de carte hardware d'​encryption..) et, récemment, du device enc(4) permet le processing des paquets par le firewall apres décryption (comme sous OpenBSD).
 +
 +Je te laisse le soin de récupérer les sources de FreeBSD (ici avec le tag RELENG_6) et de mettre à jour l'​arbre des ports à coup de //​portsnap//​*
 +
 +Une fois ceci fait, patche ton système à l'aide de tes mimines :
 +
 +<​code>​
 +[root@chaudiere /root]# cd /​usr/​src/​sys
 +[root@chaudiere /​usr/​src/​sys]#​ fetch http://​ipsec-tools.sourceforge.net/​freebsd6-natt.diff
 +[root@chaudiere /​usr/​src/​sys]#​ patch -p0 < freebsd6-natt.diff
 +</​code>​
 +
 +Maintenant lutin, tu possèdes un système prêt à être compilé, lance vite un
 +
 +<​code>​
 +[root@chaudiere /​usr/​src/​sys]#​ cd /usr/src
 +[root@chaudiere /usr/src]# make buildworld
 +</​code>​
 +
 +Pendant ce temps (variable) tu peux aller te chercher à boire, ouvrir une nouvelle console et lancer l'​éditeur de ton choix sur le fichier de configuration de ton noyau qu'on va appeller CHAUDIERE pour changer.. Rajoute ces lignes :
 +
 +<​code>​
 +options ​               IPSEC
 +options ​               IPSEC_ESP
 +options ​               IPSEC_NAT_T
 +</​code>​
 +
 +Profites en pour faire la meme chose pour "​cornichon"​ et tu pourras déstresser :)
 +
 +Une fois ton buildworld terminé, recompile ton noyau (make kernel KERNCONF="​CHAUDIERE"​ toussa), reboot single user, mergemaster -p, make installworld,​ make delete-old et encore une fois mergemaster puis reboot final et tu auras ton système tout chaud.
 +
 +Enfin j'​espère que tu as bien preparé ton arbre des ports pour chopper la dernière version d'​ipsec-tools... Fait nous un petit
 +
 +<​code>​
 +[root@chaudiere /root]# cd /​usr/​ports/​security/​ipsec-tools
 +[root@chaudiere /​usr/​ports/​security/​ipsec-tools]#​ make config
 +</​code>​
 +
 +Et là, cher lutin, tu nous coches :
 +
 + "​DEBUG"​
 + "​IPV6"​
 + "​ADMINPORT"​
 + "​DPD"​
 + "​NATT"​
 + "​NATTF"​
 + "​FRAG"​
 + "​HYBRID"​
 +
 +Ensuite :
 +
 +<​code>​
 +[root@chaudiere /​usr/​ports/​security/​ipsec-tools]#​ make install clean
 +</​code>​
 +
 +Encore une fois, il faut faire la même pour "​cornichon"​..
 +
 +Bon, à partir de là, nous avons __sur les deux systèmes__ :
 +
 +  * Un système mis à jour en 6.2-STABLE
 +  * Un kernel patché & ready-to-use
 +  * ipsec-tools installé
 +
 +C'est presque fini, il faut juste vérifier que nous allons utiliser le bon setkey(8)
 +pour cela :
 +
 +<​code>​
 +[root@chaudiere /root]# /​usr/​local/​sbin/​setkey -V
 +setkey @(#) ipsec-tools 0.6.6 (http://​ipsec-tools.sourceforge.net)
 +</​code>​
 +
 +Si tu as une sortie similaire à celle-ci (le setkey du système ne supporte même pas -V), c'est bon signe, supprime le setkey du système qui est deprecated (situé dans /​sbin/​setkey) ou déplace le.
 +Bref, débrouille toi pour que le setkey de ipsec-tools (par défaut dans /​usr/​local/​sbin/​) soit bien utilisé au lieu de l'​autre.
 +
 +
 +
 +===== Ca fume ! =====
 +
 +Bon alors, à partir de là on se focalise sur "​chaudière"​ :
 +
 +Ici mon cher lutin, tu dois savoir que le répertoire de configuration par défaut de //racoon// se situe dans /​usr/​local/​etc/​racoon
 +
 +Dans ce même répertoire tu vas nous créer l'​arborescence suivante (respecte bien les droits) :
 +
 +<​code>​
 +drwxr-xr-x ​ 2 root  wheel   512 Mar 22 07:09 certs
 +-r-------- ​ 1 root  wheel   805 Mar 22 07:21 racoon.conf
 +
 +./certs:
 +total 8
 +lrwxr-xr-x ​ 1 root  wheel     6 Mar 22  07:21 953311cf.0 -> ca.crt
 +-r-------- ​ 1 root  wheel  1322 Mar 22  07:21 ca.crt
 +-r-------- ​ 1 root  wheel  1399 Mar 22  07:21 chaudiere.crt
 +-r-------- ​ 1 root  wheel  1679 Mar 22  07:21 chaudiere.key
 +-r-------- ​ 1 root  wheel  1391 Mar 22  07:21 cornichon.crt
 +</​code>​
 +
 +Peut-être te demandes-tu "Mais qu'​est-ce donc que ces certificats ?"
 +Lutin, je te l'ai deja dit, tu dois savoir créer toi même tes certificats x509, dans notre cas, place le certificat de "​chaudière"​ et de "​cornichon"​ dans le répertoire //certs// et places-y aussi la clef privée de "​chaudière"​.
 +Enfin ajoute le //ca.crt// qui a permit la création de ces certificats.. Pour ce qui est du lien pointant sur //ca.crt//, utilises la formule magique :
 +
 +<​code>​
 +[root@chaudiere /​usr/​local/​etc/​racoon/​certs]#​ ln -s ca.crt `openssl x509 -noout -hash -in ca.crt`.0
 +</​code>​
 +
 +Encore une fois : **ATTENTION AUX DROITS**
 +
 +Tu as placé correctement tes certificats mais tu te demandes comment remplir ton //​racoon.conf//​ ?
 +regarde ci-dessous :
 +
 +<​code>​
 +# racoon.conf natt configuration
 +# box : chaudiere (aka le client)
 +
 +path include "/​usr/​local/​etc/​racoon";​
 +path certificate "/​usr/​local/​etc/​racoon/​certs";​
 +
 +# log debug; ​ à utiliser pour le debugging
 +
 +listen
 +{
 +        isakmp 192.168.1.200[500];​ #port normal de communication IKE
 +        isakmp_natt 192.168.1.200[4500];​ #port utilisé pour le NAT-T
 +}
 + 
 +timer
 +{
 +        natt_keepalive 10 sec; #Par défaut a 20sec, on le réduit pour les essais ​
 +                               #car faible trafic
 +}
 +
 +#Phase 1
 +
 +remote 10.0.0.2
 +{
 +        exchange_mode main; #On choisit main, car plus complet
 +        my_identifier asn1dn; #La méthode d'​authentification avec certificats
 +        certificate_type x509 "​chaudiere.crt"​ "​chaudiere.key";​ #C'est parlant non !?
 +        peers_certfile x509 "​cornichon.crt";​ #Vu qu'on possède le certificat du peer,
 +                                             #on le vérifie aussi
 +        nat_traversal on; #On active le natt si disponible
 +
 +        proposal {
 +                authentication_method rsasig; #Clefs RSA
 +                encryption_algorithm aes; #Encryption AES
 +                hash_algorithm sha1; #SHA1 pour le hash
 +                dh_group 2; 1024bits
 +        }
 +
 +        proposal_check obey; #On n'​oblige pas à utiliser notre proposition par le serveur
 +}
 +
 +#Phase 2
 +
 +sainfo anonymous
 +{
 +        pfs_group 2; #​Utilisation du PFS, longueur de clef 1024
 +        lifetime time 15min; #Durée de vie du SA 15 minutes
 +        encryption_algorithm rijndael; #AES
 +        authentication_algorithm hmac_sha1, hmac_md5; #Hash SHA1 puis MD5 si non disponible
 +        compression_algorithm deflate; #​Compression
 +}
 +</​code>​
 +
 +Maintenant que ta politique est définie, il te faut déterminer les '​routes'​ IPsec, pour cela crée le fichier /​etc/​ipsec.conf
 +
 +<​code>​
 +#ipsec.conf - chaudière - NATT
 +spdadd 192.168.2.0/​24 172.16.0.0/​24 any -P out ipsec esp/​tunnel/​192.168.1.200-10.0.0.2/​require;​
 +spdadd 172.16.0.0/​24 192.168.2.0/​24 any -P in ipsec esp/​tunnel/​10.0.0.2-192.168.1.200/​require;​
 +</​code>​
 +
 +Traduction : le réseau 192.168.2.0/​24 est interconnecté avec le reseau 172.16.0.0/​24 par le tunnel ayant pour endpoints 192.168.1.200 et 10.0.0.2 (2 routes)
 +
 +Respire lutin, la configuration de chaudière est terminée..
 +
 +
 +===== *CROQUE* =====
 +
 +Passons à "​cornichon"​ :
 +
 +Pareil que pour "​chaudière",​ tu dois avoir au final cette arborescence dans ///​usr/​local/​etc/​racoon//​ :
 +
 +<​code>​
 +drwxr-xr-x ​ 2 root  wheel  512 Mar 22 08:09 certs
 +-r-------- ​ 1 root  wheel  905 Mar 22 09:57 racoon.conf
 +
 +./certs:
 +total 8
 +lrwxr-xr-x ​ 1 root  wheel    6 Mar  8 14:32 953311cf.0 -> ca.crt
 +-r-------- ​ 1 root  wheel 1322 Mar  8 14:31 ca.crt
 +-r-------- ​ 1 root  wheel 1399 Mar  8 14:30 chaudiere.crt
 +-r-------- ​ 1 root  wheel 1391 Mar  8 14:30 cornichon.crt
 +-r-------- ​ 1 root  wheel 1679 Mar  8 14:31 cornichon.key
 +</​code>​
 +
 +Tu remarqueras que jusqu'​ici c'est similaire à "​chaudière"​ (avec inversion des certificats)
 +Mais cela change pour le //​racoon.conf//​ (je commente uniquement les nouveautés) :
 +
 +<​code>​
 +# racoon.conf natt configuration
 +# box : cornichon (aka le serveur)
 +path include "/​usr/​local/​etc/​racoon";​
 +path certificate "/​usr/​local/​etc/​racoon/​certs";​
 +
 +#log debug;
 +
 +listen
 +{
 +        isakmp 10.0.0.2[500];​
 +        isakmp_natt 10.0.0.2[4500];​
 +}
 +
 +timer
 +{
 +        natt_keepalive 10 sec;
 +}
 +
 +remote 192.168.1.200
 +{
 +        exchange_mode main;
 +        my_identifier asn1dn;
 +        certificate_type x509 "​cornichon.crt"​ "​cornichon.key";​
 +        peers_certfile x509 "​chaudiere.crt";​
 +
 +        nat_traversal on;
 +        proposal_check claim; #On impose nos paramètres au client
 +        generate_policy on; #Nous ne connaissons pas les SPD par avance : 
 +                            #elles vont être générées.
 +
 +        proposal {
 +                authentication_method rsasig;
 +                encryption_algorithm aes;
 +                hash_algorithm sha1;
 +                dh_group 2;
 +        }
 +}      ​
 +
 +sainfo anonymous
 +{
 +        pfs_group 2;
 +        lifetime time 15min;
 +        encryption_algorithm rijndael;
 +        authentication_algorithm hmac_sha1, hmac_md5;
 +        compression_algorithm deflate;
 +}
 +</​code>​
 +
 +Et.. c'est tout, grâce à la règle "​generate_policy on", lutin tu économises tes doigts !
 +
 +
 +===== Ping-pong =====
 +
 +Commençons les essais lutin car tu dois être épuisé !
 +
 +Sur "​cornichon"​ :
 +
 +<​code>​
 +[root@cornichon /root]# racoon -F
 +</​code>​
 +
 +Ce qui a pour effet de démarrer //racoon// en foreground
 +
 +Sur "​chaudière"​ :
 +
 +<​code>​
 +[root@chaudiere /root]# setkey -f /​etc/​ipsec.conf
 +[root@chaudiere /root]# racoon -F
 +</​code>​
 +
 +C'est la même chose mais avec en plus la définition manuelle de la SPD définie dans ipsec.conf
 +
 +Il te reste à établir la connexion à l'aide d'un //ping// (par exemple) à partir du réseau 192.168.2.0/​24 :
 +
 +<​code>​
 +[root@pamplemousse /root]# ping 172.16.0.254
 +PING 172.16.0.254 (172.16.0.254):​ 56 data bytes
 +WARNING: pseudo-random number generator used for IPsec processing
 +64 bytes from 172.16.0.254:​ icmp_seq=17 ttl=64 time=107.365 ms
 +64 bytes from 172.16.0.254:​ icmp_seq=18 ttl=64 time=117.033 ms
 +</​code>​
 +
 +Tu devrais remarquer sur "​cornichon"​ (serveur)
 +
 +<​code>​
 +INFO: IPsec-SA established:​ ESP/Tunnel 10.0.0.1[50650]->​10.0.0.2[4500] spi=170429720(0xa288d18)
 +INFO: IPsec-SA established:​ ESP/Tunnel 10.0.0.2[4500]->​10.0.0.1[50650] spi=17723576(0x10e70b8)
 +</​code>​
 +
 +Pour la déconnexion,​ utilise sur le client :
 +
 +<​code>​
 +[root@pamplemousse /root]# /​usr/​local/​etc/​rc.d/​racoon stop && setkey -FP && setkey -Fa
 +</​code>​
 +
 +
 +===== CA MARCHPAS =====
 +
 +Connus et fréquents avec IPSec, l'​établissement de ton tunnel peut foirer pour mille et une raison.
 +Pour t'​aider tu disposes de //​setkey(8)//​ (voir le man), des options de debug de racoon (log debug ainsi que les options -d -F)
 +et bien entendu tcpdump.
 +
 +Le top du top c'est d'​avoir la main sur tout le trajet des paquets pour bien comprendre le problème.
 +
 +Mais si vraiment tu galères, n'​hésite pas à venir nous en parler sur le channel IRC
 +
 +
 +
 +===== Et le dessert ?? =====
 +
 +Ahoon lutin, ca ne te suffit pas ??
 +Tu veux devenir double zero ?
 +Tu aimes les spaghettis ?
 +
 +Alors prend ton petit dessin numero 2, oui, celui avec carotte à gauche.
 +
 +Tu remarqueras qu'ici un nouveau réseau se situe derrière cornichon, il sera utilisé comme le //​endpoint//​ de notre tunnel et nous allons le réserver aux //​roadwarriors//​ VPN.
 +A gauche, "​chaudière"​ à disparue, et te voila avec "​carotte"​ le portable aux fesses roses comme du cochon.
 +
 +Voici le topo :
 +
 +  * ronfleur, qui est la passerelle / firewall blabla et qui NAT les machines situées dans le réseau 192.168.1.0/​24 dont "​carotte"​
 +
 +        IP interface externe : 10.0.0.1 (ou n'​importe quelle ip publique)
 +        IP interface interne : 192.168.1.254/​24
 +
 +  * carotte, notre roadwarrior de combat VERT qui accède au reste du monde grâce à "​ronfleur"​ :
 +
 +        IP interface externe : 192.168.1.200/​24
 +
 +  * cornichon, qui est à l'​autre bout du tunnel et qui possède deux interfaces :
 +
 +        IP interface externe : 10.0.0.2 (même principe que pour "​ronfleur"​)
 +        IP interface interne : 172.16.0.254/​24
 +
 +Je ne parle pas du réseau 172.16.1.0/​24 qui sera virtuel (ouaaaah)
 +
 +Le but de l'​opération : bouger "​carotte"​ dans le réseau 172.16.1.0/​24 sans la déplacer physiquement dans ce même réseau (ouaaaah bis)
 +
 +Pour le reste, on va se servir des certificats mais aussi du login,​password qu'a notre utilisateur sur la machine "​cornichon"​.
 +Comment ca yen a pas ? ben il faut le créer mon lutin.. allez hop //adduser// toussa et choisi un mot de passe qui //poutr// !
 +
 +Tu te demandes à quoi cela sert ? C'est en fait nécessaire pour identifier un roadwarrior d'un autre mais tu pourrais aussi utiliser PAM, RADIUS etc...
 +
 +Dans notre cas, pour simplifier, on utilise les comptes du système ciblé.
 +
 +
 +
 +
 +===== miaam ça à l'air boooOOon =====
 +
 +Le système de "​ronfleur"​ et de "​cornichon"​ ne change pas, mais il faut configurer "​carotte"​ de la même manière que "​cornichon"​ ou "​chaudiére"​ qui peut être réemployée pour l'​occasion.
 +Oui lutin je parle bien du patch, buildworld et kernel.. ​
 +Comme j'ai la flemme de me répéter deux fois, je te laisse te debrouiller : cela ne devrait pas trop te poser de problème car tu l'as déjà fait deux fois..
 +
 +Par contre, pour la configuration de //racoon//, je te recommande de faire ceci sur "​carotte"​ :
 +
 +<​code>​
 +[root@carotte /​usr/​local/​etc/​racoon]#​ cp /​usr/​local/​share/​examples/​ipsec-tools/​roadwarrior/​client/​* .
 +</​code>​
 +
 +tu te retrouves donc après mise en place des certificats avec :
 +
 +<​code>​
 +drwxr-xr-x ​ 2 root  wheel   512 Mar 22 07:09 certs
 +-r-x------ ​ 1 root  wheel  2152 Mar 22 07:16 phase1-down.sh
 +-r-x------ ​ 1 root  wheel  2290 Mar 22 07:18 phase1-up.sh
 +-r-------- ​ 1 root  wheel   805 Mar 22 07:21 racoon.conf
 +
 +./certs:
 +total 8
 +lrwxr-xr-x ​ 1 root  wheel     6 Mar 22  07:21 953311cf.0 -> ca.crt
 +-r-------- ​ 1 root  wheel  1322 Mar 22  07:21 ca.crt
 +-r-------- ​ 1 root  wheel  1399 Mar 22  07:21 carotte.crt
 +-r-------- ​ 1 root  wheel  1679 Mar 22  07:21 carotte.key
 +</​code>​
 +
 +Cependant, un petit changement __très__ utile est à faire pour les deux scripts de phase1-* :
 +
 +phase1-up.sh :
 +
 +<​code>​
 +--- /​usr/​local/​share/​examples/​ipsec-tools/​roadwarrior/​client/​phase1-up.sh ​      Thu Mar  8 14:15:15 2007
 ++++ phase1-up.sh ​       Tue Mar 27 15:21:47 2007
 +@@ -6,6 +6,9 @@
 + ​PATH=/​bin:/​sbin:/​usr/​bin:/​usr/​sbin:/​usr/​local/​bin:/​usr/​local/​sbin
 +
 + case `uname -s` in
 ++FreeBSD)
 ++       ​DEFAULT_GW=`netstat -rn | awk '($1 == "​default"​){print $2}'`
 ++       ;;
 + ​NetBSD)
 +        DEFAULT_GW=`netstat -rn | awk '($1 == "​default"​){print $2}'`
 +        ;;
 +@@ -31,6 +34,12 @@
 + echo "​nameserver ${INTERNAL_DNS4}"​ >> /​etc/​resolv.conf
 +
 + case `uname -s` in
 ++FreeBSD)
 ++       ​if=`netstat -rn|awk '($1 == "​default"​){print $6}'`
 ++       ​ifconfig ${if} alias ${INTERNAL_ADDR4}
 ++       route delete default
 ++       route add default ${DEFAULT_GW} -ifa ${INTERNAL_ADDR4}
 ++       ;;
 + ​NetBSD)
 +        if=`netstat -rn|awk '($1 == "​default"​){print $7}'`
 +        ifconfig ${if} alias ${INTERNAL_ADDR4}
 +</​code>​
 +
 +et phase1-down.sh :
 +
 +<​code>​
 +--- /​usr/​local/​share/​examples/​ipsec-tools/​roadwarrior/​client/​phase1-down.sh ​    Thu Mar  8 14:15:15 2007
 ++++ phase1-down.sh ​     Tue Mar 27 15:21:54 2007
 +@@ -7,6 +7,9 @@
 + ​PATH=/​bin:/​sbin:/​usr/​bin:/​usr/​sbin:/​usr/​local/​bin:/​usr/​local/​sbin
 +
 + case `uname -s` in
 ++FreeBSD)
 ++       ​DEFAULT_GW=`netstat -rn | awk '($1 == "​default"​){print $2}'`
 ++       ;;
 + ​NetBSD)
 +        DEFAULT_GW=`netstat -rn | awk '($1 == "​default"​){print $2}'`
 +        ;;
 +@@ -30,6 +33,12 @@
 + test -f /​etc/​resolv.conf.bak && cp /​etc/​resolv.conf.bak /​etc/​resolv.conf
 +
 + case `uname -s` in
 ++FreeBSD)
 ++       ​if=`netstat -rn|awk '($1 == "​default"​){print $6}'`
 ++       ​ifconfig ${if} delete ${INTERNAL_ADDR4}
 ++       route delete default
 ++       route add default ${DEFAULT_GW} -ifa ${LOCAL_ADDR}
 ++       ;;
 + ​NetBSD)
 +        if=`netstat -rn|awk '($1 == "​default"​){print $7}'`
 +        ifconfig ${if} delete ${INTERNAL_ADDR4}
 +</​code>​
 +
 +Et enfin, le classique //​racoon.conf//​ pour "​carotte"​ :
 +
 +<​code>​
 +# racoon.conf roadwarrior natt configuration
 +# box : carotte (aka le roadwarrior)
 +path include "/​usr/​local/​etc/​racoon";​
 +path certificate "/​usr/​local/​etc/​racoon/​certs";​
 +
 +listen {
 +        #Vérifier l'​existence du répertoire /​var/​db/​racoon
 +        adminsock "/​var/​db/​racoon/​racoon.sock"​ "​root"​ "​operator"​ 0660; 
 +}
 +
 +remote 10.0.0.2 {
 +        exchange_mode aggressive; #​roadwarrior
 +        ca_type x509 "​ca.crt";​ #LE CA
 +        proposal_check obey;
 +        nat_traversal on;
 +        mode_cfg on; #On récupère la configuration du serveur
 +        script "/​usr/​local/​etc/​racoon/​phase1-up.sh"​ phase1_up;
 +        script "/​usr/​local/​etc/​racoon/​phase1-down.sh"​ phase1_down;​
 +        passive off; #Notre client est l'​initiator
 +        proposal {
 +                encryption_algorithm aes;
 +                hash_algorithm sha1;
 +                authentication_method hybrid_rsa_client;​
 +                dh_group 2;
 +        }
 +}
 +
 +sainfo anonymous {
 +        pfs_group 2;
 +        lifetime time 15min;
 +        encryption_algorithm rijndael;
 +        authentication_algorithm hmac_sha1;
 +        compression_algorithm deflate ;
 +}
 +</​code>​
 +
 +et celui de "​cornichon"​ change lui aussi, pour t'​aider je rajoute un commentaire aux changements :
 +
 +<​code>​
 +# racoon.conf roadwarrior natt configuration
 +# box : cornichon (aka le serveur)
 +path include "/​usr/​local/​etc/​racoon";​
 +path certificate "/​usr/​local/​etc/​racoon/​certs";​
 +
 +log debug;
 +
 +listen
 +{
 +        isakmp 10.0.0.2[500];​
 +        isakmp_natt 10.0.0.2[4500];​
 +}
 +
 +timer
 +{
 +        natt_keepalive 10 sec;
 +}
 +
 +remote anonymous #attention : on ne connait à priori pas l'IP source du roadwarrior
 +{
 +        exchange_mode aggressive; #​CACHANGELAFAITGAFFE
 +        my_identifier asn1dn;
 +        certificate_type x509 "​cornichon.crt"​ "​cornichon.key";​
 +        #C'est une SAD générique donc pas de peers_certfile
 +
 +        nat_traversal on;
 +        proposal_check claim;
 +        generate_policy on;
 +
 +        proposal {
 +                authentication_method hybrid_rsa_server;​ #ATTENTION LA AUSSI
 +                encryption_algorithm aes;
 +                hash_algorithm sha1;
 +                dh_group 2;
 +        }
 +}      ​
 +
 +mode_cfg {
 +        network4 172.16.1.10;​ #Réseau et IP de départ
 +        netmask4 255.255.255.0;​ #Netmask du réseau virtuel
 +        pool_size 10; #Nombre de roadwarriors simultanés
 +        auth_source system; #Comptes systeme
 +        dns4 192.168.1.1;​ #C'est parlant non ?
 +        banner "/​usr/​local/​etc/​racoon/​motd";​ #​N'​oublie pas la parole sacrée
 +        pfs_group 2;
 +}
 +
 +sainfo anonymous
 +{
 +        pfs_group 2;
 +        lifetime time 15min;
 +        encryption_algorithm rijndael;
 +        authentication_algorithm hmac_sha1, hmac_md5;
 +        compression_algorithm deflate;
 +}
 +</​code>​
 +
 +Et n'​oublie pas :
 +
 +<​code>​
 +[root@cornichon /​usr/​local/​etc/​racoon]#​ echo "​BIENVENUE LUTIN MAIS ESSUIE TES PIEDS" > motd
 +</​code>​
 +
 +
 +===== Yen reste encore ! =====
 +
 +Alors la lutin, il ne reste "plus qu'​a"​
 +
 +La connexion diffère du fonctionnement classique dans le sens qu'on doit démarrer la phase 1 avec //​racoonctl//​ puis ensuite, une fois authentifié,​ tester le tunnel avec la phase 2:
 +
 +Sur "​cornichon"​ :
 +
 +<​code> ​
 +[root@cornichon /root]# racoon -F
 +</​code>​
 +
 +et surtout sur "​carotte"​ :
 +
 +<​code>​
 +[root@carotte /root]# racoon
 +[root@carotte /root]# racoonctl vc -u lutin 10.0.0.2
 +Password:
 +Bound to address 172.16.1.10
 +
 +BIENVENUE LUTIN MAIS ESSUIE TES PIEDS
 +
 +[root@carotte /root]#
 +[root@carotte /root]#ping gcu.info
 +PING gcu.info (217.195.17.234):​ 56 data bytes
 +64 bytes from 217.195.17.234:​ icmp_seq=0 ttl=240 time=214.469 ms
 +</​code>​
 +
 +Pour la déconnexion :
 +
 +<​code>​
 +[root@carotte /root]# racoonctl vd 10.0.0.2
 +VPN connexion terminated
 +</​code>​
 +
 +
 +
 +
 +===== Références =====
 +
 +  * [1] Les ptits gars d'​OpenBSD font tout pour simplifier la mise en place d'un tunnel au point que cela donne ca :
 +        http://​openbsd.org/​papers/​asiabsdcon07-ipsec/​index.html
 +
 +  * Pour les débutants avec IPsec + certificats,​ je vous renvoie sur [[http://​matt.guegan.free.fr/​docs/​Bsd_IPsec.php|cette doc]] qui n'est peut-être pas à jour mais bien pratique.
 +
 +  * http://​tools.ietf.org/​html/​rfc3947
 +  * http://​tools.ietf.org/​html/​rfc3948
 +  * http://​ipsec-tools.sourceforge.net/​freebsd6-natt.diff
 +  * http://​www.free-4ever.net/​index.php/​Ipsec-tools:​roadwarrior_client
 +  * http://​www.free-4ever.net/​index.php/​Ipsec-tools:​roadwarrior_server
 +
 +
 +===== Changelog =====
 +
 +  * 28/03/2007 import du tip par hotbox plus corrections
 +  * 30/03/2007 corrections + warning bge(4)
freebsd/ipsec_natt_roadwarrior.txt · Last modified: 2010/01/12 13:29 (external edit)