Lorsque l’on souhaite mettre à disposition des employés un VPN, il est important de savoir qui l’utilise. Il existe évidement le log habituel, mais pas très pratique dans la majorité des cas.

Pour savoir qui est connecté en temps réel, on peut déjà utiliser cette option dans la configuration serveur l’OpenVPN :

status /var/log/openvpn-status.log

Mais c’est encore mieux d’être averti par mail en live que quelqu’un se connecte à notre VPN OpenVPN !

Il faut ajouter ces 3 lignes dans le fichier de configuration serveur OpenVPN :

script-security 2
client-connect /usr/local/bin/openvpn-notify.sh
client-disconnect /usr/local/bin/openvpn-notify.sh

Cela permet à OpenVPN de faire appel à ces scripts lors d’une connexion ou déconnexion d’un client. Dans mon cas, c’est le même script, car des variables d’environnement permettent d’obtenir l’action (connect ou disconnect) et de gérer l’action désirée dans le script.

Les variables d’environnement servent à passer les paramètres d’OpenVPN dont on a besoin dans notre script. Il existe une liste liste impressionnante, voir le man d’openvpn à la section Environmental Variables.

Celles que j’ai utilisées :

  • $script_type : permet de récupérer l’action client-connect ou client-disconnect
  • $config : permet de récupérer le chemin absolut de la configuration vpn (pratique si on dispose de plusieurs VPN afin de les distinguer)
  • $common_name : le nom du client openvpn afin de savoir qui s’y connecte
  • $trusted_ip : l’IP publique par laquelle le client se connecte au VPN
  • $ifconfig_remote : l’IP interne du VPN obtenue par le client

Je vous livre mon script « tout fait qui va bien » dans la suite de cet article, il est personnalisable et sous licence GPLv3.

Dans ce script les fonctions connect-action et disconnect-action sont personnalisables.

Dans mon cas je n’utilise que la notification mail appelée dans une autre fonction. openvpn-notify.sh.

#!/bin/bash
# Auteur : Belgotux
# Site : www.monlinux.net
# Adresse : 
# Version : 1.0
# Date : 08-03-2015
# Licence : GPLv3
# Changelog : 
# Description : 
#   use openvpn local environment variable, see openvpn man
#   In your server config file :
#    client-connect /usr/local/bin/openvpn-notify.sh
#    client-disconnect /usr/local/bin/openvpn-notify.sh

MAILTO=root

function connect-action () {
    mail-notify
}

function disconnect-action () {
    mail-notify
}

function mail-notify () {
    (echo "
    action = $script_type
    VPN = $config
    Common name = $common_name
    Public IP address = $trusted_ip
    VPN get address = $ifconfig_remote"
    ) | mail -s "$script_type $(basename $config .conf) $common_name" $MAILTO
    return $?
}

case $script_type in

    client-connect)
        connect-action
    ;;

    client-disconnect)
        disconnect-action
    ;;

    *)
    exit 0
    ;;
esac


exit 0

On fait un reload d’openvpn pour les options serveur rajoutées et voilà.