{"id":631,"date":"2009-09-23T14:56:27","date_gmt":"2009-09-23T12:56:27","guid":{"rendered":"http:\/\/michauko.org\/blog\/?p=631"},"modified":"2012-11-10T19:12:12","modified_gmt":"2012-11-10T17:12:12","slug":"openvpn-les-doigts-dans-le-nez","status":"publish","type":"post","link":"https:\/\/michauko.org\/blog\/openvpn-les-doigts-dans-le-nez-631\/","title":{"rendered":"OpenVPN les doigts dans le nez"},"content":{"rendered":"<p>Mmmmm, j&rsquo;angoissais \u00e0 l&rsquo;id\u00e9e d&rsquo;installer \u00e0 nouveau un serveur OpenVPN en urgence (psychose de la grippe A-H1N1-truc oblige, &lsquo;faut que le p\u00e9kin lambda puisse bosser \u00e0 distance&#8230;). En effet, la g\u00e9n\u00e9ration des certificats, ce genre de trucs, \u00e7a m&rsquo;\u00e9nerve, je ne me souviens jamais des lignes de commandes.<br \/>\nRenseignements pris, \u00e7a tombe bien, les choses ont d\u00fb \u00e9volu\u00e9 depuis&#8230; euh&#8230; la derni\u00e8re fois. Et le projet OpenVPN fournit un bel outil \u00ab\u00a0easy-rsa\u00a0\u00bb pour g\u00e9n\u00e9rer facilement les clefs serveurs, client, les inscrire dans la base de clefs autoris\u00e9es, les r\u00e9voquer etc.<br \/>\nCa rend OpenVPN installable et exploitable facilement en 10 minutes + le temps de faire un peu de firewalling propre \u00e0 votre configuration (et de prendre un caf\u00e9).<\/p>\n<p>Toujours \u00e0 mon habitude, j&rsquo;essaye d&rsquo;utiliser ce qu&rsquo;a fait Debian pour moi. Point de compilation, de cr\u00e9ation de machin-bidule \u00e0 la main lorsque ce n&rsquo;est pas une absolue n\u00e9cessit\u00e9.<\/p>\n<p>Pour le contexte, on va dire que le VPN va \u00eatre install\u00e9 sur une machine de type passerelle Internet-LAN. Pourquoi pas une Debian avec shorewall et 2 pattes : loc, net (et $FW of course). Je parlerai rapidement des modifications de firewall \u00e0 la fin. Vous pouvez trouver une introduction \u00e0 shorewall sur <a href=\"https:\/\/michauko.org\/docs\/debian_testing\/\">ma doc d&rsquo;initiation \u00e0 Debian<\/a>.<!--more--><\/p>\n<p>Je vais d\u00e9velopper en 3 parties : <del datetime=\"2009-09-22T15:20:38+00:00\">th\u00e8se, anti-th\u00e8se, foutaises, comme disait mon prof de philo au si\u00e8cle dernier <\/del>installation, param\u00e9trage du serveur, param\u00e9trage du client, firewalling. Ca fait 4 ? bien, au moins y&rsquo;en a qui suivent.<\/p>\n<p>Let&rsquo;s go.<\/p>\n<h1>Installation de l&rsquo;outil<\/h1>\n<p>Ca devient presque rasoir, on commence direct dans le feu de l&rsquo;action :<\/p>\n<pre>aptitude install openvpn<\/pre>\n<p>Tout descend par d\u00e9pendances, comme d&rsquo;habitude.<br \/>\nJe n&rsquo;ai pas pris de notes, mais je pense qu&rsquo;\u00e0 ce niveau l\u00e0 d\u00e9j\u00e0, une interface r\u00e9seau \u00ab\u00a0tun0\u00a0\u00bb est cr\u00e9\u00e9e. Le futur sous-r\u00e9seau du VPN est 10.0.8.x. Le serveur n&rsquo;est pas lanc\u00e9 car il n&rsquo;a aucune conf. Ca veut dire <code>\/etc\/openvpn\/<\/code> vide ou pas loin. Et c&rsquo;est tant mieux.<\/p>\n<h1>Param\u00e9trage serveur<\/h1>\n<h2>Rappel : permissions<\/h2>\n<p>On va jouer avec les clefs crypt\u00e9es et les clefs publiques d&rsquo;un outil donnant acc\u00e8s \u00e0 l&rsquo;int\u00e9rieur de votre r\u00e9seau. Faites un peu attention aux permissions des fichiers.<\/p>\n<blockquote><p>Clef priv\u00e9e = permission limit\u00e9e au niveau de l&rsquo;OS, root:root + chmod 600<br \/>\nClef publique = root:root + chmod 644<br \/>\nCe qui ne concerne que le service et son lancement = root:root + chmod 640\n<\/p><\/blockquote>\n<p><em>Notez que le service openvpn sera lanc\u00e9 par root m\u00eame s&rsquo;il tournera au nom d&rsquo;un utilisateur \u00ab\u00a0openvpn\u00a0\u00bb.<\/em><\/p>\n<p>Traditionnellement, les clefs priv\u00e9es ont un nom en .key, les certificats publics en .crt.<br \/>\nNotez bien les permissions de votre conf OpenVPN <strong>lorsqu&rsquo;on l&rsquo;aura mont\u00e9 <\/strong>et gardez \u00e7a \u00e0 l&rsquo;esprit tout le long :<\/p>\n<pre>serveur:\/etc\/openvpn# ls -l\r\ntotal 40\r\n-rw-r--r-- 1 root root  1176 2009-09-14 14:46 ca.crt\r\n-rw------- 1 root root   245 2009-09-14 14:47 dh1024.pem\r\n-rw------- 1 root root    16 2009-09-23 08:23 ipp.txt\r\n-rw------- 1 root root   232 2009-09-23 08:32 openvpn-status.log\r\n-rw-r----- 1 root root 10560 2009-09-22 17:02 server.conf\r\n-rwxr-xr-x 1 root root  1352 2008-09-18 00:33 update-resolv-conf\r\n-rw-r--r-- 1 root root  3813 2009-09-14 14:46 vpnserveur.crt\r\n-rw------- 1 root root   887 2009-09-14 14:46 vpnserveur.key<\/pre>\n<p>En r\u00e9sum\u00e9, seules la clef publique de l&rsquo;autorit\u00e9 de certification et la clef publique du serveur doivent \u00eatre publiques.<\/p>\n<h2>Pr\u00e9sentation rapide de easy-rsa<\/h2>\n<p>\u00ab\u00a0easy-rsa\u00a0\u00bb est un ensemble de scripts simplifiant votre vie pour g\u00e9rer les certificats. Que ce soient ceux du serveur pour cr\u00e9er sa configuration ou ceux de vos postes clients.<br \/>\n<em>Vous savez aussi sans doute qu&rsquo;il vous faudra g\u00e9rer votre base de certificats autoris\u00e9s (et surtout r\u00e9voqu\u00e9s). Lorsque le portable de votre coll\u00e8gue est oubli\u00e9 dans le train, il est int\u00e9ressant d&rsquo;\u00eatre mis au courant dans la seconde pour r\u00e9voquer le certificat en question. Sinon c&rsquo;est la porte d&rsquo;entr\u00e9e dans l&rsquo;entreprise, suivant le profil du <del datetime=\"2009-09-22T15:34:07+00:00\">voleur <\/del>type qui a trouv\u00e9 le portable.<\/em><br \/>\nCet outil descend avec OpenVPN et l&rsquo;ensemble des scripts se situe dans <code>\/usr\/share\/doc\/openvpn\/examples\/easy-rsa\/2.0\/<\/code>. Il y a une version 1.0. J&rsquo;ai opt\u00e9 pour la 2.0. Je ne me suis pas trop document\u00e9 sur le sujet.<\/p>\n<p>Il y a un tout petit peu de param\u00e9trage \u00e0 faire sur easy-rsa.<br \/>\nJe recommande de dupliquer le fichier <code>\/usr\/share\/doc\/openvpn\/examples\/easy-rsa\/2.0\/vars<\/code> en <code>\/usr\/share\/doc\/openvpn\/examples\/easy-rsa\/2.0\/vars.maconf<\/code> et de travailler dedans.<br \/>\nJe vous montre un \u00ab\u00a0diff\u00a0\u00bb entre le fichier d&rsquo;origine et le mien. C&rsquo;est le minimum syndical \u00e0 renseigner :<\/p>\n<pre>serveur:\/usr\/share\/doc\/openvpn\/examples\/easy-rsa\/2.0# diff -h vars vars.maconf\r\n64,68c64,68\r\n< export KEY_COUNTRY=\"US\"\r\n< export KEY_PROVINCE=\"CA\"\r\n< export KEY_CITY=\"SanFrancisco\"\r\n< export KEY_ORG=\"Fort-Funston\"\r\n< export KEY_EMAIL=\"me@myhost.mydomain\"\r\n---\r\n> export KEY_COUNTRY=\"FR\"\r\n> export KEY_PROVINCE=\"France\"\r\n> export KEY_CITY=\"Petaouana\"\r\n> export KEY_ORG=\"MaBoite\"\r\n> export KEY_EMAIL=\"adminvpn@maboite.fr\"<\/pre>\n<p><strong>Notez : pour utiliser les scripts Easy-RSA, il faut \u00e0 chaque fois positionner les variables d&rsquo;environnement du fichier <code>vars.maconf<\/code>. Donc, \u00e0 chaque nouvelle session dans laquelle vous jouez avec les scripts easy-rsa, il faudra commencer par la commande suivante :<\/strong><\/p>\n<pre>. \/usr\/share\/doc\/openvpn\/examples\/easy-rsa\/2.0\/vars.maconf #sans oublier le point au d\u00e9but !!!<\/pre>\n<p>.<\/p>\n<p>Le r\u00e9pertoire o\u00f9 sont stock\u00e9es les clefs g\u00e9n\u00e9r\u00e9es (et d&rsquo;autres choses, liste de certificats, certificats r\u00e9voqu\u00e9s etc) est le sous-r\u00e9pertoire <code>keys\/<\/code>. Inutile de pr\u00e9ciser (?) que ce r\u00e9pertoire doit \u00eatre archi-prot\u00e9g\u00e9 :<\/p>\n<pre>serveur:\/usr\/share\/doc\/openvpn\/examples\/easy-rsa\/2.0# ls -ld keys\r\ndrwx------ 2 root root 4096 2009-09-14 18:22 keys<\/pre>\n<p>Enfin, la premi\u00e8re fois uniquement (ou tant que vous testez), vous pouvez nettoyer ce r\u00e9pertoire via la commande <code>.\/clean-all<\/code>.<\/p>\n<h2>Cr\u00e9ation de l&rsquo;autorit\u00e9 de certification<\/h2>\n<p>Maintenant que vos \u00ab\u00a0variables\u00a0\u00bb sont pr\u00eates et charg\u00e9es dans votre session, on attaque.<br \/>\nBien \u00e9videmment, cette manip n&rsquo;est \u00e0 faire qu&rsquo;une fois. Seule la manip de cr\u00e9ation de certificats pour vos clients (postes clients) sont \u00e0 faire X fois.<br \/>\nL&rsquo;autorit\u00e9 de certification est \u00ab\u00a0un nom et des clefs\u00a0\u00bb signant vos certificats. Un exemple connu est Verisign. Ici, on va signer nous-m\u00eame. Sur un serveur web, \u00e7a ferait des warnings de certificats bidouilleux, ici on s&rsquo;en fout.<\/p>\n<pre>.\/build-ca<\/pre>\n<p>Vous obtenez le baratin standard de g\u00e9n\u00e9ration de clefs, lisez ce qui y est dit et renseignez le \u00ab\u00a0Common Name\u00a0\u00bb. Le reste doit descendre du fait du fichier \u00ab\u00a0vars\u00a0\u00bb charg\u00e9 au pr\u00e9alable. <strong>Pour \u00ab\u00a0Common Name\u00a0\u00bb, mettez le nom de votre serveur.<\/strong><\/p>\n<h2>Cr\u00e9ation de la clef Diffie-Hellman<\/h2>\n<p>La <a href=\"http:\/\/fr.wikipedia.org\/wiki\/%C3%89change_de_cl%C3%A9s_Diffie-Hellman\">clef Diffie-Hellman<\/a> est une clef permettant au client et au serveur de s&rsquo;entendre sur une clef secr\u00e8te pour crypter la conversation.<br \/>\nSi je me souviens bien, les clefs publiques\/priv\u00e9es servent \u00e0 l&rsquo;initialisation de la communication, mais, \u00e9tant lourdes en calculs, on opte pour un cryptage plus simple pour le reste de la communication. C&rsquo;est la clef DH. En gros hein. Et pardon aux puristes. Ou dites moi si je me trompe compl\u00e8tement.<\/p>\n<p>On la g\u00e9n\u00e8re comme suit, gr\u00e2ce aux script Easy-RSA :<\/p>\n<pre>.\/build-dh<\/pre>\n<p>Rien \u00e0 saisir, \u00e7a prend juste un peu de temps.<\/p>\n<h2>G\u00e9n\u00e9ration du certificat serveur<\/h2>\n<p>On continue, pour le dernier \u00e9l\u00e9ment du serveur : sa propre clef.<\/p>\n<pre>.\/build-key-server mon_serveur.fr<\/pre>\n<p>(trop cool les scripts Easy-RSA non ?)<br \/>\nCa sort aussi le baratin standard de g\u00e9n\u00e9ration de clefs. Vous devrez pr\u00e9ciser le \u00ab\u00a0Common Name\u00a0\u00bb, \u00e9ventuellement un mot de passe (je ne l&rsquo;ai pas fait, je suppose qu&rsquo;il demanderait du coup un mot de passe au lancement du service openvpn ; \u00e7a peut \u00eatre contraignant lors de reboot).<br \/>\nPar d\u00e9faut, votre certificat sera valable 10 ans.<br \/>\nCa termine par l&rsquo;inscription du certificat dans la \u00ab\u00a0base\u00a0\u00bb :<\/p>\n<pre>1 out of 1 certificate requests certified, commit? [y\/n]y\r\nWrite out database with 1 new entries\r\nData Base Updated<\/pre>\n<h2>Cr\u00e9ation des certificats d&rsquo;un client<\/h2>\n<p>Rappel : lorsque plus tard, vous cr\u00e9erez un autre certificat pour un autre PC, pensez \u00e0 \u00ab\u00a0sourcer\u00a0\u00bb le fichier <code>vars.maconf<\/code>.<br \/>\nLe script de g\u00e9n\u00e9ration se lance comme suit :<\/p>\n<pre>.\/build-key pc123<\/pre>\n<p>Je sugg\u00e8re un nom \u00e9loquent rappelant ou bien le PC, ou bien la personne.<br \/>\nL\u00e0 non plus, rien de sorcier : le \u00ab\u00a0Common Name\u00a0\u00bb sera le nom du PC et vous \u00ab\u00a0committez\u00a0\u00bb le certificat.<\/p>\n<h2>Cr\u00e9ation des certificats d&rsquo;un client avec mot de passe<\/h2>\n<p>Tout pareil que le paragraphe du dessus, mais le script est <code>.\/build-key-pass pc123<\/code><br \/>\nIl faudra alors renseigner le mot de passe l\u00e0 :<\/p>\n<pre>Enter PEM pass phrase:\r\nVerifying - Enter PEM pass phrase:<\/pre>\n<p>Rien \u00e0 voir avec le \u00ab\u00a0<code>Challenge password<\/code>\u00a0\u00bb demand\u00e9 plus tard.<\/p>\n<h2>La r\u00e9vocation de certificats<\/h2>\n<p>Si \u00e0 ce niveau l\u00e0 de la configuration on n&rsquo;a pas besoin de r\u00e9voquer des certificats, \u00e7a deviendra obligatoire \u00e0 mesure que les utilisateurs arriveront, partiront et perdront leur PC portables. Evidemment que c&rsquo;est du v\u00e9cu \ud83d\ude42<br \/>\nLa commande Easy-RSA est :<\/p>\n<pre>.\/revoke-full pc123<\/pre>\n<p>Il faut copier le fichier r\u00e9sultant, <strong>apr\u00e8s chaque r\u00e9vocation<\/strong> :<\/p>\n<pre>cp keys\/crl.pem \/etc\/openvpn\/<\/pre>\n<p>Ce fichier est lu d\u00e8s l&rsquo;instant que vous avez mis en place l&rsquo;option \u00ab\u00a0crl-verify\u00a0\u00bb dans votre fichier de conf serveur (voir plus haut).<br \/>\nNotez aussi qu&rsquo;il est relu \u00e0 chaque tentative de connexion. Pas besoin de recharger OpenVPN apr\u00e8s une r\u00e9vocation. <strong>Juste de recopier le fichier \u00e0 jour.<\/strong> Si vous pensez faire un lien symbolique, attention aux permissions (c&rsquo;est l&rsquo;utilisateur openvpn qui fait tourner openvpn). Je n&rsquo;ai pas test\u00e9 la solution par lien symbolique.<\/p>\n<p>Vous pourrez consulter la liste des certificats r\u00e9voqu\u00e9s gr\u00e2ce \u00e0 la commande :<\/p>\n<pre>openssl crl -in \/chemin\/vers\/keys\/crl.pem -text<\/pre>\n<p><em>CRL = Certificate Revocation List<\/em><\/p>\n<h2>Lancement du service<\/h2>\n<p>A ce niveau l\u00e0, on a g\u00e9n\u00e9r\u00e9 tout ce qu&rsquo;il faut, mais le service ne tourne pas.<br \/>\nLe contenu de votre sous-r\u00e9pertoire keys ressemble \u00e0 \u00e7a :<\/p>\n<pre>serveur:\/usr\/share\/doc\/openvpn\/examples\/easy-rsa\/2.0# ls -l keys\/\r\ntotal 80\r\n-rw-r--r-- 1 root root  3813 2009-09-14 14:06 01.pem\r\n-rw-r--r-- 1 root root  3698 2009-09-14 14:29 02.pem\r\n-rw-r--r-- 1 root root  1176 2009-09-14 14:03 ca.crt\r\n-rw------- 1 root root   887 2009-09-14 14:03 ca.key\r\n-rw-r--r-- 1 root root  3698 2009-09-14 14:29 client_test.crt\r\n-rw-r--r-- 1 root root   668 2009-09-14 14:29 client_test.csr\r\n-rw------- 1 root root   887 2009-09-14 14:29 client_test.key\r\n-rw-r--r-- 1 root root   245 2009-09-14 14:32 dh1024.pem\r\n-rw-r--r-- 1 root root   205 2009-09-14 14:29 index.txt\r\n-rw-r--r-- 1 root root    20 2009-09-14 14:29 index.txt.attr\r\n-rw-r--r-- 1 root root    21 2009-09-14 14:06 index.txt.attr.old\r\n-rw-r--r-- 1 root root   101 2009-09-14 14:06 index.txt.old\r\n-rw-r--r-- 1 root root     3 2009-09-14 14:29 serial\r\n-rw-r--r-- 1 root root     3 2009-09-14 14:06 serial.old\r\n-rw-r--r-- 1 root root  3813 2009-09-14 14:06 vpnserveur.crt\r\n-rw-r--r-- 1 root root   664 2009-09-14 14:05 vpnserveur.csr\r\n-rw------- 1 root root   887 2009-09-14 14:05 vpnserveur.key<\/pre>\n<p>On y retrouve les clefs de l&rsquo;autorit\u00e9 de certification (<code>ca*<\/code>), le certificat serveur (<code>vpnserveur.crt<\/code> et <code>vpnserveur.key<\/code>) et un futur poste client (<code>client*.[crt|key]<\/code>). <em>Les fichiers .csr sont les demandes de signatures, \u00e9tape interm\u00e9diaire de la cr\u00e9ation des certificats, masqu\u00e9e par l&rsquo;enrobage de commandes d&rsquo;Easy-RSA. Inutile par la suite<\/em><br \/>\nIl faut recopier (<strong>avec les bonnes permissions !!!<\/strong>) les fichiers suivants :<\/p>\n<pre>cp -p dh1024.pem vpnser*crt vpnser*key ca* \/etc\/openvpn<\/pre>\n<p>Ensuite, on va faire tourner le service sous un utilisateur\/groupe sans droit, c&rsquo;est mieux c\u00f4t\u00e9 s\u00e9curit\u00e9.<\/p>\n<pre>groupadd openvpn\r\nuseradd -d \/dev\/null -g openvpn -s \/bin\/false openvpn<\/pre>\n<p>Enfin, il faut cr\u00e9er le fichier de conf du serveur. Un exemple est donn\u00e9 dans le fichier <code>\/usr\/share\/doc\/openvpn\/examples\/sample-config-files\/server.conf.gz<\/code>. Une fois d\u00e9zipp\u00e9 et mis dans <code>\/etc\/openvpn<\/code>, on l&rsquo;adapte.<br \/>\nVoici son contenu, sans les commentaires :<\/p>\n<pre>serveur:\/etc\/openvpn# egrep -v \"^$|^#|^;\" server.conf\r\nport 1194\r\nproto udp\r\ndev tun\r\nca ca.crt\r\ncert vpnserveur.crt\r\nkey vpnserveur.key  # This file should be kept secret\r\ndh dh1024.pem\r\nserver 10.8.0.0 255.255.255.0\r\nifconfig-pool-persist ipp.txt\r\npush \"route 192.168.X.0 255.255.255.0\"\r\npush \"dhcp-option DNS 192.168.X.Y\"\r\npush \"dhcp-option DOMAIN maboite.net\"\r\npush \"dhcp-option WINS 192.168.X.Y\"\r\nkeepalive 10 120\r\ncomp-lzo\r\nuser openvpn\r\ngroup openvpn\r\npersist-key\r\npersist-tun\r\nstatus openvpn-status.log\r\nverb 3\r\n;crl-verify crl.pem # j'ai trich\u00e9, j'ai ajout\u00e9 le \";\" il n'aurait pas d\u00fb sortir vu la commande egrep pass\u00e9e. Voir ci-dessous.<\/pre>\n<p>Les 4 param\u00e8tres <code>push route<\/code> et <code>push dhcp-option<\/code> sont \u00e0 adapter. Ce sont eux qui feront ajouter \u00e0 votre PC client les r\u00e8gles de routages et DNS, domaine (et optionnellement WINS) \u00e0 utiliser. Sinon, point de r\u00e9solution de nom, point de routage depuis votre PC, tant\u00f4t vers sa connexion web, tant\u00f4t vers le VPN.<br \/>\nSuivant la configuration de votre passerelle, le simple ajout de ces <code>push<\/code> ne sera pas suffisant pour permettre \u00e0 vos postes client VPN de rebondir de votre passerelle vers le LAN. Voir plus bas le chapitre d\u00e9di\u00e9.<br \/>\nEnfin, le param\u00e8tre \u00ab\u00a0crl-verify\u00a0\u00bb prendra son importance avec les r\u00e9vocations de certificats (voir plus bas).<strong>Pour l&rsquo;instant, il est en commentaire car j&rsquo;ai not\u00e9 que OpenVPN plantait (volontairement ?) lorsqu&rsquo;on lui dit de tenir compte d&rsquo;une liste de r\u00e9vocation et que cette liste n&rsquo;existe pas, ou est un fichier vide. Ce sera donc \u00e0 activer plus tard, apr\u00e8s votre premi\u00e8re r\u00e9vocation.<\/strong><\/p>\n<p>Ah, j&rsquo;oubliais :<\/p>\n<pre>\/etc\/init.d\/openvpn start<\/pre>\n<p>V\u00e9rifiez dans les logs que tout va bien. Et <code>ifconfig<\/code> qui doit avoir affect\u00e9 une IP \u00e0 tun0, probablement 10.8.0.1.<\/p>\n<h1>Param\u00e9trage client (poste Windows dans mon cas)<\/h1>\n<p>On a g\u00e9n\u00e9r\u00e9 un premier ensembles de clefs d&rsquo;un poste client.<br \/>\nDans le cas d&rsquo;un PC sous Windows (cas \u00e0 mon avis le plus courant lorsqu&rsquo;il s&rsquo;agit de fourni des portables d&rsquo;appoint \u00e0 des utilisateurs distants), installez OpenVPN <a href=\"http:\/\/openvpn.se\/download.html\">avec le GUI<\/a>.<br \/>\nInjectez (par un moyen s\u00fbr, \u00e9viter d&rsquo;envoyer la clef crypt\u00e9e par mail \u00e0 votre destinataire) les fichiers suivants dans le r\u00e9pertoire <code>C:\\Program Files\\OpenVPN\\config<\/code> :<\/p>\n<pre>ca.crt # et pas le .key !!!\r\nclient_test.key\r\nclient_test.crt<\/pre>\n<p>Puis cr\u00e9ez un fichier de configuration client nomm\u00e9 <code>nimportequoi.ovpn<\/code> dans le m\u00eame sous-r\u00e9pertoire <code>config<\/code>. Il contiendra la conf suivante, si on oublie les commentaires :<\/p>\n<pre>client\r\ndev tun\r\nproto udp\r\nremote votre.serveur.vpn.votresociete.fr 1194\r\nresolv-retry infinite\r\nnobind\r\npersist-key\r\npersist-tun\r\nca ca.crt\r\ncert client_test.crt\r\nkey client_test.key\r\ncomp-lzo\r\nverb 3<\/pre>\n<p>Enfin, lancez le GUI d&rsquo;OpenVPN situ\u00e9 dans le sous-r\u00e9pertoire <code>bin\/<\/code> d&rsquo;OpenVPN, bouton droit dans le \u00ab\u00a0system tray\u00a0\u00bb sur l&rsquo;ic\u00f4ne qui vient d&rsquo;apparaitre, menu \u00ab\u00a0Connect\u00a0\u00bb et lisez ce qui passe pour commencer \u00e0 d\u00e9bugger s&rsquo;il y a un hic niveau r\u00e9seau entre le PC portable et le serveur VPN. Attention \u00e0 vos r\u00e8gles de firewalling en vigueur, que vous testiez de l&rsquo;ext\u00e9rieur ou de l&rsquo;int\u00e9rieur (ce qui semble un peu stupide), vous pourriez ne pas \u00eatre en mesure d&rsquo;atteindre le service, d&rsquo;o\u00f9 le chapitre ci-dessous.<\/p>\n<h1>Consid\u00e9rations de firewalling<\/h1>\n<p>Bon l\u00e0, c&rsquo;est bien beau, vous atteignez votre serveur VPN depuis l&rsquo;ext\u00e9rieur, et encore, si vous avez bien ouvert la porte d&rsquo;entr\u00e9e vers le port UDP 1194 de votre serveur.<br \/>\nMais pour l&rsquo;instant, point de rebond vers le LAN. Et heureusement que \u00e7a ne marche pas par d\u00e9faut.<\/p>\n<h2>M\u00e9thode gore pour tester vite fait<\/h2>\n<p>En activant l&rsquo;IP Forwarding \u00e0 la main et en d\u00e9finissant quelques routes entre votre r\u00e9seau VPN et votre LAN, vous obtiendrez vite fait un r\u00e9sultat. Mais c&rsquo;est pas terrible je trouve.<br \/>\nActivation de l&rsquo;IP Forwarding comme un cochon :<\/p>\n<pre>echo 1 > \/proc\/sys\/net\/ipv4\/ip_forward<\/pre>\n<p>Puis d\u00e9finition de routes. Plut\u00f4t que de donner un exemple qui ne sera pas le votre, t\u00e2chez plut\u00f4t de raisonner sur la liste des routes que vous avez et ajoutez celles qu&rsquo;il faut, avec les commandes <code>route<\/code>, <code>route add<\/code> et <code>route delete<\/code>.<\/p>\n<h2>M\u00e9thode r\u00e9fl\u00e9chie pour shorewall<\/h2>\n<p><em>Si vous utilisez iptables, je ne peux rien pour vous. Enfin si, un conseil : songez \u00e0 utiliser shorewall.<\/em><br \/>\nSi vous ne connaissez rien \u00e0 shorewall, c&rsquo;est le moment de vous y mettre. Mais dans ce cas, faites vous la main *avant* d&rsquo;installer le VPN, quand m\u00eame. Voyez <a href=\"https:\/\/michauko.org\/docs\/debian_testing\/\">ma doc Debian<\/a> au besoin, il y a un chapitre consacr\u00e9 \u00e0 shorewall.<br \/>\nSinon, dans une conf shorewall \u00e0 2 pattes (net, loc), on la modifie pour qu&rsquo;elle passe \u00e0 3 pattes. Dans un cas id\u00e9al (mais n\u00e9anmoins courant), \u00e7a se passera comme \u00e7a :<\/p>\n<ul>\n<li>Ajout de la ligne <code>vpn     ipv4<\/code> dans <code>\/etc\/shorewall\/zones<\/code>.<\/li>\n<li>Ajout de la ligne <code>vpn     tun0            detect<\/code> dans <code>\/etc\/shorewall\/interfaces<\/code><\/li>\n<li>Ajout de la ligne <code>eth0    tun0<\/code> dans <code>\/etc\/shorewall\/masq<\/code> pour activer le Masquerading entre votre VPN et votre LAN, ici situ\u00e9 sur l&rsquo;interface eth0<\/li>\n<li>Ajout de toutes les r\u00e8gles par d\u00e9faut dans <code>\/etc\/shorewall\/policy<\/code>, concernant la probable interdiction par d\u00e9faut d&rsquo;aller de n&rsquo;importe quelle zone vers le VPN et r\u00e9ciproquement. Le VPN doit en effet, \u00e0 mon avis, \u00eatre un moyen de secours pour donner acc\u00e8s \u00e0 quelques services internes, pas \u00e0 tout le LAN. A base de <code>vpn loc REJECT info<\/code> + r\u00e9ciproque.<\/li>\n<li>Enfin, le vrai travail, l&rsquo;ouverture du minimum d&rsquo;autorisation entre toutes vos zones et le VPN. J&rsquo;y consacre le paragraphe suivant.<\/li>\n<\/ul>\n<h2>Ouvertures minimum sur le firewall<\/h2>\n<p>En consid\u00e9rant net=eth1 ; loc=eth0 et vpn=tun0, voici ce qu&rsquo;il faudra ajouter au minimum, \u00e0 mon avis :<br \/>\nD\u00e9j\u00e0 l&rsquo;accessibilit\u00e9 du service VPN depuis le NET :<\/p>\n<pre>ACCEPT          net     $FW         udp     openvpn<\/pre>\n<p>Ensuite des r\u00e8gles du VPN vers le LAN :<\/p>\n<pre>ACCEPT          vpn     loc:$dns1      tcp     domain # sinon on ne touche pas le serveur DNS => pas de r\u00e9sol de nom => probl\u00e8me...\r\nACCEPT          vpn     loc:$dns1      udp     domain # je ne sais pas s'il faut le TCP ou l'UDP. Oops.\r\nPing\/ACCEPT     vpn     loc # pratique pour du d\u00e9pannage\r\nACCEPT          vpn     loc:$leserveurapplicatif1 # c'est un exemple\r\nACCEPT          vpn     loc:$leserveurapplicatif2 tcp 80 # un exemple plus restreint, limit\u00e9 au port http\r\n<\/pre>\n<p>Les variables \u00ab\u00a0$dns1\u00a0\u00bb (par exemple), sont \u00e0 d\u00e9finir dans <code>\/etc\/shorewall\/params<\/code>, ou alors vous tapez l&rsquo;IP en dur.<\/p>\n<p>Et enfin quelques acc\u00e8s minimums vers la passerelle elle-m\u00eame :<\/p>\n<pre>Ping\/ACCEPT     $FW     vpn # pratique pour les tests\r\nSSH\/ACCEPT      vpn     $FW # pour les admins tout au moins ?\r\nACCEPT          vpn     $FW     tcp     80 # s'il y a des intranets \u00e0 consulter (outil de supervision, par exemple)\r\n<\/pre>\n<p>A noter aussi, pour le Masquerading, de forcer l&rsquo;activer (valeur \u00ab\u00a0On\u00a0\u00bb) ou de laisser tel quel (valeur \u00ab\u00a0Keep\u00a0\u00bb) l&rsquo;IP forwarding. Ca se passe dans <code>\/etc\/shorewall\/shorewall.conf<\/code>, param\u00e8tre IP_FORWARDING.<br \/>\nIl me semble que c&rsquo;est ce param\u00e8tre qui force ou pas la modification du param\u00e8tre noyau <code>\/proc\/sys\/net\/ipv4\/ip_forward<\/code>. Il me semble.<\/p>\n<p>Voil\u00e0. Ca devrait marcher.<br \/>\nEvidemment, comme c&rsquo;est fortement li\u00e9 \u00e0 toute votre infrastructure r\u00e9seau, tout ce qui pr\u00e9c\u00e8de est plut\u00f4t un guide des trucs-\u00e0-pas-oublier-pour-que-\u00e7a-marche.<\/p>\n<h1>Divers<\/h1>\n<h2>Ce que je n&rsquo;ai pas abord\u00e9<\/h2>\n<ul>\n<li>Testez avant de d\u00e9ployez !!!! notamment les certificats r\u00e9voqu\u00e9s, et avec eux la CRL et l&rsquo;option <code>crl-verify<\/code>.<\/li>\n<li>Il y a une notion de r\u00e8gles de routages param\u00e9trables par certificat client. Ca peut \u00eatre utile.<\/li>\n<li>Vous utilisez Orange Business Everywhere pour votre clef 3G ? attention, \u00e7a semble intercaler un proxy sur votre Internet Explorer. R\u00e9sultat, l&rsquo;acc\u00e8s \u00e0 des Intranets via le VPN ne marchait pas. Firefox passait bien. Je n&rsquo;ai pas creus\u00e9 plus pour l&rsquo;instant.<\/li>\n<\/ul>\n<h2>Comportement lors d&rsquo;une connexion avec un certificat r\u00e9voqu\u00e9 <\/h2>\n<p>C\u00f4t\u00e9 serveur, on voit cette discr\u00e8te ligne dans \/var\/log\/syslog :<\/p>\n<pre>Sep 23 11:57:49 gw ovpn-server[24224]: 192.X.Y.Z:1120 CRL CHECK FAILED: \/C=FR\/ST=France\/L=Petaouana\/O=SOCIETE\/CN=pctest\/emailAddress=adminvpn@chezmoi.fr is REVOKED<\/pre>\n<p>C\u00f4t\u00e9 client, c&rsquo;est moins flagrant, on tourne en rond et tente de se reconnecter.<br \/>\nPeut-\u00eatre qu&rsquo;en montant le niveau de verbosit\u00e9 (param\u00e8tre verb), on en saurait plus. Mais \u00e0 la limite, \u00e7a int\u00e9resse qui ? (\u00e0 part l&rsquo;utilisateur qui s&rsquo;est fait r\u00e9voquer son certificat par erreur).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mmmmm, j&rsquo;angoissais \u00e0 l&rsquo;id\u00e9e d&rsquo;installer \u00e0 nouveau un serveur OpenVPN en urgence (psychose de la grippe A-H1N1-truc oblige, &lsquo;faut que le p\u00e9kin lambda puisse bosser \u00e0 distance&#8230;). En effet, la g\u00e9n\u00e9ration des certificats, ce genre &hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[2,82,389],"tags":[369,368,251,252,185,233,168],"class_list":["post-631","post","type-post","status-publish","format-standard","hentry","category-debian","category-pl","category-reseau-secu","tag-certificat","tag-easy-rsa","tag-firewall","tag-masquerading","tag-openvpn","tag-shorewall","tag-vpn"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>OpenVPN les doigts dans le nez - Le blog de Michauko<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/michauko.org\/blog\/openvpn-les-doigts-dans-le-nez-631\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"OpenVPN les doigts dans le nez - Le blog de Michauko\" \/>\n<meta property=\"og:description\" content=\"Mmmmm, j&rsquo;angoissais \u00e0 l&rsquo;id\u00e9e d&rsquo;installer \u00e0 nouveau un serveur OpenVPN en urgence (psychose de la grippe A-H1N1-truc oblige, &lsquo;faut que le p\u00e9kin lambda puisse bosser \u00e0 distance&#8230;). En effet, la g\u00e9n\u00e9ration des certificats, ce genre &hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/michauko.org\/blog\/openvpn-les-doigts-dans-le-nez-631\/\" \/>\n<meta property=\"og:site_name\" content=\"Le blog de Michauko\" \/>\n<meta property=\"article:published_time\" content=\"2009-09-23T12:56:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-11-10T17:12:12+00:00\" \/>\n<meta name=\"author\" content=\"michauko\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"michauko\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/openvpn-les-doigts-dans-le-nez-631\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/openvpn-les-doigts-dans-le-nez-631\\\/\"},\"author\":{\"name\":\"michauko\",\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/#\\\/schema\\\/person\\\/0cd9f3d9ce4dccc05df81a5b27051ea9\"},\"headline\":\"OpenVPN les doigts dans le nez\",\"datePublished\":\"2009-09-23T12:56:27+00:00\",\"dateModified\":\"2012-11-10T17:12:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/openvpn-les-doigts-dans-le-nez-631\\\/\"},\"wordCount\":2576,\"commentCount\":20,\"keywords\":[\"certificat\",\"easy-rsa\",\"firewall\",\"masquerading\",\"openvpn\",\"shorewall\",\"VPN\"],\"articleSection\":[\"Debian\",\"planet-libre.org\",\"reseau et s\u00e9cu\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/michauko.org\\\/blog\\\/openvpn-les-doigts-dans-le-nez-631\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/openvpn-les-doigts-dans-le-nez-631\\\/\",\"url\":\"https:\\\/\\\/michauko.org\\\/blog\\\/openvpn-les-doigts-dans-le-nez-631\\\/\",\"name\":\"OpenVPN les doigts dans le nez - Le blog de Michauko\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/#website\"},\"datePublished\":\"2009-09-23T12:56:27+00:00\",\"dateModified\":\"2012-11-10T17:12:12+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/#\\\/schema\\\/person\\\/0cd9f3d9ce4dccc05df81a5b27051ea9\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/openvpn-les-doigts-dans-le-nez-631\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/michauko.org\\\/blog\\\/openvpn-les-doigts-dans-le-nez-631\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/openvpn-les-doigts-dans-le-nez-631\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/michauko.org\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"OpenVPN les doigts dans le nez\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/michauko.org\\\/blog\\\/\",\"name\":\"Le blog de Michauko\",\"description\":\"Si tu ne comprends pas le titre de l&#039;article, passe ton chemin\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/michauko.org\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/michauko.org\\\/blog\\\/#\\\/schema\\\/person\\\/0cd9f3d9ce4dccc05df81a5b27051ea9\",\"name\":\"michauko\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c3a8969c185fd0eef3893a15408f3ef1b36a6681a066b1eb32045643c30ba65?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c3a8969c185fd0eef3893a15408f3ef1b36a6681a066b1eb32045643c30ba65?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5c3a8969c185fd0eef3893a15408f3ef1b36a6681a066b1eb32045643c30ba65?s=96&d=mm&r=g\",\"caption\":\"michauko\"},\"sameAs\":[\"http:\\\/\\\/michauko.org\\\/\"],\"url\":\"https:\\\/\\\/michauko.org\\\/blog\\\/author\\\/randomized2\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"OpenVPN les doigts dans le nez - Le blog de Michauko","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/michauko.org\/blog\/openvpn-les-doigts-dans-le-nez-631\/","og_locale":"fr_FR","og_type":"article","og_title":"OpenVPN les doigts dans le nez - Le blog de Michauko","og_description":"Mmmmm, j&rsquo;angoissais \u00e0 l&rsquo;id\u00e9e d&rsquo;installer \u00e0 nouveau un serveur OpenVPN en urgence (psychose de la grippe A-H1N1-truc oblige, &lsquo;faut que le p\u00e9kin lambda puisse bosser \u00e0 distance&#8230;). En effet, la g\u00e9n\u00e9ration des certificats, ce genre &hellip;","og_url":"https:\/\/michauko.org\/blog\/openvpn-les-doigts-dans-le-nez-631\/","og_site_name":"Le blog de Michauko","article_published_time":"2009-09-23T12:56:27+00:00","article_modified_time":"2012-11-10T17:12:12+00:00","author":"michauko","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"michauko","Dur\u00e9e de lecture estim\u00e9e":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/michauko.org\/blog\/openvpn-les-doigts-dans-le-nez-631\/#article","isPartOf":{"@id":"https:\/\/michauko.org\/blog\/openvpn-les-doigts-dans-le-nez-631\/"},"author":{"name":"michauko","@id":"https:\/\/michauko.org\/blog\/#\/schema\/person\/0cd9f3d9ce4dccc05df81a5b27051ea9"},"headline":"OpenVPN les doigts dans le nez","datePublished":"2009-09-23T12:56:27+00:00","dateModified":"2012-11-10T17:12:12+00:00","mainEntityOfPage":{"@id":"https:\/\/michauko.org\/blog\/openvpn-les-doigts-dans-le-nez-631\/"},"wordCount":2576,"commentCount":20,"keywords":["certificat","easy-rsa","firewall","masquerading","openvpn","shorewall","VPN"],"articleSection":["Debian","planet-libre.org","reseau et s\u00e9cu"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/michauko.org\/blog\/openvpn-les-doigts-dans-le-nez-631\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/michauko.org\/blog\/openvpn-les-doigts-dans-le-nez-631\/","url":"https:\/\/michauko.org\/blog\/openvpn-les-doigts-dans-le-nez-631\/","name":"OpenVPN les doigts dans le nez - Le blog de Michauko","isPartOf":{"@id":"https:\/\/michauko.org\/blog\/#website"},"datePublished":"2009-09-23T12:56:27+00:00","dateModified":"2012-11-10T17:12:12+00:00","author":{"@id":"https:\/\/michauko.org\/blog\/#\/schema\/person\/0cd9f3d9ce4dccc05df81a5b27051ea9"},"breadcrumb":{"@id":"https:\/\/michauko.org\/blog\/openvpn-les-doigts-dans-le-nez-631\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/michauko.org\/blog\/openvpn-les-doigts-dans-le-nez-631\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/michauko.org\/blog\/openvpn-les-doigts-dans-le-nez-631\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/michauko.org\/blog\/"},{"@type":"ListItem","position":2,"name":"OpenVPN les doigts dans le nez"}]},{"@type":"WebSite","@id":"https:\/\/michauko.org\/blog\/#website","url":"https:\/\/michauko.org\/blog\/","name":"Le blog de Michauko","description":"Si tu ne comprends pas le titre de l&#039;article, passe ton chemin","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/michauko.org\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/michauko.org\/blog\/#\/schema\/person\/0cd9f3d9ce4dccc05df81a5b27051ea9","name":"michauko","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/5c3a8969c185fd0eef3893a15408f3ef1b36a6681a066b1eb32045643c30ba65?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5c3a8969c185fd0eef3893a15408f3ef1b36a6681a066b1eb32045643c30ba65?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5c3a8969c185fd0eef3893a15408f3ef1b36a6681a066b1eb32045643c30ba65?s=96&d=mm&r=g","caption":"michauko"},"sameAs":["http:\/\/michauko.org\/"],"url":"https:\/\/michauko.org\/blog\/author\/randomized2\/"}]}},"_links":{"self":[{"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/posts\/631","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/comments?post=631"}],"version-history":[{"count":31,"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/posts\/631\/revisions"}],"predecessor-version":[{"id":1368,"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/posts\/631\/revisions\/1368"}],"wp:attachment":[{"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/media?parent=631"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/categories?post=631"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michauko.org\/blog\/wp-json\/wp\/v2\/tags?post=631"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}