Linux:Configuration d'un serveur VPN sur un VPS hébergé
But
Installer et configurer un VPN avec OpenVPN sur un VPS (Virtual Private server) hébergé.
Le VPS étant le serveur VPN, l'idée est de donner un accès sécurisé au VPS et entre tous les clients qui s'y connectent. L'accès internet restera local et ne passera pas par le VPS.
Cette configuration permet de relier les différents réseaux de 2 ou plusieurs sites géographiques et le VPS entre-eux. Cela revient à tirer un câble virtuel de chaque site géographique vers le VPS qui joue le rôle de routeur.
Étape préliminaire
Avant de commencer, il est impératif:
- de disposer d'un VPS linux avec possibilité d'activer un adaptateur TUN/TAP;
- et d'avoir procédé à l'installation d'OpenSSL sur ce VPS.
Installation
Taper la commande suivante pour installer OpenVPN sur une CentOS/RedHat/Fedora:
yum install openvpn
Ce tutoriel a été fait avec la version 2.3.10 d'OpenVPN.
Configuration
- Commencer par activer l'adaptateur TUN/TAP de votre VPS (en principe cette option est accessible à travers le panneau de contrôle de votre VPS).
- Connectez-vous à votre VPS et assurez-vous d'avoir le device /dev/net/tun.
- Activer le routage en modifiant ou en créant la ligne suivante dans le fichier /etc/sysctl.conf:
net.ipv4.ip_forward = 1
- Appliquer les changements:
sysctl -p
- Redémarrer votre VPS via son panneau de contrôle
- Créer la clé et le certificat SSL du serveur OpenVPN en vous assurant d'avoir:
- un CN correspondant au nom ou à l'adresse IP que les clients VPN utiliseront pour joindre le VPS;
- un keyUsage avec uniquement digitalSignature et keyEncipherment;
- un extendedKeyUsage avec serverAuth;
- et un nsCertType avec server.
- Générer la clé Diffie hellman (peut prendre quelques minutes):
openssl dhparam -out /etc/openvpn/dh2048.pem 2048
- Générer la clé du HMAC firewall:
openvpn --genkey --secret /etc/openvpn/ta.key
- Récupérer le fichier exemple suivant:
cp /usr/share/doc/openvpn-*/sample/sample-config-files/server.conf /etc/openvpn
- Editer le fichier /etc/openvpn/server.conf pour qu'il ressemble à ceci:
# Port et protocole d'écoute port 1194 proto udp # Mode routeur dev tun # Clés et certificats CA et serveur (précédemment générés) ca /etc/pki/CA/cacert.pem cert /etc/pki/CA/certs/vps-server.pem key /etc/pki/CA/private/vps-server.key # Clé Diffie hellman (précédemment générée) dh /etc/openvpn/dh2048.pem # Topologie du réseau topology subnet # Réseau VPN server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt # Configuration réseau des clients client-config-dir ccd route 192.168.0.0 255.255.255.0 10.8.0.10 route 192.168.1.0 255.255.255.0 10.8.0.10 route 192.168.2.0 255.255.255.0 10.8.0.10 route 192.168.3.0 255.255.255.0 10.8.0.10 route 192.168.5.0 255.255.255.0 10.8.0.11 # Directive keepalive keepalive 10 120 # Clé du HMAC firewall tls-auth /etc/openvpn/ta.key 0 # Compression comp-lzo # Utilisateur/groupe du démon ;user nobody ;group nobody # Options de persistances persist-key persist-tun # Logs log-append /var/log/openvpn/openvpn.log verb 3 mute 20
- Créer le répertoire ccd qui va contenir la configuration réseau de chaque client VPN:
mkdir /etc/openvpn/ccd
- Créer le fichier ccd/siteA.minetti.org pour le 1er client (le nom devra correspondre au CN du certificat SSL du client):
ifconfig-push 10.8.0.10 255.255.255.0 push "route 192.168.5.0 255.255.255.0 10.8.0.1" iroute 192.168.0.0 255.255.255.0 iroute 192.168.1.0 255.255.255.0 iroute 192.168.2.0 255.255.255.0 iroute 192.168.3.0 255.255.255.0
- De même, créer le fichier ccd/siteB.minetti.org pour le 2ème client:
ifconfig-push 10.8.0.11 255.255.255.0 push "route 192.168.0.0 255.255.255.0 10.8.0.1" push "route 192.168.1.0 255.255.255.0 10.8.0.1" push "route 192.168.2.0 255.255.255.0 10.8.0.1" push "route 192.168.3.0 255.255.255.0 10.8.0.1" iroute 192.168.5.0 255.255.255.0
- On créé le répertoire des logs:
mkdir /var/log/openvpn chown nobody.nobody /var/log/openvpn
- On créé le fichier /etc/logrotate.d/openvpn pour la rotation des logs:
/var/log/openvpn/openvpn.log { rotate 7 missingok compress delaycompress notifempty create 644 nobody nobody }
- On démarre OpenVPN pour qu'il s'initialise:
systemctl start openvpn@server
- Les logs doivent ressembler à ceci:
Tue Apr 12 15:36:13 2016 OpenVPN 2.3.10 x86_64-redhat-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Jan 4 2016 Tue Apr 12 15:36:13 2016 library versions: OpenSSL 1.0.1e-fips 11 Feb 2013, LZO 2.06 Tue Apr 12 15:36:13 2016 Diffie-Hellman initialized with 2048 bit key Tue Apr 12 15:36:13 2016 Control Channel Authentication: using '/etc/openvpn/ta.key' as a OpenVPN static key file Tue Apr 12 15:36:13 2016 Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication Tue Apr 12 15:36:13 2016 Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication Tue Apr 12 15:36:13 2016 Socket Buffers: R=[133120->133120] S=[133120->133120] Tue Apr 12 15:36:13 2016 ROUTE_GATEWAY ON_LINK IFACE=venet0 HWADDR=00:00:00:00:00:00 Tue Apr 12 15:36:13 2016 TUN/TAP device tun0 opened Tue Apr 12 15:36:13 2016 TUN/TAP TX queue length set to 100 Tue Apr 12 15:36:13 2016 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0 Tue Apr 12 15:36:13 2016 /usr/sbin/ip link set dev tun0 up mtu 1500 Tue Apr 12 15:36:13 2016 /usr/sbin/ip addr add dev tun0 10.8.0.1/24 broadcast 10.8.0.255 Tue Apr 12 15:36:13 2016 /usr/sbin/ip route add 192.168.0.0/24 via 10.8.0.10 Tue Apr 12 15:36:13 2016 /usr/sbin/ip route add 192.168.1.0/24 via 10.8.0.10 Tue Apr 12 15:36:13 2016 /usr/sbin/ip route add 192.168.2.0/24 via 10.8.0.10 Tue Apr 12 15:36:13 2016 /usr/sbin/ip route add 192.168.3.0/24 via 10.8.0.10 Tue Apr 12 15:36:13 2016 /usr/sbin/ip route add 192.168.5.0/24 via 10.8.0.11 Tue Apr 12 15:36:13 2016 UDPv4 link local (bound): [undef] Tue Apr 12 15:36:13 2016 UDPv4 link remote: [undef] Tue Apr 12 15:36:13 2016 MULTI: multi_init called, r=256 v=256 Tue Apr 12 15:36:13 2016 IFCONFIG POOL: base=10.8.0.2 size=252, ipv6=0 Tue Apr 12 15:36:13 2016 IFCONFIG POOL LIST Tue Apr 12 15:36:13 2016 Initialization Sequence Completed
- Vérifier que le routage du VPS sont correctes:
# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.5.0 10.8.0.11 255.255.255.0 UG 0 0 0 tun0 192.168.3.0 10.8.0.10 255.255.255.0 UG 0 0 0 tun0 192.168.2.0 10.8.0.10 255.255.255.0 UG 0 0 0 tun0 192.168.1.0 10.8.0.10 255.255.255.0 UG 0 0 0 tun0 10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0 192.168.0.0 10.8.0.10 255.255.255.0 UG 0 0 0 tun0 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 venet0 0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 venet0
- Si tout est correcte, modifier le fichier /etc/openvpn/server.conf pour décommenter les lignes suivantes:
# Utilisateur/groupe du démon user nobody group nobody
- Redémarrer OpenVPN:
systemctl restart openvpn@server
- Et rendre son démarrage automatique:
systemctl enable openvpn@server
- Appliquer la règle suivante à iptables pour autoriser les connexions venant de chacun de vos clients VPN (W.X.Y.Z est l'adresse IP du client):
iptables -A INPUT -s W.X.Y.Z -p udp --dport 1194 -j ACCEPT
- Appliquer les règles suivantes à iptables pour ouvrir les services de votre VPS à votre réseau local (ici on autorise IMAP, SMTP, LDAP, les services NetBIOS et ICMP):
iptables -N local-network-vpn iptables -A local-network-vpn -p tcp --dport imap -j ACCEPT iptables -A local-network-vpn -p tcp --dport smtp -j ACCEPT iptables -A local-network-vpn -p tcp --dport ldap -j ACCEPT iptables -A local-network-vpn -p tcp --dport 137:139 -j ACCEPT iptables -A local-network-vpn -p udp --dport 137:139 -j ACCEPT iptables -A local-network-vpn -p tcp --dport 1512 -j ACCEPT iptables -A local-network-vpn -p udp --dport 1512 -j ACCEPT iptables -A local-network-vpn -p tcp --dport 445 -j ACCEPT iptables -A local-network-vpn -p udp --dport 445 -j ACCEPT iptables -A local-network-vpn -p icmp -j ACCEPT iptables -A local-network-vpn -j RETURN iptables -A INPUT -i tun0 -j local-network-vpn
- Appliquer les règles suivantes à iptables pour autoriser les routages des requêtes venant du VPN (pour communiquer entre clients):
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i tun0 -o tun0 -j ACCEPT
- Sauvegarder vos règles:
iptables-save > /etc/sysconfig/iptables
Test
Pour tester le serveur VPN, le mieux est d'installer un client VPN sur un poste Windows.