{"id":1575,"date":"2014-05-15T16:43:55","date_gmt":"2014-05-15T14:43:55","guid":{"rendered":"http:\/\/blog.sfsoft.it\/?p=1575"},"modified":"2017-02-22T12:46:13","modified_gmt":"2017-02-22T10:46:13","slug":"openvpn-routed-su-voyage-linux","status":"publish","type":"post","link":"http:\/\/www.sfsoft.it\/blog\/2014\/05\/15\/openvpn-routed-su-voyage-linux\/","title":{"rendered":"OpenVPN &#8220;routed&#8221; su Voyage Linux"},"content":{"rendered":"<p>Dopo l&#8217;articolo\u00a0<a title=\"Installare Voyage Linux su un WRAP\/ALIX\" href=\"http:\/\/blog.sfsoft.it\/2014\/05\/11\/installare-voyage-linux-su-un-wrapalix\/\" target=\"_blank\">Installare Voyage Linux su un WRAP\/ALIX<\/a> ora trasformiamo il nostro dispositivo in un server VPN tramite OpenVPN.<\/p>\n<p><strong>Nota<\/strong>: Tutte le operazioni vengono fatte dall&#8217;utente <em>root<\/em>.<\/p>\n<p><strong>Nota 2<\/strong>: Come editor utilizzo <em>nano<\/em> che va installato dato che dopo l&#8217;installazione base di Voyage Linux \u00e8 disponibile unicamente l&#8217;editor <em>vi<\/em>.<\/p>\n<h2>Installazione del server<\/h2>\n<p>Si installa il server:<\/p>\n<pre lang=\"bash\">apt-get install openvpn<\/pre>\n<p>Prepariamo per generare le chiavi:<\/p>\n<pre lang=\"bash\">mkdir \/etc\/openvpn\/easy-rsa\r\ncp \/usr\/share\/doc\/openvpn\/examples\/easy-rsa\/2.0\/* \/etc\/openvpn\/easy-rsa\r\n<\/pre>\n<p>Modifichiamo i parametri di default che verranno utilizzati nella generazione delle chiavi, quindi apriamo il file <em>vars<\/em>:<\/p>\n<pre lang=\"bash\">nano \/etc\/openvpn\/easy-rsa\/vars<\/pre>\n<p>Impostiamo poi\u00a0 i seguenti valori:<\/p>\n<pre lang=\"bash\">export KEY_COUNTRY=\"IT\"\r\nexport KEY_PROVINCE=\"Roma\"\r\nexport KEY_CITY=\"Roma\"\r\nexport KEY_ORG=\"Societ\u00e0 di esempio\"\r\nexport KEY_EMAIL=\"mario@example.com\"\r\nexport KEY_OU=\"Organizzazione di esempio\"<\/pre>\n<h2>Creazione dei certificati per il server<\/h2>\n<p>Procediamo alla generazione dei certificati per il server ( il comando <em>build-dh<\/em> \u00e8 facile che impieghi molto tempo considerate le prestazioni minime del dispositivo ):<\/p>\n<pre lang=\"bash\">cd \/etc\/openvpn\/easy-rsa\/\r\nsource vars\r\n.\/clean-all\r\n.\/build-dh\r\n.\/pkitool --initca\r\n.\/pkitool --server server\r\ncd keys\r\nopenvpn --genkey --secret ta.key\r\ncp server.crt server.key ca.crt dh1024.pem ta.key \/etc\/openvpn\/<\/pre>\n<ul>\n<li>la generazione della chiave <em>ta.key<\/em> serve per i <em>client<\/em> quando effettuano la prima connessione al <em>server<\/em> in modo da avere il permesso per procedere con le fasi di autenticazione, \u00e8 una protezione che gli evita attacchi di tipo <a href=\"http:\/\/it.wikipedia.org\/wiki\/Denial_of_service\" target=\"_blank\"><em>Denial of Service<\/em><\/a> e lascia passare alla fase successiva solo chi \u00e8 effettivamente abilitato;<\/li>\n<\/ul>\n<h2>Creazione dei certificati per i client<\/h2>\n<p>Ora serve generare i certificati per i client che dovranno collegarsi, al posto di <em>hostname<\/em> mettiamo il nome identificativo di ogni <em>client<\/em> in maniera da distinguere poi le chiavi da consegnare ( qui ho preferito usare <em>build-key<\/em> perch\u00e8 \u00e8 in modalit\u00e0 interattiva, quindi per ogni campo della chiave chiede conferma, invece <em>pkitool<\/em> fa tutto in automatico prendendo in valori dal file <em>vars<\/em> ):<\/p>\n<pre lang=\"bash\">cd \/etc\/openvpn\/easy-rsa\/\r\nsource vars\r\n.\/build-key hostname<\/pre>\n<p>Se al certificato per ragioni di sicurezza vogliamo anche associare una password che verr\u00e0 poi richiesta ad ogni connessione occorre dare invece il comando:<\/p>\n<pre lang=\"bash\">.\/build-key-pass hostname<\/pre>\n<p>Al <em>client<\/em> occorre poi fornire i seguenti file e possibilmente \u00e8 bene non mandarli per email ma usare un metodo di copia cifrata tipo <em>scp<\/em> o consegnarli a mano su supporto esterno per evitare che vengano intercettati e utilizzati a nostra insaputa:<\/p>\n<div>\n<ul type=\"disc\">\n<li>\/etc\/openvpn\/ca.crt<\/li>\n<li>\/etc\/openvpn\/easy-rsa\/keys\/hostname.crt<\/li>\n<li>\/etc\/openvpn\/easy-rsa\/keys\/hostname.key<\/li>\n<li>\/etc\/openvpn\/ta.key<\/li>\n<\/ul>\n<p>Questi certificati \u00e8 consigliabile tenerne sempre una copia anche sul <em>server<\/em> in quanto se capitasse la necessit\u00e0 di revocarne uno occorre averlo, in fondo aggiungo le operazioni da eseguire per la revoca.<\/p>\n<h2>Configurazione del server<\/h2>\n<p>Procediamo ora alla configurazione del nostro <em>server<\/em>, modifichiamo il file <em>server.conf<\/em> partendo dall&#8217;esempio fornito dal pacchetto:<\/p>\n<pre lang=\"bash\">cp \/usr\/share\/doc\/openvpn\/examples\/sample-config-files\/server.conf.gz \/etc\/openvpn\/\r\ngzip -d \/etc\/openvpn\/server.conf.gz\r\nnano \/etc\/openvpn\/server.conf<\/pre>\n<p>In questo caso procederemo alla configurazione detta <em>routed<\/em>, la differenza sostanziale tra una <em>bridged<\/em> e una <em>routed<\/em> \u00e8 che la prima funziona come fosse un <em>hub<\/em> o uno <em>switch<\/em> virtuale ( quindi mette in connessione due reti che hanno visibilit\u00e0 di classe di IP tra loro ) mentre la seconda si occupa di far dialogare due reti con classi diverse e quindi impossibilitate a vedersi.<\/p>\n<p>Esiste poi anche una versione chiamiamola <em>base<\/em> che mette in comunicazione solo i <em>client<\/em> della <em>VPN<\/em> tra loro oppure solo verso il <em>server<\/em>, la configurazione \u00e8 molto pi\u00f9 semplice ma per cosa serve a me \u00e8 troppo limitante quindi la ignoro.<\/p>\n<p>Per le differenze nel dettaglio e i vari pro e contro tra i vari metodi rimando alle <a href=\"http:\/\/openvpn.net\/index.php\/open-source.html\" target=\"_blank\">documentazioni ufficiali<\/a>.<\/p>\n<p>Prima di avviare il demone andiamo a modificare il file <em>\/etc\/openvpn\/server.conf<\/em> ( sotto la spiegazione dettagliata ):<\/p>\n<pre lang=\"bash\">port 1194\r\nproto udp\r\ndev tun\r\nca \/etc\/openvpn\/ca.crt\r\ncert \/etc\/openvpn\/server.crt\r\nkey \/etc\/openvpn\/server.key\r\ndh \/etc\/openvpn\/dh1024.pem\r\ntls-auth \/etc\/openvpn\/ta.key 0\r\nserver 10.8.0.0 255.255.255.0\r\n;server-bridge 192.168.8.4 255.255.255.0 192.168.8.128 192.168.8.254\r\npush \"route 192.168.8.0 255.255.255.0\"\r\n;push \"dhcp-option DNS 192.168.8.8\"\r\n;push \"dhcp-option WINS 192.168.8.8\"\r\n;push \"dhcp-option DOMAIN mydomain.loc\"\r\nmax-clients 10\r\nifconfig-pool-persist \/etc\/openvpn\/ipp.txt\r\nlog openvpn.log\r\n;log-append openvpn.log<\/pre>\n<div>\n<ul type=\"disc\">\n<li><strong>port<\/strong>: \u00e8 la porta di ascolto del <em>server VPN<\/em>, ovviamente questa porta va aperta e reindirizzata dal <em>router<\/em>;<\/li>\n<li><strong>proto<\/strong>: il protocollo da utilizzare, <em>tcp<\/em> o <em>udp<\/em>, ovviamente questo va a interessare anche la regola di <em>forwarding<\/em> dal <em>router<\/em>, in giro consigliano di usare <em>udp<\/em> in quanto \u00e8 pi\u00f9 veloce la trasmissione e poi tanto il controllo dei dati avviene tramite <em>tun\/tap<\/em>;<\/li>\n<li><strong>dev<\/strong>: \u00e8 il metodo di incapsulamento dei dati, <em>tun<\/em> virtualizza il passaggio di pacchetti ip ( tunnel ) mentre <em>tap<\/em> virtualizza per intero come un interfaccia ethernet; di solito si mette <em>tun<\/em> in quanto i dati che transitano sono ridotti, se invece ci sono soluzioni pi\u00f9 complesse ad esempio in cui si richiede un <em>bridge<\/em> di rete occorre usare <em>tap<\/em>;<\/li>\n<li><strong>ca, cert, key, dh, tls-auth<\/strong>: questi devono puntare ai certificati del server creati prima;<\/li>\n<li><strong>server<\/strong>: necessaria in caso di <em>VPN routed<\/em>, se si usa un <em>bridge<\/em> di rete questa voce va commentata;<\/li>\n<li><strong>server-bridge<\/strong>: qui vanno indicati in ordine l&#8217;IP dell&#8217;interfaccia di <em>bridge<\/em>, la maschera di rete del <em>bridge<\/em>, l&#8217;inizio del <em>range<\/em> di IP da assegnare ai <em>client VPN<\/em>, la fine del range di IP da assegnare ai <em>client VPN<\/em>;<\/li>\n<li><strong>push &#8220;route &#8230;&#8221;<\/strong>: indica ai vari <em>client<\/em> l&#8217;eventuale modifica alla tabella di <em>routing<\/em>;<\/li>\n<li><strong>push &#8220;dhcp-option &#8230;&#8221;<\/strong>: indica ai vari client l&#8217;eventuale aggiunta di parametri <em>DNS\/WINS\/DOMAIN<\/em>;<\/li>\n<li><strong>max-clients<\/strong>: indica il numero massimo di <em>client VPN<\/em> che sono accettati, \u00e8 possibile anche non mettere questo parametri se non si vuole limitare;<\/li>\n<li><strong>ifconfig-pool-persist<\/strong>: serve a far memorizzare su file le varie assegnazioni degli IP in maniera che ogni <em>client<\/em> abbia sempre lo stesso indirizzo, si basa sull&#8217;<em>hostname<\/em>;<\/li>\n<li><strong>log<\/strong> \/ <strong>log-append<\/strong>: normalmente OpenVPN salva i log nel log di sistema, se vogliamo che per maggiore chiarezza venga salvato a parte basta attivare i parametri <em>log<\/em> o <em>log-append<\/em>; la differenza sta che <em>log<\/em> ad ogni sessione azzera il file e riparte pulito, <em>log-append<\/em> invece accoda sempre; se indicato solo il nome del file viene salvato nella dir di configurazione ( <em>\/etc\/openvpn\/<\/em> );<\/li>\n<\/ul>\n<\/div>\n<p>Ora salviamo e proviamo prima di tutto a far partire a mano il <em>server<\/em> per vederne eventualmente i messaggi a video nel caso qualcosa non vada come dovrebbe:<\/p>\n<pre lang=\"bash\">openvpn --config \/etc\/openvpn\/server.conf --verb 4<\/pre>\n<p>Il parametro <em>&#8211;verb<\/em> indica il livello di <em>log<\/em>, maggiore lo mettiamo pi\u00f9 dettagliato avremo il <em>log<\/em>, pu\u00f2 arrivare fino a 9.<\/p>\n<p>E&#8217; necessario inoltre che sul <em>server<\/em> sia abilitato il <em>port-forwarding<\/em>, quindi editiamo i file <em>\/etc\/sysctl.conf<\/em> e impostiamo la riga:<\/p>\n<pre lang=\"bash\">net.ipv4.ip_forward=1<\/pre>\n<p>Forziamo il caricamento delle regole appena modificate:<\/p>\n<pre lang=\"bash\">sysctl -p<\/pre>\n<p>Ricordiamo infine di abilitare il traffico attraverso le nostre interfacce con <em>iptables<\/em>:<\/p>\n<pre class=\"\" lang=\"bash\">iptables -A INPUT -i tap0 -j ACCEPT\r\niptables -A INPUT -i br0 -j ACCEPT\r\niptables -A FORWARD -i br0 -j ACCEPT\r\niptables -t nat -A POSTROUTING -j MASQUERADE<\/pre>\n<p>Ovviamente queste regole del <em>firewall<\/em> sono molto generiche e molto insicure, ogni soluzione dovr\u00e0 poi adottare le proprie restrizioni per garantire una maggiore sicurezza alla rete.<\/p>\n<h2>Revoca di un certificato<\/h2>\n<p>In caso si volesse revocare un certificato occorre seguire alcuni semplici punti e serve per\u00f2 avere copia del certificato da revocare, per quello prima si consigliava di non cancellarli mai dal <em>server<\/em>:<\/p>\n<pre lang=\"bash\">cd \/etc\/openvpn\/easy-rsa\/\r\nsource vars\r\n.\/revoke-full client1<\/pre>\n<p>Dopo un po&#8217; di messaggi uscir\u00e0 un <em>error 23 at 0 depth lookup:certificate revoked<\/em> che sta a indicare che il certificato \u00e8 stato revocato e sar\u00e0 creato un file <em>crl.pem<\/em> con l&#8217;elenco dei certificati revocati.<\/p>\n<p>Questo file va copiato nella cartella con le altre chiavi del <em>server<\/em>:<\/p>\n<pre lang=\"bash\">cp keys\/crl.pem \/etc\/openvpn\/<\/pre>\n<p>Controllate nella configurazione del <em>server<\/em> che esista la riga ( altrimenti aggiungetela ):<\/p>\n<pre lang=\"bash\">crl-verify \/etc\/openvpn\/crl.pem<\/pre>\n<p>Ora basta dire al <em>server<\/em> di aggiornarsi i parametri in maniera che al <em>client<\/em> revocato non venga dato pi\u00f9 accesso alla <em>VPN<\/em>:<\/p>\n<pre lang=\"bash\">\/etc\/init.d\/openvpn reload<\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Dopo l&#8217;articolo\u00a0Installare Voyage Linux su un WRAP\/ALIX ora trasformiamo il nostro dispositivo in un server VPN tramite OpenVPN. Nota: Tutte le operazioni vengono fatte dall&#8217;utente root. Nota 2: Come editor utilizzo nano che va installato dato che dopo l&#8217;installazione base di Voyage Linux \u00e8 disponibile unicamente l&#8217;editor vi. Installazione del server Si installa il server: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[166,15,3,194],"tags":[167,16,8,7,195,6],"_links":{"self":[{"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/posts\/1575"}],"collection":[{"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/comments?post=1575"}],"version-history":[{"count":8,"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/posts\/1575\/revisions"}],"predecessor-version":[{"id":2025,"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/posts\/1575\/revisions\/2025"}],"wp:attachment":[{"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/media?parent=1575"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/categories?post=1575"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.sfsoft.it\/blog\/wp-json\/wp\/v2\/tags?post=1575"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}