Installation serveur vpn : Différence entre versions

De Wiki_DR13
Aller à : navigation, rechercher
(Le fichier de configuration serveur)
(Le fichier de configuration serveur)
Ligne 107 : Ligne 107 :
  
 
== Le fichier de configuration serveur ==
 
== Le fichier de configuration serveur ==
  # Which local IP address should OpenVPN
+
 
  # listen on? (optional)
+
################################################
 +
  # OpenVPN configuration.                        #
 +
#################################################
 +
 +
  # adresse d'ecoute
 
  local 193.49.133.234
 
  local 193.49.133.234
  #local 193.49.133.209
+
  # local 193.49.133.209
 
   
 
   
 
  # Port d'écoute. Identique entre le serveur et le client
 
  # Port d'écoute. Identique entre le serveur et le client
  port 4500  
+
  port 4500
 
   
 
   
 
  # TCP or UDP server?
 
  # TCP or UDP server?
Ligne 119 : Ligne 123 :
 
   
 
   
 
  # "dev tun" = routed IP tunnel, "dev tap" = ethernet tunnel.
 
  # "dev tun" = routed IP tunnel, "dev tap" = ethernet tunnel.
  ;dev tap
+
  ; dev tap
 
  dev tun
 
  dev tun
 
   
 
   
Ligne 125 : Ligne 129 :
 
  ca keys/CNRS.crt
 
  ca keys/CNRS.crt
 
  cert keys/vpn.dr13.cnrs.fr.crt
 
  cert keys/vpn.dr13.cnrs.fr.crt
  key keys/vpn.dr13.cnrs.fr.key # This file should be kept secret
+
  key keys/vpn.dr13.cnrs.fr.key # doit rester secret !
 
#ca ca.crt
 
#cert server.crt
 
#key server.key
 
 
   
 
   
 
  # Diffie hellman parameters.
 
  # Diffie hellman parameters.
  dh "keys/dh1024.pem"  
+
  dh "keys/dh1024.pem"
 
   
 
   
 
  # Route par défaut du tunnel
 
  # Route par défaut du tunnel
  server 10.8.0.0 255.255.255.0
+
  server 10.8.0.0 255.255.255.0  
 
   
 
   
 
  # Fichier d'enregistrement des couples client <-> @IP virtuelle
 
  # Fichier d'enregistrement des couples client <-> @IP virtuelle
Ligne 144 : Ligne 144 :
 
  client-config-dir "/etc/openvpn/clients"
 
  client-config-dir "/etc/openvpn/clients"
 
   
 
   
  # push de la route vers  DR13
+
  # push de la route vers  DR13 (ne fonctionne pas, il faut ajouter une route a lamain sur le serveur)
 
  #push "route 193.49.133.0 255.255.255.0"
 
  #push "route 193.49.133.0 255.255.255.0"
 +
 +
# On utilise donc la fonction redirect-gateway, qui evite le pb d'ajout de route MAIS FAIT TRANSITER TOUT LE TRAFIC PAR LE TUNNEL !
 
  push "redirect-gateway"
 
  push "redirect-gateway"
 
   
 
   
 +
# Envoie des serveur de noms
 
  push "dhcp-option DNS 193.49.133.208"
 
  push "dhcp-option DNS 193.49.133.208"
 
  push "dhcp-option WINS 193.49.133.208"
 
  push "dhcp-option WINS 193.49.133.208"
 +
 +
# Route pour les utilisateurs (push ds le fichier client)
 +
route 10.8.1.0 255.255.255.0
 +
# Route pour les administrateurs (push ds le fichier client)
 +
route 10.8.18.0 255.255.255.0
 +
 
 
   
 
   
 
  # Route pour les utilisateurs (push ds le fichier client)
 
  # Route pour les utilisateurs (push ds le fichier client)
Ligne 163 : Ligne 172 :
 
  # The keepalive directive causes ping-like
 
  # The keepalive directive causes ping-like
 
  # messages to be sent back and forth over
 
  # messages to be sent back and forth over
# the link so that each side knows when
+
# the link so that each side knows when
# the other side has gone down.
+
# the other side has gone down.
# Ping every 10 seconds, assume that remote
+
# Ping every 10 seconds, assume that remote
# peer is down if no ping received during
+
# peer is down if no ping received during
# a 120 second time period.
+
# a 120 second time period.
keepalive 10 120
+
keepalive 10 120  
 
+
# Clé partagée entre le serveur et chaque client. 0=serveur, 1=client.
+
# Clé partagée entre le serveur et chaque client. 0=serveur, 1=client.
tls-auth keys/ta.key 0 # This file is secret
+
tls-auth keys/ta.key 0 # This file is secret  
 
+
# Select a cryptographic cipher.
+
# Select a cryptographic cipher.
# This config item must be copied to
+
# This config item must be copied to
# the client config file as well.
+
# the client config file as well.
;cipher BF-CBC        # Blowfish (default)
+
;cipher BF-CBC        # Blowfish (default)
;cipher AES-128-CBC  # AES
+
;cipher AES-128-CBC  # AES
;cipher DES-EDE3-CBC  # Triple-DES
+
;cipher DES-EDE3-CBC  # Triple-DES
 
+
# Utilisation de la compression. À indiquer aussi pour le client
+
# Utilisation de la compression. À indiquer aussi pour le client
comp-lzo
+
comp-lzo
 
+
# The maximum number of concurrently connected
+
# The maximum number of concurrently connected
# clients we want to allow.
+
# clients we want to allow.
;max-clients 100
+
;max-clients 100
 
+
# It's a good idea to reduce the OpenVPN
+
# It's a good idea to reduce the OpenVPN
# daemon's privileges after initialization.
+
# daemon's privileges after initialization.
#user root
+
#user root
#group root
+
#group root
 
+
# Modifie la racine pour le serveur OpenVPN
+
# Modifie la racine pour le serveur OpenVPN
#chroot /etc/openvpn
+
#chroot /etc/openvpn
 
+
# The persist options will try to avoid
+
# The persist options will try to avoid
# accessing certain resources on restart
+
# accessing certain resources on restart
# that may no longer be accessible because
+
# that may no longer be accessible because
# of the privilege downgrade.
+
# of the privilege downgrade.
persist-key
+
persist-key
persist-tun
+
persist-tun
 
+
# Output a short status file showing
+
# Output a short status file showing
# current connections, truncated
+
# current connections, truncated
# and rewritten every minute.
+
# and rewritten every minute.
status openvpn-status.log
+
status openvpn-status.log
 
+
# By default, log messages will go to the syslog (or
+
# By default, log messages will go to the syslog (or
# on Windows, if running as a service, they will go to
+
# on Windows, if running as a service, they will go to
# the "\Program Files\OpenVPN\log" directory).
+
# the "\Program Files\OpenVPN\log" directory).
# Use log or log-append to override this default.
+
# Use log or log-append to override this default.
# "log" will truncate the log file on OpenVPN startup,
+
# "log" will truncate the log file on OpenVPN startup,
# while "log-append" will append to it.  Use one
+
# while "log-append" will append to it.  Use one
# or the other (but not both).
+
# or the other (but not both).
;log        openvpn.log
+
;log        openvpn.log
;log-append  /var/log/openvpn/openvpn.log
+
;log-append  /var/log/openvpn/openvpn.log  
  
# Set the appropriate level of log
+
# Set the appropriate level of log
# file verbosity.
+
# file verbosity.
#
+
#
# 0 is silent, except for fatal errors
+
# 0 is silent, except for fatal errors
# 4 is reasonable for general usage
+
# 4 is reasonable for general usage
# 5 and 6 can help to debug connection problems
+
# 5 and 6 can help to debug connection problems
# 9 is extremely verbose
+
# 9 is extremely verbose
verb 3
+
verb 3
# Silence repeating messages.  At most 20
+
# Silence repeating messages.  At most 20
# sequential messages of the same message
+
# sequential messages of the same message
# category will be output to the log.
+
# category will be output to the log.
mute 20
+
mute 20
  
 
== Paramétrage d'iptables ==
 
== Paramétrage d'iptables ==

Version du 30 mai 2008 à 07:42

Installation d'OpenVPN à la DR13

Dans ce document, le serveur OpenVPN sert à la connection des clients nomades de la délégation, ou à des clients distants, disposant d'un certificat CNRS.


Prérequis

  • Installation de ssh et openssh
  • Installation de LZO (utilitaire de compression recommandé pour améliorer les performances de transmission des données via le tunnel) OpenVPN.
  • Configuration de iptables

Installation de OpenVPN

# apt-get install openvpn

Paramétrage pour l'installation locale

Création des dossiers dans /etc/openvpn

  • keys (répertoire des clés et certificats)
  • clients (répertoire des fichiers de configuration des clients)


Certificats et clés

À noter qu'un module de génération de certificats (easy-rsa) est disponible avec l'installation de OpenVPN. Nous désirons utiliser uniquement les certificats CNRS (serveurs et clients), on ne décrira donc pas ici ce module.

Récupération des certificats CNRS

  • ceux du serveur (Il faut effectuer une demande de certificat serveur au CNRS, puis récupérer et installer ces certificats dans le répertoire des clés.
  • celui de l'autorité de certification


Création du paramètre Dieffe-Helmann

# openssl dhparam -out dh1024.pem 1024

On place le fichier dh1024.pem dans le répertoire des clés La ligne suivante est décommentée dans le fichier server.conf sur le serveur

dh keys/dh1024.pem

Création de la clé partagée entre le serveur et les clients

# openvpn --genkey --secret ta.key

On place le fichier ta.key dans le répertoire des clés. Une copie sera effectuée et transmise pour chaque client nécessitant une connexion. La ligne suivante est décommentée dans le fichier server.conf sur le serveur

tls-auth keys/ta.key 0  # 0 pour le serveur

La ligne suivante est décommentée (ajoutée) dans le fichier client.conf (client.ovpn pour windows) sur la machine cliente

tls-auth keys/ta.key 1  # 1 pour le client


Des routes adaptées aux profils clients

But: Pouvoir définir et donner des droits distincts aux utilisateurs selon un profil pré-établi. Il faut donc commencer par définir le nombre de groupes d'utilisateurs que l'on aura à gérer, et définir les droits qu'ils pourront obtenir via l'utilisation du serveur OpenVPN.

On suppose dans ce qui suit que l'on dispose de 2 groupes spécifiques d'utilisateurs d'OpenVPN à la DR: les nomades (utilisateurs avec portables pouvant se déplacer à l'extérieur) et les administrateurs (utilisateurs avec pouvoir).

Ajouter autant de routes que de profils distincts dans le fichier de configuration serveur server.conf

# route par défaut
server 10.8.0.0 255.255.255.0
# route spéciale pour le 1er type d'utilisateur ;  administrateurs
route 10.8.18.0 255.255.255.0
# route spéciale pour le 2eme type d'utilisateur ;  nomades
route 10.8.1.0 255.255.255.0

Selon les besoins, on rajoutera des routes pour le wi-fi, les labos,...

Dans chaque fichier client, on va pousser la config pour que les utilisateurs spéciaux récupèrent une adresse spécifique de leur classe. Ces utilisateurs spéciaux sont identifié à la connection par le CN (common name) de leur certificat. On créé donc pour chacun d'eux un fichier spécifique dans le répertoire /etc/openvpn/clients sous la forme Prenom_Nom (voir les règles sur les caractères spéciaux dans la doc).

Pour pousser chaque route, on rajoute dans le fichier Prenom_Nom les lignes:

# Ajout de la route spécifique du groupe: exemple pour le groupe des utilisateurs nomades
iroute 10.8.1.0 255.255.255.0 
# Attribution du couple adresse locale (client) / adresse distante (serveur) pour l'utilisation du pont
ifconfig-push 10.8.18.2 10.8.18.1

en prenant le dernier octet de chaque paire d'adresses dans la liste ci-dessous pour des raisons de compatibilité avec les clients windows et le pilote TAP-Win32. Dans la liste, le premier chiffre sera le dernier octet de l'adresse du serveur, et le second chiffre, celui du client. Il faut veiller à fournir une paire différente à chaque client

[ 1, 2] [ 5, 6] [ 9, 10] [13, 14] [17, 18] [21, 22] [25, 26] [29, 30] [33, 34] [37, 38] [41, 42] [45, 46] [49, 50] [53, 54] [57, 58] [61, 62] [65, 66] [69, 70] [73, 74] [77, 78] [81, 82] [85, 86] [89, 90] [93, 94] [97, 98] [101,102] [105,106] [109,110] [113,114] [117,118] [121,122] [125,126] [129,130] [133,134] [137,138] [141,142] [145,146] [149,150] [153,154] [157,158] [161,162] [165,166] [169,170] [173,174] [177,178] [181,182] [185,186] [189,190] [193,194] [197,198] [201,202] [205,206] [209,210] [213,214] [217,218] [221,222] [225,226] [229,230] [233,234] [237,238] [241,242] [245,246] [249,250] [253,254]

Les règles pour chaque classe seront définies ensuite au niveau du fichier de configuration d'iptables.


Le fichier de configuration serveur

################################################
# OpenVPN configuration.                        #
#################################################

# adresse d'ecoute
local 193.49.133.234
# local 193.49.133.209

# Port d'écoute. Identique entre le serveur et le client
port 4500

# TCP or UDP server?
proto udp

# "dev tun" = routed IP tunnel, "dev tap" = ethernet tunnel.
; dev tap
dev tun

# Utilisation de certificat serveur CNRS
ca keys/CNRS.crt
cert keys/vpn.dr13.cnrs.fr.crt
key keys/vpn.dr13.cnrs.fr.key # doit rester secret !

# Diffie hellman parameters.
dh "keys/dh1024.pem"

# Route par défaut du tunnel
server 10.8.0.0 255.255.255.0 

# Fichier d'enregistrement des couples client <-> @IP virtuelle
ifconfig-pool-persist ipp.txt

# Repertoire client des fichiers de paramètres par défaut à envoyer aux clients
# identifiés demandant une connection
client-config-dir "/etc/openvpn/clients"

# push de la route vers  DR13 (ne fonctionne pas, il faut ajouter une route a lamain sur le serveur)
#push "route 193.49.133.0 255.255.255.0"

# On utilise donc la fonction redirect-gateway, qui evite le pb d'ajout de route MAIS FAIT TRANSITER TOUT LE TRAFIC PAR LE TUNNEL !
push "redirect-gateway"

# Envoie des serveur de noms
push "dhcp-option DNS 193.49.133.208"
push "dhcp-option WINS 193.49.133.208"

# Route pour les utilisateurs (push ds le fichier client)
route 10.8.1.0 255.255.255.0
# Route pour les administrateurs (push ds le fichier client)
route 10.8.18.0 255.255.255.0
 

# Route pour les utilisateurs (push ds le fichier client)
route 10.8.1.0 255.255.255.0
# Route pour les administrateurs (push ds le fichier client)
route 10.8.18.0 255.255.255.0

# Puis on rajoute une ligne pour chaque client dans son fichier conf
# avec l'adresse IP client fixe ainsi que celle du serveur
# ifconfig-push @IP-proche @IP-distante
#   ifconfig-push 10.8.18.6 10.8.18.5

# The keepalive directive causes ping-like
# messages to be sent back and forth over
# the link so that each side knows when
# the other side has gone down.
# Ping every 10 seconds, assume that remote
# peer is down if no ping received during
# a 120 second time period.
keepalive 10 120 

# Clé partagée entre le serveur et chaque client. 0=serveur, 1=client.
tls-auth keys/ta.key 0 # This file is secret 

# Select a cryptographic cipher.
# This config item must be copied to
# the client config file as well.
;cipher BF-CBC        # Blowfish (default)
;cipher AES-128-CBC   # AES
;cipher DES-EDE3-CBC  # Triple-DES

# Utilisation de la compression. À indiquer aussi pour le client
comp-lzo

# The maximum number of concurrently connected
# clients we want to allow.
;max-clients 100

# It's a good idea to reduce the OpenVPN
# daemon's privileges after initialization.
#user root
#group root

# Modifie la racine pour le serveur OpenVPN
#chroot /etc/openvpn

# The persist options will try to avoid
# accessing certain resources on restart
# that may no longer be accessible because
# of the privilege downgrade.
persist-key
persist-tun

# Output a short status file showing
# current connections, truncated
# and rewritten every minute.
status openvpn-status.log

# By default, log messages will go to the syslog (or
# on Windows, if running as a service, they will go to
# the "\Program Files\OpenVPN\log" directory).
# Use log or log-append to override this default.
# "log" will truncate the log file on OpenVPN startup,
# while "log-append" will append to it.  Use one
# or the other (but not both).
;log         openvpn.log
;log-append  /var/log/openvpn/openvpn.log 
# Set the appropriate level of log
# file verbosity.
#
# 0 is silent, except for fatal errors
# 4 is reasonable for general usage
# 5 and 6 can help to debug connection problems
# 9 is extremely verbose
verb 3
# Silence repeating messages.  At most 20
# sequential messages of the same message
# category will be output to the log.
mute 20

Paramétrage d'iptables

Creation d'un fichier /etc/init.d/firewall :

# FireWall for vpn.dr13.cnrs.fr
#
INTERF_LOOPBACK="lo"
INTERF_INTERNET="eth0"
IPTABLES="/sbin/iptables"

#
# drop all packet
#
drop_all() {
       $IPTABLES -F
       $IPTABLES -t nat -F
       $IPTABLES -X
       $IPTABLES -P INPUT DROP
       $IPTABLES -P OUTPUT DROP
       $IPTABLES -P FORWARD DROP

}
#
# Wan connection
#
wan() {

#SORTIE

################################################################################
#On autorise tout le trafic sortant
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 2967 -j DROP


###############################################################################
#On autorise le ping :
#$IPTABLES  -A INPUT -p icmp -j ACCEPT

#On autorise le ssh
#$IPTABLES  -A OUTPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT

#On autorise le www
#$IPTABLES  -A OUTPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT

# Regle pour les connexions DNS :
#$IPTABLES  -A OUTPUT -m state --state ESTABLISHED,RELATED --protocol udp --source -port 53 -j ACCEPT

#$IPTABLES  -A OUTPUT -m state --state ESTABLISHED,RELATED --protocol tcp --source -port 53 -j ACCEPT

#$IPTABLES  -A OUTPUT -p tcp -m tcp --dport 4500 -j ACCEPT
#$IPTABLES  -A OUTPUT -p udp -m udp --dport 4500 -j ACCEPT

#ENTREES

################################################################################
# on autorise tout sur le réseau local:
$IPTABLES -A INPUT -s 193.49.133.0/24 -j ACCEPT

#On autorise le ping :
#$IPTABLES  -A INPUT -p icmp -j ACCEPT

#On autorise le ssh
$IPTABLES  -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT

#On autorise le www
$IPTABLES  -A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT

# Regle pour les connexions DNS :
$IPTABLES  -A INPUT -m state --state ESTABLISHED,RELATED --protocol udp --source-port 53 -j ACCEPT

$IPTABLES  -A INPUT -m state --state ESTABLISHED,RELATED --protocol tcp --source-port 53 -j ACCEPT

#on autorise les connexions etablies
$IPTABLES  -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT


#VPN

################################################################################
#On autorise le VPN
$IPTABLES  -A INPUT -p tcp -m tcp --dport 4500 -j ACCEPT
$IPTABLES  -A INPUT -p udp -m udp --dport 4500 -j ACCEPT

#Autorisation de l'IP forward, afin de permettre la transmission des paquets du///vers le tunnel
echo 1 > /proc/sys/net/ipv4/ip_forward

# on NAT les connexions du tunel
$IPTABLES  -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# on autorise le NAT inverse
#$IPTABLES  -A FORWARD -s 193.49.133.0/24 -j ACCEPT
$IPTABLES  -A FORWARD -s 0/0 -d 0/0 -j ACCEPT

#on autorise le DNS
$IPTABLES  -A FORWARD -m state --state ESTABLISHED,RELATED --protocol udp --source-port 53 -j ACCEPT

$IPTABLES  -A FORWARD -m state --state ESTABLISHED,RELATED --protocol tcp --source-port 53 -j ACCEPT

#$IPTABLES  -t nat -A POSTROUTING -s 10.8.18.0/24 -j SNAT --to-source 193.49.133.234

#Par défaut, les clients n'ont pas de profil particulier et arrivent sur le tunel 10.8.1.0 : acces a graal
#$IPTABLES  -A FORWARD -i tun+ -s 10.8.1.0/24 -d 193.49.133.112 -p tcp -m tcp -m multiport --dports 25,80,110,143,443,389,993 -j ACCEPT

#!!! clients web A CONFIGURER !!!
#$IPTABLES  -A FORWARD -i tun+ -s 10.8.1.0/24 -p tcp -m tcp -m multiport --dports 25,53,80,110,143,443,389,993 -j ACCEPT

#Acces complet au LAN de la DR pour les admins:
#$IPTABLES  -A FORWARD -i tun0 -s 10.8.18.0/24 -d 193.49.133.0/24 -j ACCEPT
$IPTABLES  -A FORWARD -i tun0 -s 0/0 -j ACCEPT
}
# 

# loopback
#
lo() {
       $IPTABLES -A INPUT  -i $INTERF_LOOPBACK -j ACCEPT
       $IPTABLES -A OUTPUT -o $INTERF_LOOPBACK -j ACCEPT
}
#
# Security
#
security() {
       # no spoofing
       if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]
       then
       for filtre in /proc/sys/net/ipv4/conf/*/rp_filter
         do
         echo 1 > $filtre
       done
       fi
       # no icmp
       echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
       echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
}
#
# Start firewall
#
firewall_start() {
       drop_all
       security
       lo
       wan
       }
#
# Stop firewall
#
firewall_stop() {
       $IPTABLES -F
       $IPTABLES -t nat -F
       $IPTABLES -X
       $IPTABLES -t nat -X
       $IPTABLES -P INPUT ACCEPT
       $IPTABLES -P OUTPUT ACCEPT
       $IPTABLES -P FORWARD ACCEPT
}
 
#
#Firewal status
#
firewall_status() {
       $IPTABLES -L
       }
case "$1" in
   start)
       echo "Starting firewall"
       firewall_start
       ;;
   stop)
       echo "Stoping firewall"
       firewall_stop
       ;;
   restart)
       echo "Stoping firewall"
       firewall_stop
       echo "Starting firewall"
       firewall_start
       ;;
   status)
       echo "Firewall iptables status"
       firewall_status
       ;;
   *)
       echo "Usage :/etc/init.d/firewall {start|stop|restart|status}"
       exit 1
       ;;
esac

exit 0


Ajout du script au demarrage du serveur :

# update-rc.d firewall defaults


Configuration d'un client

Sous windows

Installer openvpn-Gui

Exporter son certificat CNRS depuis Firefox avec toutes les AC installées et cochées

Le placer dans C:\Program Files\OpenVPN\config\prenom.nom.p12 avec le fichier ta.key


Fichier de config :

client
 
dev tun

proto udp
remote vpn.dr13.cnrs.fr 4500
resolv-retry infinite
 
nobind
persist-key
persist-tun
 
pkcs12 "C:\\Program Files\\OpenVPN\\config\\ton certificat.p12"
 
tls-remote vpn.dr13.cnrs.fr 
tls-auth "C:\\Program Files\\OpenVPN\\config\\ta.key" 1

comp-lzo

verb 3