OpenVPN “routed” su Voyage Linux
Dopo l’articolo Installare Voyage Linux su un WRAP/ALIX ora trasformiamo il nostro dispositivo in un server VPN tramite OpenVPN.
Nota: Tutte le operazioni vengono fatte dall’utente root.
Nota 2: Come editor utilizzo nano che va installato dato che dopo l’installazione base di Voyage Linux è disponibile unicamente l’editor vi.
Installazione del server
Si installa il server:
1 |
apt-get install openvpn |
Prepariamo per generare le chiavi:
1 2 |
mkdir /etc/openvpn/easy-rsa cp /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa |
Modifichiamo i parametri di default che verranno utilizzati nella generazione delle chiavi, quindi apriamo il file vars:
1 |
nano /etc/openvpn/easy-rsa/vars |
Impostiamo poi i seguenti valori:
1 2 3 4 5 6 |
export KEY_COUNTRY="IT" export KEY_PROVINCE="Roma" export KEY_CITY="Roma" export KEY_ORG="Società di esempio" export KEY_EMAIL="mario@example.com" export KEY_OU="Organizzazione di esempio" |
Creazione dei certificati per il server
Procediamo alla generazione dei certificati per il server ( il comando build-dh è facile che impieghi molto tempo considerate le prestazioni minime del dispositivo ):
1 2 3 4 5 6 7 8 9 |
cd /etc/openvpn/easy-rsa/ source vars ./clean-all ./build-dh ./pkitool --initca ./pkitool --server server cd keys openvpn --genkey --secret ta.key cp server.crt server.key ca.crt dh1024.pem ta.key /etc/openvpn/ |
- la generazione della chiave ta.key serve per i client quando effettuano la prima connessione al server in modo da avere il permesso per procedere con le fasi di autenticazione, è una protezione che gli evita attacchi di tipo Denial of Service e lascia passare alla fase successiva solo chi è effettivamente abilitato;
Creazione dei certificati per i client
Ora serve generare i certificati per i client che dovranno collegarsi, al posto di hostname mettiamo il nome identificativo di ogni client in maniera da distinguere poi le chiavi da consegnare ( qui ho preferito usare build-key perchè è in modalità interattiva, quindi per ogni campo della chiave chiede conferma, invece pkitool fa tutto in automatico prendendo in valori dal file vars ):
1 2 3 |
cd /etc/openvpn/easy-rsa/ source vars ./build-key hostname |
Se al certificato per ragioni di sicurezza vogliamo anche associare una password che verrà poi richiesta ad ogni connessione occorre dare invece il comando:
1 |
./build-key-pass hostname |
Al client occorre poi fornire i seguenti file e possibilmente è bene non mandarli per email ma usare un metodo di copia cifrata tipo scp o consegnarli a mano su supporto esterno per evitare che vengano intercettati e utilizzati a nostra insaputa:
- /etc/openvpn/ca.crt
- /etc/openvpn/easy-rsa/keys/hostname.crt
- /etc/openvpn/easy-rsa/keys/hostname.key
- /etc/openvpn/ta.key
Questi certificati è consigliabile tenerne sempre una copia anche sul server in quanto se capitasse la necessità di revocarne uno occorre averlo, in fondo aggiungo le operazioni da eseguire per la revoca.
Configurazione del server
Procediamo ora alla configurazione del nostro server, modifichiamo il file server.conf partendo dall’esempio fornito dal pacchetto:
1 2 3 |
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ gzip -d /etc/openvpn/server.conf.gz nano /etc/openvpn/server.conf |
In questo caso procederemo alla configurazione detta routed, la differenza sostanziale tra una bridged e una routed è che la prima funziona come fosse un hub o uno switch virtuale ( quindi mette in connessione due reti che hanno visibilità di classe di IP tra loro ) mentre la seconda si occupa di far dialogare due reti con classi diverse e quindi impossibilitate a vedersi.
Esiste poi anche una versione chiamiamola base che mette in comunicazione solo i client della VPN tra loro oppure solo verso il server, la configurazione è molto più semplice ma per cosa serve a me è troppo limitante quindi la ignoro.
Per le differenze nel dettaglio e i vari pro e contro tra i vari metodi rimando alle documentazioni ufficiali.
Prima di avviare il demone andiamo a modificare il file /etc/openvpn/server.conf ( sotto la spiegazione dettagliata ):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
port 1194 proto udp dev tun ca /etc/openvpn/ca.crt cert /etc/openvpn/server.crt key /etc/openvpn/server.key dh /etc/openvpn/dh1024.pem tls-auth /etc/openvpn/ta.key 0 server 10.8.0.0 255.255.255.0 ;server-bridge 192.168.8.4 255.255.255.0 192.168.8.128 192.168.8.254 push "route 192.168.8.0 255.255.255.0" ;push "dhcp-option DNS 192.168.8.8" ;push "dhcp-option WINS 192.168.8.8" ;push "dhcp-option DOMAIN mydomain.loc" max-clients 10 ifconfig-pool-persist /etc/openvpn/ipp.txt log openvpn.log ;log-append openvpn.log |
- port: è la porta di ascolto del server VPN, ovviamente questa porta va aperta e reindirizzata dal router;
- proto: il protocollo da utilizzare, tcp o udp, ovviamente questo va a interessare anche la regola di forwarding dal router, in giro consigliano di usare udp in quanto è più veloce la trasmissione e poi tanto il controllo dei dati avviene tramite tun/tap;
- dev: è il metodo di incapsulamento dei dati, tun virtualizza il passaggio di pacchetti ip ( tunnel ) mentre tap virtualizza per intero come un interfaccia ethernet; di solito si mette tun in quanto i dati che transitano sono ridotti, se invece ci sono soluzioni più complesse ad esempio in cui si richiede un bridge di rete occorre usare tap;
- ca, cert, key, dh, tls-auth: questi devono puntare ai certificati del server creati prima;
- server: necessaria in caso di VPN routed, se si usa un bridge di rete questa voce va commentata;
- server-bridge: qui vanno indicati in ordine l’IP dell’interfaccia di bridge, la maschera di rete del bridge, l’inizio del range di IP da assegnare ai client VPN, la fine del range di IP da assegnare ai client VPN;
- push “route …”: indica ai vari client l’eventuale modifica alla tabella di routing;
- push “dhcp-option …”: indica ai vari client l’eventuale aggiunta di parametri DNS/WINS/DOMAIN;
- max-clients: indica il numero massimo di client VPN che sono accettati, è possibile anche non mettere questo parametri se non si vuole limitare;
- ifconfig-pool-persist: serve a far memorizzare su file le varie assegnazioni degli IP in maniera che ogni client abbia sempre lo stesso indirizzo, si basa sull’hostname;
- log / log-append: normalmente OpenVPN salva i log nel log di sistema, se vogliamo che per maggiore chiarezza venga salvato a parte basta attivare i parametri log o log-append; la differenza sta che log ad ogni sessione azzera il file e riparte pulito, log-append invece accoda sempre; se indicato solo il nome del file viene salvato nella dir di configurazione ( /etc/openvpn/ );
Ora salviamo e proviamo prima di tutto a far partire a mano il server per vederne eventualmente i messaggi a video nel caso qualcosa non vada come dovrebbe:
1 |
openvpn --config /etc/openvpn/server.conf --verb 4 |
Il parametro –verb indica il livello di log, maggiore lo mettiamo più dettagliato avremo il log, può arrivare fino a 9.
E’ necessario inoltre che sul server sia abilitato il port-forwarding, quindi editiamo i file /etc/sysctl.conf e impostiamo la riga:
1 |
net.ipv4.ip_forward=1 |
Forziamo il caricamento delle regole appena modificate:
1 |
sysctl -p |
Ricordiamo infine di abilitare il traffico attraverso le nostre interfacce con iptables:
1 2 3 4 |
iptables -A INPUT -i tap0 -j ACCEPT iptables -A INPUT -i br0 -j ACCEPT iptables -A FORWARD -i br0 -j ACCEPT iptables -t nat -A POSTROUTING -j MASQUERADE |
Ovviamente queste regole del firewall sono molto generiche e molto insicure, ogni soluzione dovrà poi adottare le proprie restrizioni per garantire una maggiore sicurezza alla rete.
Revoca di un certificato
In caso si volesse revocare un certificato occorre seguire alcuni semplici punti e serve però avere copia del certificato da revocare, per quello prima si consigliava di non cancellarli mai dal server:
1 2 3 |
cd /etc/openvpn/easy-rsa/ source vars ./revoke-full client1 |
Dopo un po’ di messaggi uscirà un error 23 at 0 depth lookup:certificate revoked che sta a indicare che il certificato è stato revocato e sarà creato un file crl.pem con l’elenco dei certificati revocati.
Questo file va copiato nella cartella con le altre chiavi del server:
1 |
cp keys/crl.pem /etc/openvpn/ |
Controllate nella configurazione del server che esista la riga ( altrimenti aggiungetela ):
1 |
crl-verify /etc/openvpn/crl.pem |
Ora basta dire al server di aggiornarsi i parametri in maniera che al client revocato non venga dato più accesso alla VPN:
1 |
/etc/init.d/openvpn reload |