User Tools

Site Tools


formationsecurite:vpnlinux

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
tar xjf linux-2.6.11.10.tar.bz2 -C /usr/src/
  • Serveur PPTP: poptop
    • télécharger 1) v. 1.2.1
    • décompresser
tar xzf pptpd-1.2.1.tar.gz
  • installer
cd pptpd-1.2.1
./configure
make
make install
  • pptpd est le serveur qui va permettre de se connecter
  • configurer et compiler le noyau
cd /usr/src
rm linux
ln -s linux-2.6.11.10 linux
cd linux
make menuconfig
  • 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
make
make install
cp /vmlinuz /boot/vmlinuz-2.6.11.10
  • editer /etc/lilo.conf (rajouter une section avec le nouveau noyau)
lilo

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:
# 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
# }}}
  • 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:

cp -R /usr/local/lib/pptpd/ /usr/lib

ainsi que les exécutables suivants:

cp /usr/local/sbin/pptp* /usr/sbin/

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.

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

Puisque debug est activé, on peut voir les logs dans /var/log/syslog:

tail -f /var/log/syslog

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:

ipconfig

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.

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
make menuconfig

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:

make
make install

Ajouter une entrée dans /etc/lilo.conf et

lilo

Patcher pppd 2.4.3

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

Il faut ensuite changer les options des fichiers de configuration. Je me suis inspiré de 2): Dans /etc/ppp/options.pptpd

# BSD licensed ppp-2.4.2 upstream with MPPE only, kernel module ppp_mppe.o
# {{{
require-mschap-v2
mppe required
# }}}

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'3) 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.

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

Recompilation noyau

cd /usr/src/linux
make menuconfig

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)

make
make install
cp /vmlinuz /boot/vmlinuz-2.6.11.10-tuntap

rajouter une entrée dans /etc/lilo.conf

lilo

Et redémarrer avec le nouveau noyau.

Configuration

Clefs: une par machine (c'est une pre-shared key)

openvpn --genkey  --secret static.key
mkdir /etc/openvpn
mv static.key /etc/openvpn/

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.

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/

Dans static-home.conf, replacer la ligne:

remote 1.2.3.4

par l'adresse du serveur

remote 10.10.3.102

Echanger la clef entre le serveur et le client (avec ssh par exemple).

Du côté client:

cd /etc/openvpn
openvpn --config /etc/openvpn/static-home.conf

Du côté serveur:

cd /etc/openvpn
openvpn --config /etc/openvpn/static-office.conf

Quand la connexion est établie, regarder ifconfig, il y a une interface supplémentaire tun0:

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)

Faire un ping du serveur:

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

J'ai maintenant accès aux ressources de ce réseau. Exemple: serveur Apache:

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.

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:

push "route 10.10.3.0 255.255.255.0"

(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:

route add -net 10.3.0.0 netmask 255.255.255.0 gw 10.10.3.102

[[VPN]] avec IPSec

Installation

  • installer les 4):
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
  • recompiler le noyau
cd /usr/src/linux
make menuconfig
  • 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)
make
make install
cp /vmlinuz /boot/vmlinuz-2.6.11.10-ipsec

Ajouter une entrée dans /etc/lilo.conf

lilo

Redémarrer

Configuration

So long, s…!

2)
http://www.phparchitecture.com/howto_show.php?id=3&showall PoPToP PPTP + MPPE 128bit Encryption + MPPC Compression VPN Server HOWTO
formationsecurite/vpnlinux.txt · Last modified: 2013/01/30 17:52 (external edit)