OpenVPN

2010 openvpn tutorial

Contenuti

  1. Introduzione
    1.1 Cosa è openvpn?
    1.2 Che cosa è una vpn?
    1.3 Come si presenta openvpn all’utente?
    1.4 Come funziona sulla rete “reale” la vpn?
    1.5 Che sistemi di autenticazione e cifratura posso usare.
  2. Preparazione
    2.1 Certificati
    2.2 File del servizio
    2.3 File di configurazione
    2.3.1 Server
    2.3.2 Client

Introduzione

Cosa è openvpn?

Openvpn è un software open-source per costruire una rete vpn.

Cosa troverete in questo wiki? Questo wiki nasce come sunto delle mie conoscenze di vpn e di openvpn, quindi vuole essere una guida il più possibile ampia sulle gradi capacità di questo software, lasciando al lettore di trovare soluzioni migliori per le proprie esigenze e la libertà di suggerirle nella pagina delle discussioni.

Che cosa è una vpn?

Acronimo di Virtual Private Network, serve a creare una sottorete virtuale, privata e sicura in una rete condivisa(es. internet).

  • Virtuale perché i dati viaggiano su un’altra rete (es. intenet).
  • Privata perché il traffico rimane occultato a terzi da una cifratura.
  • Sicura perché nessuno può entrare senza autorizzazione.

Ad esempio, le aziende possono collegare tra di loro le proprie sedi tramite una VPN su internet. Oppure, sempre tramite VPN, un dipendente potrà tramite lavorare da casa (o qualunque parte del mondo) e accedere alla rete aziendale come se fosse in sede.

Per raggiungere questi scopi una vpn deve utilizzare la cifratura dei dati e l’autenticazione dei client ed eventualmente anche del server. Inoltre la vpn ha anche altri sistemi di protezione per evitari altri modi di violazione.

Come si presenta openvpn all’utente?

La VPN si presenta sia lato server che client come un’interfaccia di rete virtuale e indipendente. Ciò significa che tutti i pacchetti che usciranno da quell’interfaccia saranno cifrati e poi inviati tramite il tunnel vpn. Con tunnel vpn intendiamo la trasmissione protetta dei dati su connessione vpn. Ogni soggetto nella vpn dispone quindi di un proprio indirizzo ip di una determinata sottorete: esattamente come su una rete privata.

Come funziona sulla rete “reale” la vpn?

Ogni client si connette al server openvpn su una porta prestabilita (default 1194). Può funzionare in 3 modi principalmente:

  • un solo client si collega ad un solo server,
  • più client si collegano al server ma dialogano solo con lui,
  • più client si collegano solo al server e dialogano anche tra di loro.

Che sistemi di autenticazione e cifratura posso usare.

Principalmente 2:

  • chiave simmetrica precondivisa (o condivisa su rete sicura. Es: ssh)
  • Utilizzo di certificati ssl a chiave pubblica-privata.

In questo wiki discuteremo di entrambi.

Preparazione

Certificati

Concettualmente esistono 3 tipi di soggetti nella generazione e uso delle chiavi - Certification Autority (CA) - server - client

questi sono i file in gioco per 1 server e 3 client

NOME-FILE NECESSARIO A COSA È SEGRETO
ca.crt server + tutti client CA certificato NO
ca.key CA CA chiave segreta SI
dh{n}.pem solo server Diffie Hellman parametri NO
server.crt solo server Server Certificato NO
server.key solo server Server chiave segreta SI
client1.crt solo client1 Client1 Certificate NO
client1.key solo client1 vClient1 chiave segreta SI
client2.crt solo client2 Client2 Certificate NO
client2.key solo client2 Client2 chiave segreta SI

CA: la CA possiede i file ca.crt e ca.key. Il suo compito e’ quello di firmare i certificati di tutti per convalidarli. per firmare serve il file ca.key (SEGRETO) mentre a tutti gli altri servira’ il ca.crt per verificare la firma

Il server possiede:

  • ca.crt per verificare le firme
  • server.crt
  • server.key

il client possiede:

  • ca.crt per verificare le firme
  • server.crt
  • server.key

Nel nostro caso pur tenendo separati i concetti di CA e quello di server, li faremo coesistere per comodita’ sulla stessa macchina.

Creiamo l’ambiente

$ . ./vars

facciamo pulizia dalle vecchie chiavi(ATTENZIONE! usare con discrezione)

$ clean all

Creiamo la coppia .key e .crt della CA

$ ./build-ca

coppia per il server

$ ./build-key-sever nome_server

Creiamo una chiave per ogni client

$ ./build-key nome_client

Sul server creiamo i parametri di Diffie Hellman

$ ./build-dh

Ora possiamo distribuire i file come suddetto a chi li necessitate tenendo ben presente che i file segreti dovrebbero stare solo da chi li necessitate.

nel qual caso non avessimo un canale sicuro su cui trasferire ai client (ammesso che tutte le generazione avvengano sul server) possiamo usare un altra strategia

Creiamo sul client la chiave .key e il Certificate Signing Request (CSR) ovvero una sorta di chiave pubblica che dovra’ essere firmata dalla Certification Autority (CA) (ovvero chi possiede il file ca.key)

$ ./build-req nome_client

verrano creati i file nome_client.key (FILE SEGRETO) che rimmarra’ sul client e il file nome_client.csr (non segreto) che verra’ inviato alla nostra CA messo nella cartella ./keys e con il comando

$ sign-req nome_client

//senza il .csr!

in questo modo verra firmato e creato in ./keys il nome_client.crt

Come avrete notato i file *.csr non sono usati da openvpn direttamente, questo proprio perche’ sono da firmare per ottenere i *.crt .

IN SOSTANZA per creare una chiave i passaggi sono:

  1. creare .key e .csr (una sorta di chiave segreta e pubblica)
  2. firmare il .csr con ca.key e quindi creare il .crt

./build-key e’ esegue entrambi i passaggi (1) e (2) dato che e’ disponibile il file ca.key localmente . Quando non abbiamo un canale sicuro usiamo ./build-req sulla CA (1) e ./sign-req sul client (2).

LINK: http://openvpn.net/howto.html#mitm

File del servizio

Openvpn e’ attivabile spesso come servizio: lo trovate nella cartella /etc/init.d/ e di solito si chiama openvpn, ma ATTENZIONE che ogni distro lo fa funzionare “a modo suo” Per esempio su gentoo se nella cartella /etc/openvpn avete il file di configurazione che si chiama server1.conf dovete creare nella cartella /etc/init.d/ un symlink con il comando

ln -s /etc/init.d/openvpn /etc/init.d/openvpn.server1

in questo modo digitando

/etc/init.d/openvpn.server1 start

si avviera’ il server vpn. Su debian e derivati ho visto che invece in questo stesso caso bisogna scrivere

/etc/init.d/openvpn start server1

altrimenti con un

/etc/init.d/openvpn start

si avviano tutte le vostre vpn

Ma tutto questo puo’ essere meglio compreso se avete un po di dimestichezza con gli script dei servizi e vi leggete il file /etc/init.d/openvpn

File di configurazione

Server

#################################################
# Sample OpenVPN 2.0 config file for            #
# multi-client server.                          #
#                                               #
# This file is for the server side              #
# of a many-clients <-> one-server              #
# OpenVPN configuration.                        #
#                                               #
# OpenVPN also supports                         #
# single-machine <-> single-machine             #
# configurations (See the Examples page         #
# on the web site for more info).               #
#                                               #
# This config should work on Windows            #
# or Linux/BSD systems.  Remember on            #
# Windows to quote pathnames and use            #
# double backslashes, e.g.:                     #
# "C:\\Program Files\\OpenVPN\\config\\foo.key" #
#                                               #
# Comments are preceded with '#' or ';'         #
#################################################

# Questa opzione stabilisce su quale subnet il server vpn deve stare in ascolto. Omettetela per farlo stare in
# ascolto su tutte (Opzionale)
;local a.b.c.d

# Stabilisce su quale porta TCP/UDP il server OpenVPN stara' in ascolto.
# Quella di default e' la 1194
# Questa opzione e' utile se volete diverse istanze di openvpn:
# mettetele in ascolto su porte diverse
port 1194

# TCP o UDP server? Se non sapete cosa scegliere, scegliete UDP
;proto tcp
proto udp

# Definite quale tipo di interfaccia usare
# Per esempio tap e il SO (non-windows) si
# occupera' di usare la prima interfaccia di
# quel tipo libera:
# tap0 o tap1 o tap2
# oppure definire l'interfaccia precisa es. tap0
# Scegliete una delle seguenti tipologie di interfaccia
;dev tap  #decidete di usare un interfaccia tap il SO si occupera' di crearne una tap0 , tap1 o tap2 .. ecc
dev tap0 #decidete di creare(se non c'e') e usare l'interfaccia tap0
;dev tun
;dev tun3

# SSL/TLS
ca /etc/openvpn/server/keys/ca.crt
cert /etc/openvpn/server/keys/server.crt
key /etc/openvpn/server/keys/server.key  # Chiave segreta

# Diffie hellman parameters.
dh /etc/openvpn/server/keys/dh1024.pem

# Il server si occupera' di dare un ip per ogni client(riconosciuto dal certificato)
# e di riservarglielo per le connessioni future(vedi oltre)
server 192.168.10.0 255.255.255.0
;server 10.6.0.0 255.255.255.0

# Mantiene un registro degli ip virtuali assegnati
ifconfig-pool-persist server/ipp.txt

# Questa opzione fa in modo che i client utilizzino automaticamente
# il server vpn come gateway di dafault (per il default route)
push "redirect-gateway def1"

push "dhcp-option DNS 192.168.1.1"
;push "dhcp-option WINS 10.8.0.1"

# Con questa opzione scommentata i client di
# questa vpn si potranno "vedere" tra di loro
client-to-client

keepalive 10 120

;tls-auth ta.key 0 # This file is secret

comp-lzo

;max-clients 100

;user nobody
;group nobody

persist-key
persist-tun

status openvpn-status.log

verb 3

;mute 20

;crl-verify /etc/openvpn/server/keys/crl.pem

Client

##############################################
# Sample client-side OpenVPN 2.0 config file #
# for connecting to multi-client server.     #
##############################################

client

dev tap0
;dev tun

;proto tcp
proto udp

# l'hostname/IP e la porta del server.
remote  dns-o-ip_server1 1194
remote  dns-o-ip_server2 1194
;remote my-server-2 1194

;remote-random

resolv-retry infinite

nobind

;user nobody
;group nobody

persist-key
persist-tun

;http-proxy-retry
;http-proxy [proxy server] [proxy port #]

;mute-replay-warnings

# SSL/TLS
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/client.crt
key /etc/openvpn/server/client.key

;ns-cert-type server

;tls-auth ta.key 1

comp-lzo

verb 3

;mute 20