mirroir readonly du Gitit wiki.evolix.org (attention, ne rien commiter/merger sur ce dépôt) https://wiki.evolix.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

439 lines
13 KiB

5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
4 years ago
5 years ago
4 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
4 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
4 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
  1. ---
  2. categories: vpn sysadmin security network
  3. title: Howto OpenVPN
  4. ...
  5. * Documentation : <https://openvpn.net/index.php/open-source/documentation.html>
  6. [OpenVPN](https://openvpn.net/) permet de monter des tunnels [VPN](https://fr.wikipedia.org/wiki/Réseau_privé_virtuel) (Virtual Private Network) en utilisant [SSL/TLS](HowtoSSL) pour le chiffrement. Pour l'authentification, OpenVPN peut utiliser une simple clé partagée (PSK — Pre-Shared Key) ou des couples *utilisateur*/*mot de passe*, mais nous préférons utiliser des certificats avec une [PKI](https://fr.wikipedia.org/wiki/Infrastructure_%C3%A0_cl%C3%A9s_publiques) (Public Key Infrastructure).
  7. ## Installation
  8. ### Debian
  9. ~~~
  10. # apt install openvpn
  11. $ /usr/sbin/openvpn --version
  12. OpenVPN 2.4.0 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Jul 18 2017
  13. library versions: OpenSSL 1.0.2l 25 May 2017, LZO 2.08
  14. # systemctl status openvpn
  15. ● openvpn.service - OpenVPN service
  16. Loaded: loaded (/lib/systemd/system/openvpn.service; enabled)
  17. Process: 20889 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
  18. Main PID: 20889 (code=exited, status=0/SUCCESS)
  19. CGroup: /system.slice/openvpn.service
  20. ~~~
  21. ### OpenBSD
  22. ~~~
  23. # pkg_add openvpn
  24. $ openvpn --version
  25. OpenVPN 2.4.4 x86_64-unknown-openbsd6.2 [SSL (OpenSSL)] [LZO] [LZ4] [MH/RECVDA] [AEAD] built on Sep 29 2017
  26. library versions: LibreSSL 2.6.3, LZO 2.10
  27. ~~~
  28. ## Configuration serveur
  29. On met en place une PKI sur le serveur via [shellpki](HowtoShellpki) :
  30. ~~~
  31. # mkdir /etc/openvpn/ssl
  32. # git clone https://forge.evolix.org/shellpki.git /etc/openvpn/ssl
  33. # cd /etc/openvpn/ssl
  34. # sh shellpki.sh init
  35. # sh shellpki.sh create
  36. ~~~
  37. Mettre un _Common Name_ du type `fw.vpn.example.com` avec une durée de plusieurs années. Pour plus d'informations, voir [HowtoShellpki](HowtoShellpki)
  38. La configuration se fait via le fichier `/etc/openvpn/server.conf` avec les paramètres suivants à adapter :
  39. * `server` : réseau privé sur lequel le serveur VPN et les clients communiqueront
  40. * `local` : adresse IP du serveur, sur laquelle les clients se connecteront (adresse IP publique généralement)
  41. * `push` : route vers le réseau que les clients VPN pourront joindre
  42. * `cert` : certificat du serveur VPN (créé précédemment)
  43. * `key` : clé du serveur VPN (créée précédemment)
  44. * `ifconfig-pool-persist` : permet aux clients de conserver la même IP en cas de redémarrage
  45. ### Serveur sous Debian
  46. ~~~
  47. #
  48. # General settings
  49. #
  50. user nobody
  51. group nogroup
  52. # Do not try to re-read key file and reopen tun device on restart since it runs
  53. # without root privileges.
  54. persist-key
  55. persist-tun
  56. #persist-remote-ip
  57. #persist-local-ip
  58. # Status file
  59. status /var/log/openvpn/status.log 1
  60. #log /var/log/openvpn/openvpn.log
  61. # Logging verbosity. Logs are sent to syslog.
  62. verb 3
  63. # Keepalive
  64. keepalive 10 120
  65. #reneg-sec 300
  66. #
  67. # Network settings
  68. #
  69. port 1194
  70. proto udp
  71. dev tun
  72. # Enable compression
  73. # comp-lzo
  74. #
  75. # key/certificate
  76. #
  77. ca /etc/openvpn/ssl/ca/cacert.pem
  78. cert /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.crt
  79. key /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.key
  80. dh /etc/openvpn/ssl/ca/dh2048.pem
  81. #
  82. # private network
  83. #
  84. server 192.0.2.0 255.255.0.0
  85. mode server
  86. # Management interface (used by check_openvpn for Nagios)
  87. management 127.0.0.1 1195 /etc/openvpn/management-pwd
  88. ~~~
  89. Générer un mot de passe pour l'accès à l'interface de management (nécessaire au check Nagios) :
  90. ~~~
  91. # apg -n1 -m 12 > /etc/openvpn/management-pwd
  92. ~~~
  93. On peut ensuite utiliser le check Nagios suivant :
  94. ~~~
  95. # apt install libnet-telnet-perl
  96. # /usr/lib/nagios/plugins/check_openvpn.pl -H 127.0.0.1 -p 1195 -P $(cat /etc/openvpn/management-pwd)"
  97. ~~~
  98. ### Serveur sous OpenBSD
  99. ~~~
  100. daemon
  101. port 1194
  102. proto udp
  103. dev tap0
  104. dev-type tap
  105. verb 4
  106. user nobody
  107. group nobody
  108. chroot /var/empty
  109. #comp-lzo
  110. max-clients 50
  111. keepalive 15 120
  112. tls-exit
  113. persist-key
  114. persist-tun
  115. client-to-client
  116. resolv-retry infinite
  117. local 198.51.100.1
  118. server 192.0.2.0 255.255.255.0
  119. #client-to-client
  120. ifconfig-pool-persist /etc/openvpn/ipp.txt
  121. #route-method exe
  122. #route-delay 2
  123. push "route 203.0.113.0 255.255.255.0 192.0.2.1"
  124. ca /etc/openvpn/ssl/ca/cacert.pem
  125. dh /etc/openvpn/ssl/ca/dh2048.pem
  126. cert /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.crt
  127. key /etc/openvpn/ssl/files/fw.vpn.example.com-1278421834/fw.vpn.example.com.key
  128. log /var/log/openvpn.log
  129. status /var/log/openvpn-status.log
  130. cipher AES-128-CBC # AES
  131. #fragment 1350
  132. #mssfix
  133. ~~~
  134. Pour créer automatiquement une interface `TUN` au démarrage de la machine et démarrer OpenVPN :
  135. ~~~
  136. # cat << EOF > /etc/hostname.tun0
  137. up
  138. !/usr/local/sbin/openvpn --daemon --config /etc/openvpn/server.conf
  139. EOF
  140. ~~~
  141. Pour lancer manuellement OpenVPN sans redémarrer la machine :
  142. ~~~
  143. # ifconfig tun0 up
  144. # /usr/local/sbin/openvpn --daemon --config /etc/openvpn/server.conf
  145. ~~~
  146. Pour que les logs générés par OpenVPN soient « rotatés », il faut rajouter la ligne en question dans le fichier `/etc/newsyslog.conf` :
  147. ~~~
  148. /var/log/openvpn.log 600 52 * $W6D4 Z
  149. ~~~
  150. ## Configuration client
  151. Pour simplifier la configuration pour les utilisateurs finaux on peut générer un fichier de configuration embarquant les certificats :
  152. ~~~
  153. client
  154. dev tap0
  155. proto udp
  156. tls-client
  157. remote vpn.example.com 1194
  158. #comp-lzo
  159. nobind
  160. user nobody
  161. group nogroup
  162. #chroot /var/empty
  163. persist-key
  164. persist-tun
  165. max-routes 1000
  166. #cipher AES-128-CBC
  167. <ca>
  168. -----BEGIN CERTIFICATE-----
  169. […]
  170. -----END CERTIFICATE-----
  171. </ca>
  172. <cert>
  173. Certificate:
  174. Data:
  175. […]
  176. -----END CERTIFICATE-----
  177. </cert>
  178. <key>
  179. -----BEGIN RSA PRIVATE KEY-----
  180. […]
  181. -----END RSA PRIVATE KEY-----
  182. </key>
  183. ~~~
  184. ### Nouveau certificat avec shellpki
  185. Pour une nouvelle connexion VPN, il faudra créer un nouveau certificat :
  186. ~~~
  187. # cd /etc/openvpn/ssl
  188. # sh shellpki.sh create
  189. ~~~
  190. * Choisir un _Common Name_ unique pour la machine (ex : `client1.vpn.example.com`)
  191. * Récupérer le certificat et la clé dans `/var/www/htdocs/vpn/ssl`
  192. ### Renouveller un certificat avec shellpki
  193. Il faut le révoquer, puis en recréer un :
  194. ~~~
  195. # cd /etc/openvpn/ssl
  196. # sh shellpki.sh revoke
  197. # sh shellpki.sh create
  198. ~~~
  199. Si c'est le certificat du serveur OpenVPN, il faut en plus modifier la configuration puis relancer le démon.
  200. ### Client sous Linux
  201. Pour démarrer le client OpenVPN, il existe un template systemd, pour le démarrer et l'activer au démarrage :
  202. ~~~
  203. # systemctl start openvpn@client
  204. # systemctl enable openvpn@client
  205. ~~~
  206. ### Client sous Windows
  207. On peut télécharger un client 32 bits ou 64 bits sur <https://openvpn.net/index.php/open-source/downloads.html>.
  208. Une fois installé, copier les fichiers `.ovpn` et le certificat de la CA dans le répertoire de configuration d'OpenVPN, par exemple `C:\Program Files\OpenVPN\config`.
  209. Attention, il faut exécuter OpenVPN en tant qu'administrateur, cela peut se faire via un clic droit : `Exécuter en tant qu'administrateur`.
  210. OpenVPN est alors disponible dans la barre des tâches.
  211. Pour lancer une session, effectuez un clic-droit et sélectionnez `Connecter`.
  212. ### Client sous Mac OS X
  213. Télécharger la dernière version stable de Tunnelblick sur <https://tunnelblick.net/downloads.html>
  214. On suit les instructions d'installation (en anglais), puis :
  215. * on choisit de générer la configuration (indiquer qu'on n'a pas de fichiers de configuration) ;
  216. * cela génère une configuration standard, notamment un dossier sur le bureau avec un fichier `config.ovpn` ;
  217. * on édite le fichier `config.ovpn` en ajustant les options `remote`, `ca`, `cert` et `key` ;
  218. * on copie également la clé et les certificats (ca et cart) dans ce dossier ;
  219. * on doit ensuite renommer ce dossier avec un nom se terminant par `.tblk` ;
  220. * on « double-clic » ensuite dessus, et cela installe configuration ;
  221. * on peut ensuite lancer le VPN via l'icone présente, puis choisir diverses options (connexion automatique, etc.).
  222. ### Client sous Android
  223. On utilise l'application libre « OpenVPN for Android » disponible sur
  224. [Google Play](https://play.google.com/store/apps/details?id=de.blinkt.openvpn)
  225. et [F-Droid](https://f-droid.org/packages/de.blinkt.openvpn/) qui ne
  226. nécessite pas de droits « root » avec Android 4 ou supérieur.
  227. La configuration d'un VPN nécessite les informations suivantes :
  228. * le certificat CA peut être importé sous format PEM ;
  229. * le certificat client doit être au format PKCS#12 (fichier .p12 ou .pfx), on pourra ainsi le créer à partir de la clé/certificat :
  230. ~~~
  231. $ openssl pkcs12 -export -in goyk3OkjeuPread8Sluld.privacy.example.com.crt -inkey goyk3OkjeuPread8Sluld.privacy.example.com.key -out goyk3OkjeuPread8Sluld.privacy.example.com.p12
  232. ~~~
  233. * décocher « Compression LZO » si ce n'est pas supporté par votre serveur ;
  234. * décocher « Vérification du certificat de l'hôte » (sinon cela ne fonctionne pas a priori…) ;
  235. * forcer « Algorithme de chiffrement » à AES-128-CBC (à ajuster selon votre serveur).
  236. Si erreur `ca md too weak` cela signifie que le certificat utilise du MD5. Pour forcer quand même, il faut mettre dans les options personnalisées :
  237. ~~~
  238. tls-cipher "DEFAULT:@SECLEVEL=0"
  239. ~~~
  240. ### Client sous Apple iOS
  241. Les systèmes iOS d'Apple disposent nativement du support de plusieurs types de VPN (IKEv2, IPsec ou L2TP), mais pas pour OpenVPN. On utilise alors l'application « OpenVPN Connect » (éditée par « OpenVPN Technologies ») qui va exploiter les API bas niveau de l'OS pour un support d'OpenVPN dans les interfaces du système.
  242. Pour ajouter une configuration cliente, il suffit d'ouvrir le fichier `.ovpn`. Il est possible d'avoir plusieurs configurations disponibles.
  243. Pour activer la connexion VPN il faut alors se rendre dans l'application « Réglages », puis « VPN » où sont listés les profils disponibles. On peut choisir celui à utiliser et activer la connexion. Si tout se passe bien, le symbole « VPN » apparaît dans la barre d'icônes tout en haut de l'écran.
  244. ## Erreurs fréquentes
  245. ### Erreur « --crl-verify fails » (serveur OpenVPN – OpenBSD)
  246. ~~~
  247. Options error: --crl-verify fails with 'crl.pem': No such file or directory
  248. Options error: Please correct these errors.
  249. ~~~
  250. Il faut parfois regénérer un fichier CRL.
  251. Si l'on utilise une version récente de [shellpki](https://forge.evolix.org/projects/shellpki) :
  252. ~~~
  253. # cd /tmp
  254. # shellpki.sh crl
  255. # cp crl.pem /var/empty
  256. ~~~
  257. ### Erreur « createipforwardentry » (client OpenVPN – Windows)
  258. En cas d'erreur `ROUTE: route addition failed using createipforwardentry`, l'utilisateur n'a pas les droits suffisants pour ajouter une nouvelle route.
  259. Il faut essayer d'exécuter les logiciels (`openvpn.exe` et `openvpngui.exe`) dans un mode de compatibilité _lancer en Administrateur_. Pour plus de détails, voir <http://www.bolehvpn.net/forum/index.php?topic=1746.0>.
  260. ### Erreur « no more TUN/TAP adapter » (client OpenVPN – Windows)
  261. En cas d'erreur `no more TUN/TAP adapter`, aller dans « Menu démarrer » → « OpenVPN » → « Add new TUN/TAP Adapter ».
  262. ### Erreur « cipher final failed » (client OpenVPN – Android)
  263. L'erreur `Authentificate/Decrypt packet error: cipher final failed` signifie que l'algorithme de chiffrement n'est pas synchronisé entre le client et le serveur.
  264. Il faut donc ajuster la directive « cipher » sur le client.
  265. ### Erreur « Bad LZO decompression header byte » (client OpenVPN – Android)
  266. L'erreur `Bad LZO decompression header byte` signifie que la compression LZO n'est pas activée sur le serveur, il faut donc désactiver la compression au niveau du client.
  267. ## FAQ
  268. ### Permettre aux clients de conserver la même IP au fil de connexions
  269. #### ipp.txt
  270. Le fichier `ipp.txt` contient une liste des clients et de leur adresse IP afin qu'en cas de redémarrage du serveur,
  271. ils conservent la même adresse.
  272. Dans le `server.conf` ou `server.ovpn` :
  273. ~~~
  274. ifconfig-pool-persist /etc/openvpn/ipp.txt 0
  275. ~~~
  276. Cela rend le fichier `ipp.txt` en lecture seule pour OpenVPN.
  277. Il faudra donc ajouter une nouvelle ligne de la forme `CN,IP` à chaque ajout d'un nouveau client.
  278. #### /etc/openvpn/ccd
  279. Une autre méthode est d'ajouter la directive suivante pour le serveur OpenVPN :
  280. ~~~
  281. client-config-dir /etc/openvpn/ccd
  282. username-as-common-name
  283. ~~~
  284. Le répertoire `/etc/openvpn/ccd/` contient des fichiers avec les _Common Name_ et contenant les adresses IP fixés ainsi :
  285. ~~~
  286. ifconfig-push 172.16.1.1 255.255.0.0
  287. ~~~
  288. ### Authentification via Radius
  289. Il faut installer le plugin :
  290. ~~~
  291. # apt install openvpn-auth-radius
  292. # cp /usr/share/doc/openvpn-auth-radius/examples/radiusplugin.cnf /etc/openvpn/
  293. # openvpn --genkey --secret /etc/openvpn/ta.key
  294. ~~~
  295. On ajoute dans la configuration du serveur :
  296. ~~~
  297. client-cert-not-required
  298. username-as-common-name
  299. tls-auth ta.key 0
  300. topology subnet
  301. plugin /usr/lib/openvpn/radiusplugin.so /etc/openvpn/radiusplugin.cnf
  302. status /var/log/openvpn/status.log 1
  303. ~~~
  304. et on modifie le paramètre _sharedsecret_ du fichier `/etc/openvpn/radiusplugin.cnf` pour se connecter au serveur Radius.
  305. Puis dans la configuration du client :
  306. ~~~
  307. auth-user-pass
  308. #auth-user-pass /etc/openvpn/passwd
  309. auth-nocache
  310. ~~~