« Mise en place d'un VPN avec OpenVPN » : différence entre les versions

Aller à la navigation Aller à la recherche
aucun résumé des modifications
Aucun résumé des modifications
 
(17 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
[[category:serveur]]
[[category:serveur]]
[[category:debian]]
[[category:debian]]
[[Category:networking]]
[[Category:VPN]]
[[Category:Openvpn]]
'''<span style="color: red;">Tuto plus du tout à jour</span>'''
[[Category:toupdate]]


=Prérequis=
=Prérequis=
Ligne 29 : Ligne 35 :
==Génération des certificats==
==Génération des certificats==


Modifiez votre fichier <code>/etc/ssl/openssl.cnf</code> :
Modifiez votre fichier <code>/etc/ssl/openssl.cnf</code> en y ajoutant le bloc suivant :
<pre>
<pre>
[VPN_SERVER]
[VPN_SERVER]
Ligne 44 : Ligne 50 :
Nous allons maintenant générer le certificat du serveur openvpn puis le signer avec notre autorité vpn_ca :
Nous allons maintenant générer le certificat du serveur openvpn puis le signer avec notre autorité vpn_ca :
<pre>
<pre>
openssl req -nodes -newkey rsa:2048 -keyout vpn.csnu.org.key -out vpn.csnu.org.req
openssl req -nodes -newkey rsa:2048 -keyout vpn.domain.tld.key -out vpn.domain.tld.req
openssl ca -name vpn_ca -extensions VPN_SERVER -in vpn.csnu.org.req -out vpn.csnu.org.pem
openssl ca -name vpn_ca -extensions VPN_SERVER -in vpn.domain.tld.req -out vpn.domain.tld.pem
</pre>
</pre>


Ligne 56 : Ligne 62 :
<pre>
<pre>
mkdir /etc/openvpn/ssl
mkdir /etc/openvpn/ssl
mv vpn.csnu.org.* /etc/openvpn/ssl/
mv vpn.domain.tld.* /etc/openvpn/ssl/
mv dh2048.pem /etc/openvpn/ssl/
mv dh2048.pem /etc/openvpn/ssl/
</pre>
</pre>
Ligne 63 : Ligne 69 :
<pre>cat /etc/ssl/root_ca/root_ca.pem /etc/ssl/onyx_ca/onyx_ca.pem /etc/ssl/vpn_ca/vpn_ca.pem > /etc/openvpn/ssl/ca_chain.pem</pre>
<pre>cat /etc/ssl/root_ca/root_ca.pem /etc/ssl/onyx_ca/onyx_ca.pem /etc/ssl/vpn_ca/vpn_ca.pem > /etc/openvpn/ssl/ca_chain.pem</pre>


Nous allons enfin générer une clé TLS pour bloquer les attaques DoS ainsi que le floot UDP en créant un firewall HMAC :
Nous allons enfin générer une clé TLS pour bloquer les attaques DoS ainsi que le flood UDP en créant un firewall HMAC :
<pre>openvpn --genkey --secret /etc/openvpn/ssl/ta.key</pre>
<pre>openvpn --genkey --secret /etc/openvpn/ssl/ta.key</pre>


Ligne 83 : Ligne 89 :
#configuration ssl  
#configuration ssl  
ca /etc/openvpn/ssl/ca_chain.pem
ca /etc/openvpn/ssl/ca_chain.pem
cert /etc/openvpn/ssl/vpn.csnu.org.pem
cert /etc/openvpn/ssl/vpn.domain.tld.pem
key /etc/openvpn/ssl/vpn.csnu.org.key
key /etc/openvpn/ssl/vpn.domain.tld.key
dh /etc/openvpn/ssl/dh2048.pem
dh /etc/openvpn/ssl/dh2048.pem


Ligne 112 : Ligne 118 :
Pour l'instant, nous avons une configuration fonctionnelle, mais pas parfaite. En effet, nous avons créé une autorité de certification dédié à l'émission de certificats vpn, mais n'importe quel certificat signé par l'un des parents de cette autorité sera autorisé à se connecter. Par exemple, si vous signez un certificat client au moyen de l'autorité root_ca, ce certificat sera reconnu comme valide par openvpn (car du point de vue du protocole SSL, il l'est).
Pour l'instant, nous avons une configuration fonctionnelle, mais pas parfaite. En effet, nous avons créé une autorité de certification dédié à l'émission de certificats vpn, mais n'importe quel certificat signé par l'un des parents de cette autorité sera autorisé à se connecter. Par exemple, si vous signez un certificat client au moyen de l'autorité root_ca, ce certificat sera reconnu comme valide par openvpn (car du point de vue du protocole SSL, il l'est).


Si vous n'avez qu'un seul serveur cela ne devrait pas poser de problème. Mais si vous en avez plusieurs il est possible que l'autorité root_ca soit sur un serveur, alors que l'autorité vpn_ca soit sur un autre serveur et seul ce dernier serveur devrait être capable d'émettre un certificat client pour notre vpn (sinon, pourquoi créer tant d'autorité ? :)).<br />
Si vous n'avez qu'un seul serveur cela ne devrait pas poser de problème. Mais si vous en avez plusieurs il est possible que l'autorité root_ca soit sur un serveur, alors que l'autorité vpn_ca soit sur un autre serveur, or, seul ce dernier serveur devrait être capable d'émettre un certificat client pour notre vpn (sinon, pourquoi créer tant d'autorités ? :)).<br />
De même, le problème se pose si vous utilisez un certificat commercial que vous avez acheté (chez thawte par exemple). Étant donné que vous êtes obligé de préciser à openvpn le certificat root de thawte, toutes personnes ayant elle aussi un certificat thawte pourra se connecter à votre vpn (ce n'est pas exactement vrai étant donné que nous avons créé une clé tls propre à notre serveur (directive <code>tls-auth</code>)).
De même, le problème se pose si vous utilisez un certificat commercial que vous avez acheté (chez thawte par exemple). Étant donné que vous êtes obligé de préciser à openvpn le certificat root de thawte, toutes personnes ayant elle aussi un certificat thawte pourra se connecter à votre vpn (ce n'est pas exactement vrai étant donné que nous avons créé une clé tls propre à notre serveur (directive <code>tls-auth</code>)).


Ligne 137 : Ligne 143 :


Par exemple :
Par exemple :
<pre>C=01, ST=Epsilon Eridani System, L=Reach, O=UNSC, OU=Office of Naval Intelligence, CN=UNSC VPN CA/emailAddress=plop@csnu.org</pre>
<pre>C=01, ST=Epsilon Eridani System, L=Reach, O=UNSC, OU=Office of Naval Intelligence, CN=UNSC VPN CA/emailAddress=plop@domain.tld</pre>
devient :
devient :
<pre>/C=01/ST=Epsilon_Eridani_System/L=Reach/O=UNSC/OU=Office_of_Naval_Intelligence/CN=UNSC_VPN_CA/emailAddress=plop@csnu.org</pre>
<pre>/C=01/ST=Epsilon_Eridani_System/L=Reach/O=UNSC/OU=Office_of_Naval_Intelligence/CN=UNSC_VPN_CA/emailAddress=plop@domain.tld</pre>


Créez le fichier <code>/etc/openvpn/allow.sh</code> contenant les lignes suivantes (adaptez la définissions des trois variables en fonction des noms des certificats que vous venez de transformer)  :
Créez le fichier <code>/etc/openvpn/allow.sh</code> contenant les lignes suivantes (adaptez la définissions des trois variables en fonction des noms des certificats que vous venez de transformer)  :
Ligne 172 : Ligne 178 :


Ainsi, un certificat client émis par l'autorité root ou onyx se verra refuser la connexion, malgré qu'il soit valide du point de vue ssl.
Ainsi, un certificat client émis par l'autorité root ou onyx se verra refuser la connexion, malgré qu'il soit valide du point de vue ssl.
==Gestion des CRLs==


=Configuration du client openvpn=
=Configuration du client openvpn=
Ligne 214 : Ligne 222 :
===Onglet Adresse IP===
===Onglet Adresse IP===
Cliquez sur la barre déroulante indiquant <code>Réglage de base</code> et sélectionnez <code>Routes</code>. Cochez la case <code>Utilisez uniquement pour les ressources de cette connexion</code>.
Cliquez sur la barre déroulante indiquant <code>Réglage de base</code> et sélectionnez <code>Routes</code>. Cochez la case <code>Utilisez uniquement pour les ressources de cette connexion</code>.
=Rediriger certains ports vers le VPN=
==Modifications sur le serveur==
Pour commencer, nous allons activer le forwarding ipv4. Modifiez le fichier <code>/etc/sysctl.conf</code> :
<pre>
net.ipv4.ip_forward=1
</pre>
Surtout ne touchez pas à <code>net.ipv6.conf.all.forwarding</code>
Validez vos modifications :
<pre>sysctl -p</pre>
Vous pouvez vérifier l'état du forwarding dans le fichier <code>/proc/sys/net/ipv4/ip_forward</code>
<pre>cat /proc/sys/net/ipv4/ip_forward</pre>
Il ne reste plus qu'a ajouter une règle iptables afin de rediriger le trafic vers l'une des ips de sortie de votre serveur (nat)
<pre>iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j  SNAT --to-source <adresse ip></pre>
Si vous préférez préciser l'interface plutôt que l'adresse ip :
<pre>iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE</pre>
A titre d'information, vous pouvez lister vos règles nat avec :
<pre>iptables -t nat --list</pre>
En cas d'erreur, vous pouvez remettre votre nat à zero avec :
<pre>iptables -t nat -F POSTROUTING</pre>
==Modifications sur le client==
Nous allons supposer que votre vpn vous a attribué l'ip 10.8.0.6 et que votre adresse ptp est 10.8.0.5.
Pour commencer, désactivez la validation d'adresse source sur l'interface vpn tun0 :
<pre>
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.tun0.rp_filter=0
</pre>
Nous allons ensuite marquer les paquets reçus par l'interface eth0 destinés au port 80 (http) :
<pre>iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 0x1</pre>
Nous faisons de même avec les paquets émis par le routeur vers internet :
<pre>iptables -t mangle -A OUTPUT -o eth0 -p tcp --dport 80 -j MARK --set-mark 0x1</pre>
Ensuite, nous allons router les paquets marqués avec une table de routage alternative (100) qui ne sera utilisée que pour les paquets marqués :
<pre>ip rule add fwmark 0x1 table 100</pre>
Il faut ensuite créer une route par défaut pour la table alternative :
<pre>ip route add default dev tun0 via 10.8.0.5 table 100</pre>
Enfin, NATer l'adresse source avec l'adresse que notre vpn nous a attribué :
<pre>iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to 10.8.0.6</pre>
=Rediriger la totalité de son trafic réseau vers le VPN=
==Modifications sur le serveur==
Pour commencer, nous allons activer le forwarding ipv4. Modifiez le fichier <code>/etc/sysctl.conf</code> :
<pre>
net.ipv4.ip_forward=1
</pre>
Surtout ne touchez pas à <code>net.ipv6.conf.all.forwarding</code>
Validez vos modifications :
<pre>sysctl -p</pre>
Vous pouvez vérifier l'état du forwarding dans le fichier <code>/proc/sys/net/ipv4/ip_forward</code>
<pre>cat /proc/sys/net/ipv4/ip_forward</pre>
Il ne reste plus qu'a ajouter une règle iptables afin de rediriger le trafic vers l'une des ips de sortie de votre serveur (nat)
<pre>iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j  SNAT --to-source <adresse ip></pre>
Si vous préférez préciser l'interface plutôt que l'adresse ip :
<pre>iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE</pre>
A titre d'information, vous pouvez lister vos règles nat avec :
<pre>iptables -t nat --list</pre>
En cas d'erreur, vous pouvez remettre votre nat à zero avec :
<pre>iptables -t nat -F POSTROUTING</pre>
==Modifications sur le client==
===KDE4 et networkmanager===
Dans l'onglet <code>adresse ip</code>, cliquez sur la barre déroulante indiquant <code>Réglage de base</code> et sélectionnez <code>Routes</code>. Décochez la case <code>Utilisez uniquement pour les ressources de cette connexion</code>.
4 203

modifications

Menu de navigation