giovedì 15 maggio 2008

OpenVPN su PFSense: Client remoti

CREAZIONE DEI CERTIFICATI
Questo step non è necessario se si vuole configurare una Vpn Site-to
-site

Creazione dei certificate su Unix/Linux
Per prima cosa si devono scaricare i sorgenti di OpenVPN da:

http://openvpn.net/download.html

Si possono scaricare anche direttamente, usando “fetch” or “wget” se non si vuole/può utilizzare l’interfaccia grafica.
Scaricati i sorgenti, bisogna scompattarli con il comando “tar -xvzf openvpn-*.tar.gz” e poi posizionarsi nella cartella “easy-rsa”.

Aprire “vars” ed editare i valori alla fine del file secondo le proprie esigenze in modo da non dover riscrivere tutto ogni volta che si genera un certificato (la generazione prende questi valori come default).

export KEY_COUNTRY=IT
export KEY_PROVINCE=FVG
export KEY_CITY=TRIESTE
export KEY_ORG="Nome Organizzazione"
export KEY_EMAIL="
me@myhost.mydomain"

Editate queste informazioni, bisogna eseguire alcuni scripts. Quando verrà richiesto di inserire il “Common Name”, inserire l’hostname del server pfsense (si trova in “General Setup” della configurazione del pfsense).

[/path/easy-rsa]# source ./vars
[/path/easy-rsa]# ./clean-all
[/path/easy-rsa]# ./build-ca

Country Name (2 letter code) [IT]: (premere invio)
State or Province Name (full name) [FVG]: (premere invio)
Locality Name (eg, city) [TRIESTE]): (premere invio)
Organization Name (eg, company) [Nome Ogranizzazione]: (premere invio)
Organizational Unit Name (eg, section) [ ]:( premere invio o inserire la unit name)
Common Name (eg, your name or your server's hostname) [ ]:HostnamePFSENSE
Email Address [me@myhost.mydomain]: (premere invio)

Nello script seguente bisogna inserire “server” come Common Name. Premere “y” per firmare il certificato.

[/path/easy-rsa]# ./build-key-server server

Poi si devono generare i parametri DH:

[/path /easy-rsa]# ./build-dh

Infine, i certificati per i client (al posto di client1, client2, ecc si possono inserire i nomi dei client o qualsiasi cosa che identifichi il destinatario del certificato):

[/path /easy-rsa]# ./build-key client1
[/path /easy-rsa]#
./build-key client2
[/path /easy-rsa]# ./build-key client3

Si possono creare quanti certificati client si vogliono. Se si deve successivamente creare un certificato client nuovo, basta farlo con ./build-key client_name. È tassativo usare sempre un nome diverso per ogni certificato. I certificati vanno creati tutti nella stessa cartella, altrimenti non funzioneranno (eventualmente fare il backup della cartella dei certificati, in modo da poterne generare altri senza dover rifare e reinstallare i certificati server).

Creazione dei certificati su Windows
Per generare i certificati su macchine windows si possono utilizzare diversi programmi, ma quello piu semplice ed immediato è “My Certificate Wizard” (http://www.openvpn.se/mycert/)

Si devono generare tre tipi di certificati: Certificate Autorità (CA), server e client.
NB: è necessario aver installato una versione di OpenVPN

Generare il certificato della Certificate Authority (CA) e la sua chiave
Aprire un prompt di dos e posizionarsi in \Program Files\OpenVPN\easyrsa.
Eseguire il seguente filebatch file per copiare i file di configurazione (il comando sovrascriverà i file vars.bat e openssl.cnf eventualmente presenti nella cartella):

init-config

Editare il file vars.bat impostando i seguenti valori senza lasciare alcun valore vuoto:

export KEY_COUNTRY=IT
export KEY_PROVINCE=FVG
export KEY_CITY=TRIESTE
export KEY_ORG="Nome Organizzazione"
export KEY_EMAIL="
me@myhost.mydomain"

Poi, inizializzare il PKI con i comandi:

vars
clean-all
build-ca

L’ultimo comando (build-ca) creerà il certificato per la certificate authority (CA) e la sua chiave invocando l’eseguibile openssl che si trova nella cartella bin dell’installazione di OpenVPN. In alcuni sistemi questo path non è riconosciuto come valido, quindi se i seguenti comandi generano un errore di “Invalid command name”, bisogna editare i file .bat sostituendo a “openssl” il percorso completo (ad esempio “C:\Programmi\OpenVPN\bin\openssl”):

c:\program files\openvpn\easy-rsa\build-ca

Generating a 1024 bit RSA private key
............++++++

............++++++
writing new private key to 'ca.key
'

Verrà richiesto l’inserimento dei valori di configurazione del certificato, alcuni gia impostati di default (li prende dal file vars.bat). Per lasciare una campo vuoto, inserire un punto ( “.” ).
Nel Common Name inserire un valore che richiami il fatto che quello che si sta generando è il certificato per la certificate autorità (ad esempio OpenVPN-CA)

Generare il certificato per il server e la sua chiave
Per la generazione del certificato server utilizzare il seguente comando, sempre dal prompt:

build-key-server server

Come nello step precedente, molti parametri saranno impostati di default. Quando sarà richiesto il Common Name, inserire "server". Rispondere infine “y” alle domande proposte:

"Sign the certificate? [y/n]" per firmare il certificato e
"1 out of 1 certificate requests certified, commit? [y/n]" per avviare la generazione

Generare i certificati per i client
Generare i certificati per i client è molto simile al passaggio precedente, solamente si usa un altro comando:

build-key client1
build-key client2
build-key client3

Se si vuole anche proteggere con password le chiavi, utilizzare il comando build-keypass al posto di build-key.
Per ogni client è necessario inserire il Common Name appropriato. È tassativo usare sempre un nome diverso per ogni certificato. I certificati vanno creati tutti nella stessa cartella, altrimenti non funzioneranno (eventualmente fare il backup della cartella dei certificati, in modo da poterne generare altri senza dover rifare e reinstallare i certificati server).

Generare i paramenti Diffie Hellman (DH)
Per il server OpenVPN devono essere anche generati i parametri Diffie Hellman (DH).

build-dh

Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time

.................+...........................................

...................+.............+.................+.........
......................................

A questo punto abbiamo generato tutti i file necessari e si trovano tutti nella stessa cartella.

IMPOSTARE LA VPN PER I CLIENT REMOTI
Creati i certificati, è possibile configurare OpenVPN per la connessione dei client. Ciccare sul menu VPN à OpenVPN e poi sulla piccola icona “+” del tab “Server” per aggiungere una nuova connessione VPN server.

Come si può vedere, è impostato come protocollo “TCP”, questo perché è noto che UDP può aver problemi con alcuni router. Il TCP è leggermente più lento, ma per il momento è l’unico che assicura il 100% di compatibilità.

Abilitare il “Dynamic IP”. In questo modo i client possono connettersi anche senza impostare manualmente un indirizzo ip della rete.

“Address pool” deve essere una sottorete indipendente che non è utilizzata in alcun segmento di rete esistente. Questo è molto importante, altrimenti si possono provocare conflitti di indirizzi IP e, nel migliore dei casi, comunque la VPN non funzionerebbe.

Cambiare il “Authentication method” impostando PKI (Public Key Infrastructure).

A questo punto bisogna incollare il testo dei certificati e delle chiavi negli appositi box. Aprire con un editor di testo i file specificati e copiare il contenuto includendo:

-----BEGIN CERTIFICATE-----
&
-----END CERTIFICATE----

Dopo aver copiato i certificati e le chiavi, disattivare “LZO-Compression” (eventualmente sarà possibile riabilitarla una volta verificato il funzionamento della VPN). Alla fine cliccare su “SAVE”.
NB: Per permettere ai client di connettersi anche su altre reti al di fuori della LAN impostata, bisogna inserire una rotta nel campo “Custom options”. Supponendo ad esempio di voler connettersi anche alla DMZ, con indirizzo 192.168.2.0/24, bisogna scrivere:

push “route 192.168.100.0 255.255.255.0”

Regole sul firewall
Per fare in modo che i client si connettano al server OpenVPN, bisogna creare una regola che permetta alle connessioni in entrata sull’interfaccia WAN di accedere alla porta 1194 (o quella impostata per la VPN, se è stata cambiata)

Scegliere il menu “Firewall > Rules”, cliccare sul tab “WAN” e infine sulla piccola icona “+” per aggiungere una nuova regola.

Come Protocollo inserire “TCP” oppure “UDP” a seconda del protocollo scelto precedentemente nella definizione del server.

“Destination port range” è la porta in ascolto del server OpenVPN, di default la 1194.

Cliccando su “Save” le modifiche verranno salvate.

CONFIGURAZIONE DEI CLIENT
Dopo aver configurato il server, è necessario creare i file di configurazione per i client, in modo che possano connettersi da qualsiasi parte del mondo.
NB: ovviamente, i client devono aver installata una versione client di OpenVPN.

Creare un file di testo con il nome “nomeclient.ovpn” e inserire il testo di configurazione seguente:

float
port 1194
dev tun
proto tcp-client
remote IpPubblicoDiConnessione 1194
ping 10
persist-tun
persist-key
tls-client
ca ca.crt
cert client1.crt
key client1.key
ns-cert-type server
#comp-lzo
pull
verb 4


Eventualmente rimuovere il # se la comprezzione lzo è stata abilitata nella configurazione del server.

Inoltre è necessario copiare i certificati generati precedentemente nella stessa cartella del file appena creato. I file da copiare sono il certificato della Certificate Autority (CA), il certificato del client e la sua chiave. (Ad esempio “ca.crt”, “client1.crt” e “client1.key”).

Il procedimento è finito. Per poter urilizzare la VPN basterà cliccare con il tasto destro sul file ovpn e scegliere la voce "Start OpenVPN with this file".

2 commenti:

Anonimo ha detto...

Ciao Davide.
Sai se l'OpenVPN di Pfsense può girare in modalità bridge invece che routed?
Inoltre, come posso assegnare uno specifico indirizzo IP ad un client Road Warrior?
Grazie
Luca

Davide "n3wt0n" Benvegnù ha detto...

Ciao. Anche se OpenVPN può essere impostata in modalità bridged, quella inclusa in PFSense di base no, perchè viene lanciata automaticamente dal "motore" del PFSense in routed. POtrebbe esistere un workaround, ma non ne sono sicuro in quanto non ho mai provato: dovrebbe essere possibile modificare lo script di avvio di OVPN in modo da farla partire come bridged (ripeto, questa però è solo un'ipotesi).

Invece, per assegnare un indirizzo ip al client, basta inserire una stringa del tipo "ifconfig 10.0.1.2 255.255.255.252" nel file di configurazione dove 10.0.1.2 sarà l'indirizzo del client (la cui classe deve corrispondere a quella dell'endpoint del tunnel vpn)