===== OpenVPN : configuration tun avec authentification PAM =====
{{:reseaux:vpn:openvpn.png?nolink&200 |}}
Il y a tellement de configuration différente d'OpenVPN, selon les besoins, je vous présente une configuration le mode TAP(routé).\\
Qui peut être intéressante, en plus il y a une partie authentification qui se fait directement sur le serveur avec le module PAM, que j'ai ajouté.\\
Voici, le schéma de principe suivant\\
{{ ::reseau_vpn_route.jpeg?nolink |}}
Avec c'est article vous obtiendrez un réseau sécurisé, votre sorti Internet sera celle de votre serveur OpenVPN et les différents clients pourront se voir.
Pour l'installation, la génération et gestion des certificats, je vous invite [[reseaux:vpn:1.installation_openvpn|ici]].
~~READMORE~~
==== Création du fichier de configuration serveur : ====
mode server #pas de surprise
port 443 #par défaut le port 1194, mais pour passer dans les hôtels, proxy, ..., c'est mieux
proto tcp #par défaut c'est udp, mais pour la raison du dessus mettre le protocole TCP, pour faire genre on surf en https
dev tun #il existe 2 type de VPN tun (en gros mode router) et tap (en gros mode pont)
ca ca.crt
cert server.crt
key server.key # ce fichier doit rester secret c'est la clé RSA privé du serveur
dh dh.pem
server 10.8.0.0 255.255.255.0 #pour le DHCP
ifconfig-pool-persist ipp.txt #pour pouvoir suivre les IP distribué
client-to-client #Pour que vos clients puisse se voir intéressant quand on veut faire une LAN, que de souvenir^^
plugin /usr/local/lib/openvpn/plugins/openvpn-plugin-auth-pam.so login # pour activer l'authentification des utilisateurs, si c'est pas le bon chemin pour vous faire find / -name *auth-pam.so
username-as-common-name # Pour vérifier l'authentification, utilisez le nom d'utilisateur authentifié comme nom commun, plutôt que le nom commun du certificat client.
keepalive 10 120 #Une directive d'aide conçu pour simplifier l'expression de --ping et --ping-redémarrage dans des configurations en mode serveur.
cipher AES-256-CBC # AES
push "redirect-gateway def1 bypass-dhcp" #permet de rediriger0 tous le trafic des clients vers le tunnel
push "dhcp-option DNS 208.67.222.222" #permet de pousser d'autres serveur DNS sur les clients
push "dhcp-option DNS 208.67.220.220"
comp-lzo #Utiliser la compression LZO rapide
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn-status.log
log-append /var/log/openvpn.log
verb 3
mute 20
==== lancer openvpn server : ====
openvpn --daemon --writepid /var/run/openvpn.pid --cd /etc/openvpn --config server.conf
Voici un script qui vous permettra de lancer le ''daemon'' ou de le stopper.
#!/bin/bash
### BEGIN INIT INFO
# Provides: openvpn
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: openvpn
### END INIT INFO
name=openvpn
bin=/usr/local/sbin/${name}
dir=/etc/${name}
pid=/var/run/${name}.pid
config=server.conf
start () {
$bin --daemon --writepid $pid --cd $dir --config $config
}
stop () {
killall -TERM $name
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: ${IPTABLES} {start|stop|restart}"
;;
esac
Pour que ce script soit présent au démarrage faire :
update-rc.d openvpn default
==== parti routage du serveur : ====
Pour commencer on va activer le ''forward des packets'' sous Linux :
echo 1 > /proc/sys/net/ipv4/ip_forward
Pour que la modification soit prise au redémarrage du serveur :
vim /etc/sysctl.conf
Puis vous dé-commenté la ligne ''net.ipv4.ip_forward'' et on ajoute 1 :
net.ipv4.ip_forward=1
Et pour finir il nous faudra masquer les IPs pour que les clients puissent sortir sur l'accès Internet de votre serveur pour cela on utilise ''iptables''
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Pour que la modification soit prise au redémarrage du serveur, il faut donc faire un script, j'ai une méthode que certain diront, c'est compliqué, mais inspiré de ce qui existe sous RedHat pour gérer cela, j'aime LOL.
Cela consiste à faire une sauvegarde des règle ''iptables'' dans par exemple ''/etc'' avec un nom de fichier par exemple ''iptables'' qui servira de fichier de configuration et pour finir on fera un script qui va gérer nos règles (start|stop|restart|save).
quand je met **stop** et **start** on ne stop pas réellement ''iptables'' on purge les règles ou on charge les règles ''iptables''
Donc on commence par faire une sauvegarde de nos règles ''iptables''
iptables-save > /etc/iptables
Et voici, mon script de gestion des règles iptables à mettre dans ''/etc/init.d/iptables'':
#! /bin/sh
### BEGIN INIT INFO
# Provides: iptables
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: iptables
### END INIT INFO
IPTABLES=iptables
IPTABLES_DATA=/etc/$IPTABLES
. /lib/lsb/init-functions
if [ ! -x /sbin/$IPTABLES ]; then
log_daemon_msg "${IPTABLES}: /sbin/$IPTABLES does not exist."
err=1
case "$err" in
0) log_end_msg 0;;
*) log_end_msg 1; exit 1;;
esac
fi
flush_n_delete() {
for table in "filter" "nat"
do
#Flush firewall rules.
$IPTABLES -t $table -F
#Delete firewall chains.
$IPTABLES -t $table -X
#Set counter to zero.
$IPTABLES -t $table -Z
done
}
set_policy() {
#set policy for configured tables.
policy=$1
for table in "filter" "nat"
do
if [ $table = "filter" ]
then
for chain_filter in "INPUT" "OUTPUT" "FORWARD"
do
$IPTABLES -t $table -P $chain_filter $policy
done
fi
if [ $table = "nat" ]
then
for chain_nat in "PREROUTING" "INPUT" "OUTPUT" "POSTROUTING"
do
$IPTABLES -t $table -P $chain_nat $policy
done
fi
if [ $table = "nat" ]
then
for chain_nat in "PREROUTING" "INPUT" "OUTPUT" "POSTROUTING"
do
$IPTABLES -t $table -P $chain_nat $policy
done
fi
done
}
start() {
if [ ! -f "$IPTABLES_DATA" ]
then
log_daemon_msg "$IPTABLES_DATA is not existe"
err=1
case "$err" in
0) log_end_msg 0;;
*) log_end_msg 1; exit 1;;
esac
fi
log_daemon_msg "load the rules and chains."
$IPTABLES-restore < $IPTABLES_DATA
case "$?" in
0) log_end_msg 0;;
*) log_end_msg 1; exit 1;;
esac
}
stop() {
log_daemon_msg "Set default chain policy to ACCEPT."
set_policy ACCEPT
case "$?" in
0) log_end_msg 0;;
*) log_end_msg 1; exit 1;;
esac
log_daemon_msg "flush the rules and delete chains."
flush_n_delete
case "$?" in
0) log_end_msg 0;;
*) log_end_msg 1; exit 1;;
esac
}
save() {
if [ ! -f "$IPTABLES_DATA" ]
then
log_daemon_msg "$IPTABLES_DATA is not existe"
err=1
case "$err" in
0) log_end_msg 0;;
*) log_end_msg 1;;
esac
fi
log_daemon_msg "saving firewall rules to $IPTABLES_DATA"
$IPTABLES-save > $IPTABLES_DATA
chmod 600 $IPTABLES_DATA
case "$?" in
0) log_end_msg 0;;
*) log_end_msg 1; exit 1;;
esac
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
save)
save
;;
*)
echo $"Usage: ${IPTABLES} {start|stop|restart|save}"
;;
esac
Pour que ce script soit présent au démarrage faire :
update-rc.d iptables default
==== Voici la configuration d'un client pour ce genre de VPN: ====
client
dev tun
proto tcp
remote 443
resolv-retry infinite
auth-nocache
remote-cert-tls server
nobind
persist-key
persist-tun
ca ca.crt
cert .crt
key .key
auth-user-pass
cipher BF-CBC #mettre le même algo de chiffrement logique
comp-lzo
verb 3
mute 20
Pour des raisons de digestion, j'ai segmenté l'article, car comme je l'ai précisé, il existe plusieurs configurations d'OpenVPN, pour la partie gestion de la PKI [[reseaux:vpn:1.installation-openvpn|ici]]