===== 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]]