Outils pour utilisateurs

Outils du site


OpenVPN : configuration tun avec authentification PAM

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

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 ici.

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 <IP_du_serveur> 443
resolv-retry infinite
auth-nocache
remote-cert-tls server
nobind
persist-key
persist-tun
ca ca.crt
cert <client>.crt
key <client>.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 ici


0 Comments

Comments :