Linux:Configuration d'un serveur VPN sur un VPS hébergé

De WIKI.minetti.org
Révision de 12 avril 2016 à 15:35 par Jp (discussion | contributions) (Page créée avec « == But == Installer et configurer un VPN avec [https://openvpn.net OpenVPN] sur un VPS (Virtual Private server) hébergé. Le VPS étant le serveur VPN, l'idée est de do... »)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)
Aller à : navigation, rechercher

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.