User Tools

Site Tools


formationsecurite:vpnlinux

Differences

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

Link to this comparison view

formationsecurite:vpnlinux [2013/01/30 17:52] (current)
Line 1: Line 1:
 +=== Introduction ===
  
 +[[VPN]]: accéder à un réseau à distance comme si on était à l'​intérieur.
 +Il y a une phase d'​authentification (mais pas forcément d'​encryption).
 +
 +Un paquet encrypté prend de l'​ordre de mille fois plus de ressources processeur qu'un paquet sans encryption.
 +
 +
 +
 +=== Protocoles [[VPN]] ===
 +==== PPTP ====
 +Au paquet IP de base, on rajoute
 +  * une en-tête PPP
 +  * une en-tête GRE
 +  * une en-tête IP
 +
 +=== PPP ===
 +  * encapsulation
 +
 +Session PPP:
 +  * initialisation de la connexion: le client envoie un paquet LCP (link control protocol, couche 3)
 +  * si demande d'​authentification du serveur, il envoie une demande en PAP, CHAP ou Kerberos
 +  * quand authentifié,​ PPP envoie des informations de configuration via le protocole NCP (network control protocol), dans les 2 sens
 +  * quand déconnexion,​ paquet LCP envoyé pour décrocher la session
 +
 +==== GRE ====
 +Generic Routine Encapsulation (couche 4), transporté par IP.
 +Permet de transporter les paquets couche 3 (IP le plus souvent)
 +Pas d'​encryption,​ pas d'​authentification aux extrémités (effectué par PPP)
 +
 +==== IPSec ====
 +Il y a 3 modules
 +  * IP Authentification Header (AH): s'​assure de l'​authentification de l'​émetteur du paquet et s'​assure qu'il n'a pas été modifié (intégrité)
 +  * Encapsulating Security Payload (ESP): chiffrement des données, authentification,​ intégrité et mécanisme d'​anti-répétition des sessions (! il renvoie les paquets perdus, mais pas le même numéro de //session// TCP)
 +  * Security Association (SA): échange des clefs et des paramètres de sécurité entre les 2 extrémités du tunnel: information sur le traitement à appliquer aux paquets IP (AH, ESP, mode tunnel ou transport, algorithmes de chiffrement,​ clefs). Echange des clefs soit manuel, soit avec le protocole d'​échange IKE (Internet Key Exchange)
 +
 +2 modes de fonctionnement
 +  * mode transport: un serveur [[VPN]], des clients
 +  * mode tunnel: de gateway à gateway: on prend 2 réseaux distants et faire comme s'ils étaient ensemble: MAN
 +
 +==== Ports et protocoles utilisés par les [[VPN]] ====
 +  * PPTP
 +    * GRE (protocole numéro 47)
 +    * TCP / 1723
 +  * IPSec
 +    * ESP (protocole 50)
 +    * AH (protocole 51)
 +    * UDP / 500 (ISAKMP: pre-shared keys en automatique ou IKE: serveur d'​authentification exteren qui fournit les clefs)
 +
 +=== Configuration ===
 +
 +==== [[VPN]] sous PPTP ====
 +Il faut compiler un noyau.
 +  * récupérer les sources linux 2.6.11.10
 +  * décompresser dans /usr/src
 +   <​code>​tar xjf linux-2.6.11.10.tar.bz2 -C /​usr/​src/</​code>​
 +  * Serveur PPTP: poptop
 +    * télécharger ((http://​poptop.sourceforge.net/​ poptop)) v. 1.2.1 
 +    * décompresser
 +     <​code>​tar xzf pptpd-1.2.1.tar.gz</​code>​
 +    * installer
 +     <​code>​cd pptpd-1.2.1
 +./configure
 +make
 +make install</​code>​
 +    * pptpd est le serveur qui va permettre de se connecter
 +  * configurer et compiler le noyau
 +   <​code>​cd /usr/src
 +rm linux
 +ln -s linux-2.6.11.10 linux
 +cd linux
 +make menuconfig</​code>​
 +    * choisir les options
 +      * PPP support ​ Device Drivers -> Networking support -> PPP support (cocher toutes les options)
 +      * GRE tunnel over IP: Device Drivers -> Networking support -> Networking options -> ~TCP/IP networking -> IP: GRE tunnels over IP (cocher juste celui-là)
 +      * pour le reste, comme d'​habitude
 +      * sauver la config en .config
 +   <​code>​make
 +make install
 +cp /vmlinuz /​boot/​vmlinuz-2.6.11.10</​code>​
 +    * editer /​etc/​lilo.conf (rajouter une section avec le nouveau noyau)
 +   <​code>​lilo</​code>​
 +
 +On va créer les  fichier de configuration
 +  * /​etc/​pptpd.conf qui comprendra:
 +    * l'​adresse IP virtuelle du serveur
 +    * les IP disponibles pour les clients (= IP virtuelles que le client va recevoir une fois connecté
 +    * il faut décommenter #debug
 +  * /​etc/​ppp/​options.pptp
 +    * contient les méthodes d'​authentification et d'​encryptage:​ ici nous allons toutes les décommenter pour que le clients puisse choisir:
 +     <​code>#​ Encryption
 +# (There have been multiple versions of PPP with encryption support,
 +# choose with of the following sections you will use.)
 +
 +
 +# BSD licensed ppp-2.4.2 upstream with MPPE only, kernel module ppp_mppe.o
 +# {{{
 +#refuse-pap
 +#​refuse-chap
 +#​refuse-mschap
 +# Require the peer to authenticate itself using MS-CHAPv2 [Microsoft
 +# Challenge Handshake Authentication Protocol, Version 2] authentication.
 +#​require-mschap-v2
 +# Require MPPE 128-bit encryption
 +# (note that MPPE requires the use of MSCHAP-V2 during authentication)
 +#​require-mppe-128
 +# }}}
 +</​code>​
 +    * autres options (proxy, mtu (maximum trame unit, par défaut 1500), etc.)
 +  * /​etc/​ppp/​chap-secrets
 +    * gestion des mots de passe d'​authentification (indépendants des users sur la machine)
 +    * détermine les IP qui peuvent accéder au [[VPN]]
 +
 +Copier le répertoire pptpd:
 +<​code>​cp -R /​usr/​local/​lib/​pptpd/​ /​usr/​lib</​code>​
 +ainsi que les exécutables suivants:
 +<​code>​cp /​usr/​local/​sbin/​pptp* /​usr/​sbin/</​code>​
 +
 +Problème: /Slackware 10.1 est livré avec ppp 2.4.2 et pptpd 1.2.1 a besoin de ppp 2.4.3.
 +Donc, on doit télécharger ppp-2.4.3-4.src.tgz et l'​installer.
 +<​code>​tar xzf ppp-2.4.3-4.src.tgz ​
 +cd ppp-2.4.3-4
 +tar xzf ppp-2.4.3.tar.gz
 +cd ppp-2.4.3
 +./configure --prefix=/​usr
 +make
 +make install</​code>​
 +
 +Puisque debug est activé, on peut voir les logs dans /​var/​log/​syslog:​
 +<​code>​tail -f /​var/​log/​syslog</​code>​
 +
 +Sur le client: [[Windows]] XP
 +Start -> Connexions -> Afficher toutes les connexions -> créer une nouvelle connexion -> connexion au réseau d'​entreprise -> connexion réseau privé virtuel -> entrer le nom de la connexion -> entrer l'IP du serveur (10.10.3.101) -> mon utilisation uniquement -> OK
 +La fenêtre de connexion s'​ouvre -> propriétés -> onglet sécurité -> décocher //exiger le cryptage des données//
 +Ensuite entrer le login et le mot de passe.
 +
 +On est ensuite connecté au [[VPN]] sans encryption.
 +
 +On peut vérifier que le client a maintenant 2 adresses IP en tapant en console:
 +<​code>​ipconfig</​code>​
 +
 +==== Avec encryption ====
 +Pour avoir le tunnel encrypté, il faut ajouter MPPE sur le serveur -> patch noyau: http://​www.polbox.com/​h/​hs001/​
 +Il faut télécharger un patch pour le noyau (2.6.11) et pour pppd (2.4.3) et les appliquer.
 +<​code>​wget http://​www.polbox.com/​h/​hs001/​linux-2.6.11-mppe-mppc-1.3.patch.gz
 +gunzip linux-2.6.11-mppe-mppc-1.3.patch.gz
 +cp linux-2.6.11-mppe-mppc-1.3.patch /​usr/​src/​linux
 +cd /​usr/​src/​linux
 +patch -p1 < linux-2.6.11-mppe-mppc-1.3.patch</​code>​
 +<​code>​make menuconfig</​code>​
 +Device Drivers -> Networking Support -> PPP support -> Microsoft PPP compression/​encryption (MPPC/MPPE) (cocher)
 +Ajouter les pilotes d'​encryption:​
 +Cryptographic options -> cocher Cryptographic API et dans le sous-menu, cocher (optionnel):​
 +  * DES and Triple DES EDE cipher algorithms
 +  * AES cipher algorithms (i586)
 +Recompiler:
 +<​code>​make
 +make install</​code>​
 +Ajouter une entrée dans /​etc/​lilo.conf et
 +<​code>​lilo</​code>​
 +
 +Patcher pppd 2.4.3
 +<​code>​wget http://​www.polbox.com/​h/​hs001/​ppp-2.4.3-mppe-mppc-1.1.patch.gz
 +gunzip ppp-2.4.3-mppe-mppc-1.1.patch.gz
 +cp ppp-2.4.3-mppe-mppc-1.1.patch /​usr/​src/​ppp-2.4.3/​
 +cd /​usr/​src/​ppp-2.4.3
 +patch -p1 < ppp-2.4.3-mppe-mppc-1.1.patch
 +./configure --prefix=/​usr
 +make
 +make install</​code>​
 +
 +Il faut ensuite changer les options des fichiers de configuration.
 +Je me suis inspiré de ((http://​www.phparchitecture.com/​howto_show.php?​id=3&​showall PoPToP PPTP + MPPE 128bit Encryption + MPPC Compression [[VPN]] Server HOWTO)):
 +Dans /​etc/​ppp/​options.pptpd
 +<​code>#​ BSD licensed ppp-2.4.2 upstream with MPPE only, kernel module ppp_mppe.o
 +# {{{
 +require-mschap-v2
 +mppe required
 +# }}}</​code>​
 +
 +
 +27/05/05
 +
 +=== Rappel ===
 +Hier, nous avons mis en oeuvre un server PPTP sans puis avec encryption:
 +==== Installation ====
 +  * PPTP: installation
 +    * paquet pptpd
 +    * compilation du noyau
 +    * mise à jour de PPP
 +  * pour l'​encryption
 +    * MPPE
 +      * compilation du noyau après patching (avec module cryptographique:​ RC4, SHA-1 obligatoires,​ DES, 3DES et AES en plus)
 +      * compilation de PPP après patching
 +==== Configuration ====
 +  * /​etc/​pptpd.conf
 +    * options de base (debug, fichier d'​options ci-dessous, adresses IP données aux clients au bout du tunnel, adresse IP du serveur = à l'​autre bout du tunnel)
 +  * /​etc/​ppp/​options.pptpd (types d'​authentification possibles ou requises)
 +  * /​etc/​ppp/​chap-secrets (login et password
 +
 +=== [[VPN]] over SSL ===
 +Nous allons réaliser cela à l'aide d'​((http://​openvpn.net/​ OpenVPN)) qui utilise SSL et un périphérique ~TUN/TAP.
 +Principe de ~TUN/TAP: offre la possibilité de transmettre des paquets aux programmes.
 +TUN (tunnel) pour le point à point
 +TAP pour ethernet
 +
 +==== Installation ====
 +Nous n'​utiliserons pas les bibliothèques LZO.
 +<​code>​wget http://​openvpn.net/​release/​openvpn-2.0.tar.gz
 +tar xzf openvpn-2.0.tar.gz  ​
 +cd openvpn-2.0
 +./configure --prefix=/​usr --disable-lzo
 +make
 +make install</​code>​
 +
 +Recompilation noyau
 +<​code>​cd /​usr/​src/​linux
 +make menuconfig</​code>​
 +Device Drivers -> Networking support -> Network device support -> Universal TUN/TAP device driver support (cocher)
 +Pour bien montrer que ça marche dans PPP et GRE (nécessaires pour PPTP), nous les retirons du noyau.
 +Enlever PPP: Device Drivers -> Networking support -> PPP (décocher)
 +Enlever GRE: Device Drivers -> Networking support -> Networking options -> ~TCP/IP networking -> IP: GRE tunnels over IP (décocher)
 +<​code>​make
 +make install
 +cp /vmlinuz /​boot/​vmlinuz-2.6.11.10-tuntap</​code>​
 +rajouter une entrée dans /​etc/​lilo.conf
 +<​code>​lilo</​code>​
 +Et redémarrer avec le nouveau noyau.
 +
 +==== Configuration ====
 +Clefs: une par machine (c'est une pre-shared key)
 +<​code>​openvpn --genkey ​ --secret static.key
 +mkdir /​etc/​openvpn
 +mv static.key /​etc/​openvpn/</​code>​
 +
 +Il y a des exemples de fichiers de configuration dans openvpn-2.0/​sample-config-files/​.
 +Nous allons nous inspirer de static-home.conf d'un côté et de static-office.conf de l'​autre côté du tunnel SSL.
 +<​code>​cp openvpn-2.0/​sample-config-files/​static-home.conf /​etc/​openvpn/​
 +cp openvpn-2.0/​sample-config-files/​static-office.conf /​etc/​openvpn/​
 +cp openvpn-2.0/​sample-config-files/​home.up /​etc/​openvpn/​
 +cp openvpn-2.0/​sample-config-files/​office.up /​etc/​openvpn/</​code>​
 +
 +Dans static-home.conf,​ replacer la ligne:
 +<​code>​remote 1.2.3.4</​code>​
 +par l'​adresse du serveur
 +<​code>​remote 10.10.3.102</​code>​
 +
 +Echanger la clef entre le serveur et le client (avec ssh par exemple).
 +
 +Du côté client:
 +<​code>​cd /​etc/​openvpn
 +openvpn --config /​etc/​openvpn/​static-home.conf</​code>​
 +
 +Du côté serveur:
 +<​code>​cd /​etc/​openvpn
 +openvpn --config /​etc/​openvpn/​static-office.conf</​code>​
 +
 +Quand la connexion est établie, regarder ifconfig, il y a une interface supplémentaire tun0:
 +<​code>​carl@forma301:​~$ /​sbin/​ifconfig
 +eth0      Link encap:​Ethernet ​ HWaddr 00:​02:​A5:​CC:​9E:​FD
 +          inet addr:​10.10.3.101 ​ Bcast:​10.10.3.255 ​ Mask:​255.255.255.0
 +          UP BROADCAST NOTRAILERS RUNNING MULTICAST ​ MTU:​1500 ​ Metric:1
 +          RX packets:​3866 errors:0 dropped:0 overruns:0 frame:0
 +          TX packets:​3262 errors:0 dropped:0 overruns:0 carrier:0
 +          collisions:​0 txqueuelen:​1000
 +          RX bytes:​4343594 (4.1 Mb)  TX bytes:​447732 (437.2 Kb)
 +          Interrupt:​11
 +
 +lo        Link encap:Local Loopback
 +          inet addr:​127.0.0.1 ​ Mask:​255.0.0.0
 +          UP LOOPBACK RUNNING ​ MTU:​16436 ​ Metric:1
 +          RX packets:110 errors:0 dropped:0 overruns:0 frame:0
 +          TX packets:110 errors:0 dropped:0 overruns:0 carrier:0
 +          collisions:​0 txqueuelen:​0
 +          RX bytes:7100 (6.9 Kb)  TX bytes:7100 (6.9 Kb)
 +
 +tun0      Link encap:​UNSPEC ​ HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
 +          inet addr:​10.1.0.2 ​ P-t-P:​10.1.0.1 ​ Mask:​255.255.255.255
 +          UP POINTOPOINT RUNNING NOARP MULTICAST ​ MTU:​1500 ​ Metric:1
 +          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
 +          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
 +          collisions:​0 txqueuelen:​100
 +          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)</​code>​
 +
 +Faire un ping du serveur:
 +<​code>​ping 10.1.0.1
 +PING 10.1.0.1 (10.1.0.1) 56(84) bytes of data.
 +64 bytes from 10.1.0.1: icmp_seq=1 ttl=64 time=1.66 ms
 +64 bytes from 10.1.0.1: icmp_seq=2 ttl=64 time=0.542 ms
 +64 bytes from 10.1.0.1: icmp_seq=3 ttl=64 time=0.543 ms
 +
 +--- 10.1.0.1 ping statistics ---
 +3 packets transmitted,​ 3 received, 0% packet loss, time 2000ms
 +rtt min/​avg/​max/​mdev = 0.542/​0.916/​1.665/​0.530 ms</​code>​
 +
 +J'ai maintenant accès aux ressources de ce réseau.
 +Exemple: serveur Apache:
 +<​code>​telnet 10.1.0.1 80
 +Trying 10.1.0.1...
 +Connected to 10.1.0.1.
 +Escape character is '​^]'​.
 +HELO
 +<​!DOCTYPE HTML PUBLIC "​-//​IETF//​DTD HTML 2.0//​EN">​
 +<​HTML><​HEAD>​
 +<​TITLE>​501 Method Not Implemented</​TITLE>​
 +</​HEAD><​BODY>​
 +<​H1>​Method Not Implemented</​H1>​
 +HELO to /index.html not supported.<​P>​
 +Invalid method in request HELO<​P>​
 +<HR>
 +<​ADDRESS>​Apache/​1.3.33 Server at forma302.tf3.be Port 80</​ADDRESS>​
 +</​BODY></​HTML>​
 +Connection closed by foreign host.</​code>​
 +
 +On utilise ce type de connexion pour relier 2 réseaux distants et en faire un MAN.
 +
 +Dimitri fait le serveur [[VPN]]. Il a plusieurs clients à travers un réseau 192.168.0.0. De l'​autre côté, Carl sur un autre réseau (10.10.3.0).
 +Il a dû rajouter dans static-office.conf la ligne:
 +<​code>​push "route 10.10.3.0 255.255.255.0"</​code>​
 +(route veres le client dans le subnet)
 +
 +Comme la machine de Dimitri n'​était pas mon default gateway, j'ai rajouté la route suivante dans ma table de routage:
 +<​code>​route add -net 10.3.0.0 netmask 255.255.255.0 gw 10.10.3.102</​code>​
 +
 +=== [[VPN]] avec IPSec ===
 +==== Installation ====
 +  * installer les ((http://​ipsec-tools.sourceforge.net/​ IPSec tools)): ​
 +   <​code>​wget http://​ovh.dl.sourceforge.net/​sourceforge/​ipsec-tools/​ipsec-tools-0.5.2.tar.bz2
 +tar xjf ipsec-tools-0.5.2.tar.bz2
 +cd ipsec-tools-0.5.2
 +./configure --prefix=/​usr
 +make
 +make install</​code>​
 +  * recompiler le noyau
 +  <​code>​cd /​usr/​src/​linux
 +make menuconfig</​code>​
 +    * Device Drivers -> Networking support -> Networking options -> 
 +      * PF_KEY sockets (cocher) ​
 +      * IP tunneling
 +      * IP: GRE tunnels over IP
 +      * IP: AH transformation ​
 +      * IP: ESP transformation
 +      * IP: IPComp transformation
 +      * IPsec user configuration interface
 +    * Cryptographic options -> Cryptographic API 
 +      * Null algorithms
 +      * MD5 digest algorithm
 +      * SHA1 digest algorithm
 +      * DES and Triple DES EDE cipher algorithms
 +      * AES cipher algorithms (i586)
 +    <​code>​make
 +make install
 +cp /vmlinuz /​boot/​vmlinuz-2.6.11.10-ipsec</​code>​
 +Ajouter une entrée dans /​etc/​lilo.conf
 +<​code>​lilo</​code>​
 +Redémarrer
 +
 +==== Configuration ====
 +
 +So long, s...!
formationsecurite/vpnlinux.txt · Last modified: 2013/01/30 17:52 (external edit)