Configuration du serveur VPN FDN

La configuration FDN du VPN est finalement relativement simple. On a un fichier serveur.conf

# en option, addresse sur laquelle écouter
#local IPlocale

port 1194

# On veut aussi de l'ipv6
proto tcp6-server

dev tun
tun-ipv6
push tun-ipv6
ca /etc/ssl/private/star.fdn.fr.chain
cert /etc/ssl/private/star.fdn.fr.crt
key /etc/ssl/private/star.fdn.fr.key

# à générer avec openssl dhparam -out dh2048.pem 2048
dh dh2048.pem

# le serveur piochera 179.1 pour lui.
server 80.67.179.0 255.255.255.0 nopool
ifconfig-ipv6 2001:910:1301::1/64 2001:910:1301::1
# Tout le monde est dans le même subnet
topology subnet

# C'est là qu'openvpn trouvera la configuration remontée du Radius
client-config-dir ccd

# pour les clients qui sauraient le prendre en compte
push "dhcp-option DNS 80.67.169.12"
push "dhcp-option DNS 80.67.169.40"

# détecter la perte de connexion de la même façons des deux côtés
ping 5
ping-exit 60
push "ping 5"
push "ping-restart 60"

persist-key
persist-tun

# De quoi regarder l'état des connexions
status /var/log/openvpn-status.log 1

# le client s'authentifiera juste par le plugin radius
client-cert-not-required
username-as-common-name
plugin /usr/lib/openvpn/radiusplugin.so /etc/openvpn/radiusplugin.cnf

# des scripts pour modifier le routage
script-security 2
client-connect /etc/openvpn/client-connect
client-disconnect /etc/openvpn/client-disconnect

# De quoi tuer une connexion avec
# socat /var/run/openvpn.management.serveur EXEC:"echo kill foo@vpn.fdn.fr"
management-client-user root
management /var/run/openvpn.management.serveur unix

Ça c'était pour le TCP. Pour l'udp, on a le même avec juste proto tcp6-server en moins, des chemins de log et de socket de management différents, et en plus:

proto udp6
# quand le client déconnecte, autant prévenir le serveur, ça permet de pouvoir se reconnecter tout de suite
push "explicit-exit-notify"

Ensuite on a la configuration radius

NAS-Identifier=vpn
Service-Type=5
Framed-Protocol=1
NAS-Port-Type=5
NAS-IP-Address=IPlocale
OpenVPNConfig=/etc/openvpn/serveur.conf

VPN option "--server NETWORK NETMASK"
subnet=255.255.252.0
p2p6=2001:910:1301::1

overwriteccfiles=true

server
{
    acctport=1813
    authport=1812
    name=IPduradius
    retry=1
    wait=1
    sharedsecret=lepasswd
}

À noter que le subnet n'est pas le même que dans la conf openvpn. C'est celui-ci qui sera réellement poussé vers le client en fait. Dans le cas de FDN, on met les ADSL et les VPN dans le même /22. On a donné 179 à openvpn juste pour qu'il utilise 179.1 comme IP de passerelle.

Le plugin radius fera du coup l'authentification, et l'autorisation va remonter les infos d'adresses IP et de routes (cf la vidéo afférente). Ça sera du coup écrit dans le fichier ccd, Framed-IP-Address va produire un ifconfig-push 80.67.179.7 255.255.252.0 par exemple. Pour l'IPv6 par contre, Framed-IPv6-Address est encore en draft, et n'est pas supporté de base, il faut appliquer les patchs http://lists.nongnu.org/archive/html/radiusplugin-devel/2013-03/msg00001.html et http://comments.gmane.org/gmane.network.openvpn.devel/7607

Enfin, puisqu'on veut que bird route les /32 et /128 un par un pour pouvoir avoir plusieurs serveurs, on utilise les scripts:

client-connect

#!/bin/sh
set -e
[ -z "$ifconfig_pool_remote_ip" ] || ip route add $ifconfig_pool_remote_ip/32 dev $dev proto static
[ -z "$ifconfig_ipv6_pool_remote_ip" ] || ip route add $ifconfig_ipv6_pool_remote_ip/128 dev $dev proto static

client-disconnect

#!/bin/sh
set -e
[ -z "$ifconfig_pool_remote_ip" ] || ip route del $ifconfig_pool_remote_ip/32 dev $dev proto static || true
[ -z "$ifconfig_ipv6_pool_remote_ip" ] || ip route del $ifconfig_ipv6_pool_remote_ip/128 dev $dev proto static || true