Client OpenVPN su Ubiquiti USG

Privacy, sicurezza, riservatezza dei dati, certificati digitali… quante volte oggi sentiamo queste parole nei discorsi lanciati come monito dai vari esperti di sicurezza informatica che ci avvisano (e non a torto) di quanto sia diventata pericolosa e piena di insidie la navigazione nella rete delle reti.

Non è certamente un argomento da prendere alla leggera, ma non mi dilungherò qui in argomentazioni che invece meritano il giusto spazio. Vi basti sapere che in molti oggi si stanno sensibilizzando e ponendo il problema e in molti suggeriscono svariate soluzioni per rendere quanto più complicata possibile la vita degli spioni.

La combinazione VPN +  TOR

Una delle possibili è l’uso combinato di una VPN abbinata al famoso browser TOR. Esula da questo articolo spiegarvi i vantaggi della combinazione, ma invito i più curiosi che non conoscono TOR a una sana lettura su wikipedia.
Abbiamo invece già parlato di VPN, in particolare di quelle “fatte in casa”, ma in questo caso mi riferisco a quelle offerte da provider dedicati (i migliori sono ExpressVPN, CyberGhost, ZenMate, NordVPN, ma ne esistono anche molti altri). Sono servizi a pagamento che fortunatamente costano molto poco, nell’ordine di alcuni euro al mese, funzionano molto bene e ci offrono la possibilità di nascondere tutto il nostro traffico dati fino al punto di uscita su internet. Se per di più questo provider garantisce la totale non archiviazione di log generati dai loro clienti ecco che ci troviamo nella situazione di essere dei “signor nessuno” che navigano in rete con un ip geograficamente localizzato anche molto distante da noi. Se a questo aggiungiamo anche l’uso di TOR browser allora il cerchio si chiude e azzeriamo anche le tracce lasciate dal nostro classico browser.

I vari provider VPN, oltre ai loro servizi, offrono quasi sempre un’applicazione per PC, MAC, telefonini e tablet iOS e Android oltre che per altri dispositivi come router e sistemi Linux. Questo software permette a ciascun dispositivo di navigare autonomamente in internet cifrando la propria connessione. I provider VPN pubblicizzano anche la simultaneità di connessioni da diversi dispositivi ma fino a un numero massimo.
Tutto questo è molto comodo se mi trovo fuori casa o su una rete WiFi pubblica o di un albergo, ma se sono in casa e navigo su internet con un mio router a cui tutti i miei dispositivi sono collegati usando WiFi o cavo Ethernet risulta evidentemente alquanto scomodo dover installare su ciascuno il software per la navigazione in VPN e poi ricordarmi ogni volta di avviarlo.

Fortunatamente il provider stesso fornisce indicazioni su come configurare il proprio router di casa in modo che tutti i dispositivi a lui collegati possano navigare in VPN, ma questo funziona solo se il firmware del router offre la possibilità di farlo.

Come configurare il Security Gateway di Ubiquiti

Per chi invece ha optato a realizzare una rete privata usando elementi dedicati indipendenti come quelli di Ubiquiti, probabilmente sarà in possesso do un Router UniFi o di un Security Gateway UniFi che tramite il software di configurazione attualmente disponibile (l’UniFi Network Controller) può solo creare connessioni client su VPN di tipo PPTP che purtroppo sono alquanto poco sicure. Sebbene molti provider VPN offrano anche questo tipo di connessione e quindi sia possibile instaurarla nel router, è consigliabile non farlo. Finché Ubiquiti non deciderà di aggiornare la propria interfaccia di configurazione consentendo la creazione di configurazioni VPN più affidabili l’unica possibilità che ci rimane è quella di procedere manualmente.

Fortunatamente tutti i prodotti UniFi montano un sistema operativo chiamato EdgeOS accessibile tramite SSH dall’utente amministrativo del dispositivo (configurato in fase di installazione, ma modificabile anche con l’UniFi Network Controller).
E’ un sistema piuttosto semplice, che basa tutta la sua operatività su un semplice file di configurazione: /config/config.boot
EdgeOS lavora in due modalità: operativa e di configurazione. Quando accediamo al sistema

#> ssh <username>@<hostname>

entriamo nella modalità operativa e premendo il ? (punto di domanda) ci viene data la lista dei comandi disponibili. Il comando show è certamente il più utile perché ci fornisce la situazione operativa delle varie parti del dispositivo. Se digitiamo

ubnt@ubnt# show ?

ci viene data la lista delle componenti configurate e che possiamo consultare. Per esempio con il comando

ubnt@ubnt# show interfaces

ci viene mostrata la situazione delle interfacce di rete.

Il file di configurazione /config/config.boot non deve essere modificato manualmente (anche se è possibile farlo, e questo è utile ad es. per ripristinare un backup), ma nell’apposita modalità di configurazione nella quale è possibile verificare che le nostre modifiche abbiano sortito il giusto effetto prima di renderle permanenti.
Per entrare in modalità configurazione si usa da solo il comando configure.

ubnt@ubnt# configure

EdgeOS lavora usando tre tipi di configurazione:

  • Operativa: Ogni modifica apportata in modalità configurazione entra in questo stato e rimane pronta per essere attivata.
  • Attiva: Quando le modifiche vengono confermate diventano attive e agiscono sul funzionamento del sistema.
  • Boot: Quando le modifiche attive vengono salvate rimangono permanenti anche al successivo riavvio.

Per agire sulla configurazione operativa si usano i comandi

  • set: setta una specifica regola di configurazione, se seguito dal ? (punto di domanda) ci da la lista dei comandi disponibili per settare un certo componente del router
  • delete: cancella una specifica regola di configurazione, se seguito dal ? (punto di domanda) ci da la lista di ciò che è stato configurato
  • show: mostra una specifica regola di configurazione, se seguito dal ? (punto di domanda) ci da la lista dei settaggi che possiamo cancellare

E’ importante precisare che il file di configurazione archivia le informazioni in maniera gerarchica e quindi per accedere ai nodi più interni tramite i comandi di configurazione è necessario indicare tutti i nodi parenti di grado superiore.
Esempio di porzione di file config.boot:

...
interfaces {
  ethernet eth0 {
    address dhcp
    description WAN
  }
}
...

Se voglio cambiare il nome dell’interfaccia eth0 dovrò puntarla in forma completa in questo modo (usando il ? dopo ogni parola del comando avrò il suggerimento di quale usare come successivo)

ubnt@ubnt# set interfaces ethernet eth0 description 'Rete WAN'

Terminato il settaggio della configurazione operativa, posso confrontarla con quella attiva per vedere quali differenze sono state apportate usando il comando

ubnt@ubnt# compare
[edit interfaces ethernet eth0]
>description "Rete WAN"
[edit]

mentre per renderla pienamente funzionante dovrò dare il comando

ubnt@ubnt# commit

In questa fase in caso di errori verrò avvisato dal sistema, il commit verrà interrotto, le modifiche non diventeranno attive e potrò quindi apportare le necessarie correzioni
Se invece tutto è andato a buon fine la configurazione diverrà attiva e potrò decidere se salvarla per i successivi riavvii

ubnt@ubnt# save

e poi uscire dalla configurazione, oppure uscire senza salvarla ma mantenendola attiva fino al successivo riavvio

ubnt@ubnt# exit

Se invece voglio uscire dalla configurazione scartando le modifiche fin’ora apportate dovrò specificarlo eseguendo questo comando al posto di save

ubnt@ubnt# exit discard

Come configuro la VPN su EdgeOS?

Premesso il funzionamento di base di EdgeOS torniamo ora a come configurare manualmente una VPN. Abbiamo visto che l’UniFi Network Controller permette solo di settare client VPN di tipo PPTP, ma EdgeOS ha pieno supporto per le OpenVPN, quindi, siccome sono anche più sicure, ne configureremo una.

Prima di iniziare facciamoci una copia di backup della configurazione del nostro EdgeRouter o Security Gateway, possiamo usare putty oppure scp per copiare in locale il file config.boot

#> scp <username>@<hostname>:/config/config.boot ./

Ora scarichiamo dalla nostra area riservata del provider VPN il file di configurazione per la connessione in OpenVPN e recuperiamo le relative credenziali (username e password), poi entriamo nel nostro EdgeRouter o Security Gateway e andiamo nella cartella user-data:

#> ssh <username>@<hostname>
ubnt@ubnt# cd /config/user-data

Usando vim creiamo un file dal nome openvpnauth.txt

ubnt@ubnt# vi openvpnauth.txt

e scriviamo nella prima riga lo username e nella seconda la password della nostra configurazione OpenVPN

username
password

Poi copiamo nella cartella /config/user-data il file .ovpn di configurazione che abbiamo scaricato in precedenza (supponiamo si chiami openvpn.ovpn). Per farlo possiamo usare tranquillamente un client ssh come putty oppure la riga di comando via scp

#> scp openvpn.ovpn <username>@<hostname>:/config/user-data

Ora modifichiamo con vim il file copiato

ubnt@ubnt:/config/user-data# vi openvpn.ovpn

e verifichiamo che contenga le direttive di connessione, le chiavi e i certificati (in teoria questi dovrebbero già esserci, altrimenti andrebbero scaricati a parte dalla solita area del nostro profilo del provider VPN e il contenuto copiato e incollato a mano nel file in calce alle direttive di connessione).
Vanno quindi aggiunti questi altri due comandi di configurazione subito dopo quelle già presenti

auth-user-pass /config/user-data/openvpnauth.txt

route-nopull

Il file assomiglierà a qualcosa del tipo

client

dev tun

proto udp

remote <ip_o_hostname_del_server_del_proveder_vpn> <porta>

resolv-retry infinite

remote-random

nobind

tun-mtu 1500

tun-mtu-extra 32

mssfix 1450

persist-key

persist-tun

ping 15

ping-restart 0

ping-timer-rem

reneg-sec 0

comp-lzo no

remote-cert-tls server

verb 3

pull

fast-io

cipher AES-256-CBC

auth SHA512

key-direction 1

auth-user-pass /config/user-data/openvpnauth.txt

route-nopull


<ca>

-----BEGIN CERTIFICATE-----

MIIFCjCCAvKgAwIBAgIBATANBgkqhkiG9w0BAQ0FADA5MQswCQYDVQQGEwJQQTEQ

.... tutto il certificato ...

PApL8PytggYKeQmRhl499+6jLxcZ2IegLfqq41dzIjwHwTMplg+1pKIOVojpWA==

-----END CERTIFICATE-----

</ca>

<tls-auth>

#

# 2048 bit OpenVPN static key

#

-----BEGIN OpenVPN Static key V1-----

e685bdaf659a25a200e2b9e39e51ff03

... tutta la chiave ...

3f8a56ddb2e64eb67adfc9b337157ff4

-----END OpenVPN Static key V1-----

</tls-auth>

Abbiamo quasi finito.
Ora dobbiamo configurare EdgeOS, dirgli di attivare la VPN e instradare tutto il traffico della nostra rete verso il tunnel.
Entriamo in configurazione

ubnt@ubnt# configure

creiamo una nuova interfaccia (la vtun0) dando in sequenza questi comandi

set interfaces openvpn vtun0 config-file /config/user-data/openvpn.ovpn
set interfaces openvpn vtun0 description 'OpenVPN VPN tunnel'
commit

creiamo una regola per il mascheramento della rete locale.

set service nat rule 5000 description 'OpenVPN Clients'
set service nat rule 5000 log disable
set service nat rule 5000 outbound-interface vtun0
set service nat rule 5000 source group network-group corporate_network
set service nat rule 5000 type masquerade
commit

Attenzione alla regola

set service nat rule 5000 source group network-group corporate_network

questa usa un nome (network-group) che in teoria è preconfezionato nella configurazione config.boot e contiene gli ip della rete locale. In caso è possibile essere più specifici e creare una regola esplicitando gli ip come in questo esempio

set service nat rule 5000 source address 192.168.1.0/24

Ora non ci rimane che instradare tutto il traffico 0.0.0.0/0 verso la VPN

set protocols static table 1 interface-route 0.0.0.0/0 next-hop-interface vtun0

set firewall modify SOURCE_ROUTE rule 10 description 'traffic from network-group corporate_network to vtun0'

set firewall modify SOURCE_ROUTE rule 10 source group network-group corporate_network

set firewall modify SOURCE_ROUTE rule 10 modify table 1

set interfaces ethernet eth1 firewall in modify SOURCE_ROUTE

commit

Alcune precisazioni

  • Anche qui le due regole
    set firewall modify SOURCE_ROUTE rule 10 description 'traffic from network-group corporate_network to vtun0'
    set firewall modify SOURCE_ROUTE rule 10 source group network-group corporate_network
  • possono fare riferimento a IP specifici e non a quelli predefiniti, quindi possono diventare ad esempio
    set firewall modify SOURCE_ROUTE rule 10 description 'traffic from 192.168.1.0/24 to vtun0'
    set firewall modify SOURCE_ROUTE rule 10 source address 192.168.1.0/24
  • La regola
    set interfaces ethernet eth1 firewall in modify SOURCE_ROUTE

    fa riferimento all’interfaccia della rete locale. I vari dispositivi Ubiquiti possono definirla in modo differente a seconda del loro hardware, come ad esempio

    set interfaces switch switch0 firewall in modify SOURCE_ROUTE

Ora, se il commit non ha dato errori, posso salvare la configurazione

ubnt@ubnt# save

e verificare che la VPN sia operativa visualizzando il log

ubnt@ubnt# run show log

Se scorrendolo trovo “initialization sequence completedè tutto OK, posso uscire dalla configurazione

ubnt@ubnt# exit

A questo punto la VPN è attiva e funzionante e tutta la rete locale definita nelle regole può sfruttarla.

Come disattivo / disinstallo la VPN?

Per completezza vediamo sia le operazioni per disattivare la VPN senza rimuovere le regole che quelle per la rimozione completa.

Disattivazione

configure
set interfaces openvpn vtun0 disable
commit
save
exit

Riattivazione

configure
delete interfaces openvpn vtun0 disable
commit
save

Disinstallazione, rimozione completa delle regole

configure
set interfaces ethernet eth1 firewall in modify LOAD_BALANCE
commit
delete firewall modify SOURCE_ROUTE
delete protocols
commit
delete service nat rule 5000
delete interfaces openvpn vtun0
commit
save

Attenzione a

set interfaces ethernet eth1 firewall in modify LOAD_BALANCE

come spiegato prima, l’interfaccia cambia a seconda del dispositivo e potrebbe non essere ethernet eth1, e neppure la regola del firewall da riapplicare potrebbe essere LOAD_BALANCE. Si consiglia di andare nel file di backup e leggere quale era la configurazione originale adeguando il comando di conseguenza.