Installation serveur vpn
Sommaire
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
########################################### # /etc/openvpn/server.conf # ########################################### # Adresse d'ecoute : local 193.49.133.234 # 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 # Ne pas divulguer ce fichier # 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 #push "route 193.49.133.0 255.255.255.0" push "redirect-gateway" 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 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 # 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