In Debian Sarge openvpn 2.0 e` gia` pacchettizzata, basta installare il pacchetto e creare le configurazioni. Se si crea un file <nome>.conf dentro a /etc/openvpn gli script standard di Debian lo lanciano al boot.

Questa e` la configurazione piu` semplice del mondo, non la piu` sicura. Tuttavia per macchine con poca CPU puo` essere una soluzione valida. Questa configurazione crea un tunnel, non un bridge.

# device per il tunnel
dev tun0

# indirizzi ip pubblici locale e remoto
remote 62.123.191.1
local 82.88.19.1

# porta udp esterna (se non uso il default)
port 4242

# indirizzi ip privati locale e remoto (uso quelli delle eth locali, ma
# potrei anche usarne altri due a caso non usati nelle reti)
ifconfig 192.168.1.254 192.168.2.1

# routing (indico che la rete remota va routata per la vpn)
# qui metto indirizzo e netmask della rete REMOTA.
route 192.168.2.0 255.255.255.0

# pre shared key
secret <nome del file della chiave>

# dropppo i privilegi
user nobody
group nogroup

# Compressione
comp-lzo

# log level 3
verb 3


Se ci sono dei nat in mezzo, e il link non resta su quando non c'e` traffico, si possono aggiungere nei file di configurazione di tutti e due gli endpoint un paio di righe per il keepalive.

# Ogni 60 secondi manda un keepalive, e se non hai risposta in 120 secondi, resetta il link
keepalive 60 120
# Quanto sopra vale SOLO quando sei in connessione stabilita
ping-timer-rem
# tieni "buono" il tunnel anche se ci sono interruzioni sull' UDP
persist-tun
# se devi resettare il tunnel, non rileggere la chiave ma usa quella che hai in ram
persist-key


Per una vpn fra due endpoint (non in stile client/server) con ip e dns dinamico, si puo` cercare di ovviare ai problemi di cambio di indirizzo ip di uno dei due endpoint (anche di tutti e due, nel caso) cosi`:

ping              60
ping-restart      300 # 5 minutes
resolv-retry      300 # 5 minutes
persist-tun
persist-key

replay-persist
replay-persist-file

In questo modo se uno dei due endpoint cambia indirizzo, dopo 300 secondi di disconnessione (causata dal cambio di indirizzo) openvpn riavvia l'handshake provvedendo anche a ri-risolvere dal dns l'ip del remoto (resolv-retry).


Configurazione per connettere portatili con Windows a un concentratore Linux con chiavi asimmetriche

Questa dovrebbe essere la configurazione piu` sicura possibile per l'uso con tanti portatili che si connettono individualmente alla rete. Utilizzo chiavi asimmetriche per l'autenticazione e un pool di indirizzi dinamico. Questa configurazione, cosi` com'e` fatta, accetta fino a 64 client contemporaneamente. Uso tutti i mezzi di autenticazione possibili, ovvero chiavi diverse per ogni client e uno username/password. E` anche possibile richiedere l'inserimento di una password per usare le chiavi sui client. Questa configurazione crea un tunnel, non un bridge.

Impostazione server Linux

. ./vars
./clean-all
./build-ca

Attenzione a come viene invocato "vars" nella prima riga, "punto spazio punto barra"... e` un po` molesto. Alle domande che verranno poste da "build-ca", e` necessario inserire dei valori dove manca il default, e NON MODIFICARE nulla dove il default e` presente. Ora la CA e` configurata. La chiave privata della CA dovrebbe essere supersegreta, da tenere in un floppy in una cassaforte in cantina con davanti un cartello "attenti al leopardo".

# configurazione per openvpn 2.0
# per gestire un server per molti client

# interfaccia pubblica, porta e protocollo
local 62.123.161.1
port 1194
proto udp

# device usato dalla vpn
dev tun0

# io sono il server TLS (sempre vero per una conf a un server e molti client)
tls-server

# il file con dentro il numero primo per l'algoritmo Diffie Helman
# (serve solo per il server tls).
dh dh2048.pem

# il file con la chiave pubblica
# della CA che ha firmato i certificati per tutti gli endpoint.
ca ca.crt

# il file con la chiave pubblica del mio endpoint (il server)
cert server.crt

# il file con la chiave privata del mio endpoint (il server)
key server.key

# il file con la shared key per l'autenticazione dei pacchetti
# di handshake
#   The tls-auth directive adds an additional HMAC signature to
#   all SSL/TLS handshake packets for integrity verification.
#   Any UDP packet not bearing the correct HMAC signature can
#   be dropped without further processing
tls-auth tls-auth.key 0

# rete per l'interfaccia privata. il server si prende il .1 e
# i clienti gli altri indirizzi di questa subnet.
# Qui si usa una rete che non sia quella locale del server.
server 192.168.99.0 255.255.255.0

# tengo traccia degli indirizzi assegnati ai server e riassegno sempre
# quelli usando questo file. (facoltativo)
ifconfig-pool-persist server-pool-cache.txt

# configurazioni di routing da insegnare ai client che si collegano.
# in pratica qui devo dire al client che 192.168.0.0/24 (la mia LAN) va mandato alla vpn
# posso ripetere piu` righe con piu` reti/host, e verranno tutti impostati nel routing
push "route 192.168.0.0 255.255.255.0"

# configurazioni varie da insegnare ai client Windows (non hanno effetto su linux, a quanto ne so)
push "dhcp-option DNS 192.168.0.1"
push "dhcp-option WINS 192.168.0.2"
push "dhcp-option DOMAIN pippo.it"

# consento ai clients di vedersi fra di loro
# client-to-client

# uso il nome utente come "nome" del client. Togliere se non si usa l'autenticazione username/password con PAM
username-as-common-name

# keepalive e timeout: ping ogni 30 secondi e timeout di 120 secondi.
keepalive 30 120

# Compressione sul link
comp-lzo

# downgrade dei privilegi utente dopo l'avvio:
user nobody
group nogroup

# in caso di reload, tieni in memoria i dati che non potresti piu` rileggere a causa del privilegio insufficiente
persist-key
persist-tun

# file che indica lo stato delle connessioni, ad uso di chi lo vuole leggere
status server-status.log

# autenticazione deli utenti tramite PAM. Non solo gli utenti devono avere una
# chiave valida per la vpn, ma devono anche essere in server-passwords  e devono
# inserire la password quando si collegano. Vedere /etc/pam.d/openvpn.
plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so openvpn

# verboso
verb 3

# configurazione per openvpn 2.0, per autenticare gli utenti su un file di testo
# e non su /etc/passwd

# il file delle password deve essere generato con htpasswd.

# ho dovuto inserire la riga "account" per evitare che gli utenti debbano esistere anche in
# passwd.

auth    required    /lib/security/pam_pwdfile.so  pwdfile /etc/openvpn/server-passwords
account sufficient  /lib/security/pam_permit.so

Configurazione per i client Windows

La configurazione per i client windows e linux e` praticamente identica. Qui descrivo quella per windows, ma per Linux basta prendere i files di configurazione e metterli in /etc/openvpn.

client
dev tun
proto udp
nobind
float
remote <hostname o ip pubblico del server>
# file con le chiavi che abbiamo copiato prima dalla directory di easy-rsa:
ca ca.crt
cert client1.crt
key client1.key
# il certificato del server deve essere di tipo "server"
# questo evita che chi possiede un certificato client possa spacciarsi per server
ns-cert-type server
tls-auth tls-auth.key 1
# autenticazione con user e password da PAM (togliere se non si usa)
auth-user-pass
# compressione
comp-lzo
#loglevel 3
verb 3


Configurazione LAN to LAN fra due Linux, usando le chiavi asimmetriche

Per la gestione delle chiavi, riferirsi alla sezione Linux-Windows, perche` e` identica.

Per la configurazione dei due endpoint, queste sono due configurazioni di esempio. Uno dei due endpoint sara` sempre un "server" e l'altro un "client" per quanto riguarda l'autenticazione, ma non e` importante quale dei due lo sia.

Configurazione "server". In questa configurazione non sono compresi i comandi per il keepalive che invece ha senso includere. Vedere prima per informazioni.

# per usare un device tun dinamico, usa
# "dev tun". qui ne uso uno statico.
dev tun1

# Indirizzo IP pubblico del remoto
remote xx.xx.xx.xx

# Interfaccia locale a cui mi bindo (pubblica)
local xx.xx.xx.xx

# Definizione indirizzi IP privati del tunnel.
# Questi saranno dati alle interfaccie "interne" (tunX) dei due endpoint.
# ifconfig <locale> <remoto>
ifconfig 10.0.0.254 172.16.0.253

# Definisco uno o piu` routing verso la lan remota (una o piu` righe)
# Formato: route  <netbase> <netmask>
route 172.16.0.0 255.255.255.0

# questa parta e` il server TLS
tls-server

# il file con dentro il numero primo per l'algoritmo Diffie Helman
# (serve solo per il server tls).
dh dh2048.pem

# il file con la chiave pubblica
# della CA che ha firmato i certificati per tutti gli endpoint.
ca ca.crt

# il file con la chiave pubblica del mio endpoint
cert server.crt

# il file con la chiave privata del mio endpoint
key server.key

# il file con la shared key per l'autenticazione dei pacchetti
# di handshake
#   The tls-auth directive adds an additional HMAC signature to
#   all SSL/TLS handshake packets for integrity verification.
#   Any UDP packet not bearing the correct HMAC signature can
#   be dropped without further processing
tls-auth tls-auth.key 0

# la porta che uso per i dati crittati verso/da il remoto.
# se uso "port" intendo la stessa per tutti e due,
# altrimenti uso "lport" e "rport" per locale e remoto.
# ogni tunnel deve avere una porta diversa.
port 9001

# dopo aver avviato il tunnel, posso usare questi uid e gid
# per non restare root, oppure anche no. A scelta
user nobody
group nogroup

# abilito la compressione (se voglio)
comp-lzo

# log level (da 0 per il minimo a 9 per il massimo)
verb 3

Configurazione lato client. Fondamentalmente uguale al server se si escludono sette piccoli particolari. Anche qui vale il discorso di includere le funzioni di keepalive.

# per usare un device tun dinamico, usa
# "dev tun". qui ne uso uno statico.
dev tun1

# Indirizzo IP pubblico del remoto
remote xx.xx.xx.xx

# Interfaccia locale a cui mi bindo (pubblica)
local xx.xx.xx.xx

# Definizione indirizzi IP privati del tunnel.
# Questi saranno dati alle interfaccie "interne" (tunX) dei due endpoint.
# ifconfig <locale> <remoto>
ifconfig 172.16.0.253 10.0.0.254

# Definisco uno o piu` routing verso la lan remota (una o piu` righe)
# Formato: route  <netbase> <netmask>
route 10.0.0.0 255.255.255.0

# questa parta e` il client TLS
tls-client

# il file con la chiave pubblica
# della CA che ha firmato i certificati per tutti gli endpoint.
ca ca.crt

# il file con la chiave pubblica del mio endpoint
cert client.crt

# il file con la chiave privata del mio endpoint
key client.key

# il file con la shared key per l'autenticazione dei pacchetti
# di handshake
#   The tls-auth directive adds an additional HMAC signature to
#   all SSL/TLS handshake packets for integrity verification.
#   Any UDP packet not bearing the correct HMAC signature can
#   be dropped without further processing
tls-auth tls-auth.key 1

# la porta che uso per i dati crittati verso/da il remoto.
# se uso "port" intendo la stessa per tutti e due,
# altrimenti uso "lport" e "rport" per locale e remoto.
# ogni tunnel deve avere una porta diversa.
port 9001

# dopo aver avviato il tunnel, posso usare questi uid e gid
# per non restare root, oppure anche no. A scelta
user nobody
group nogroup

# abilito la compressione (se voglio)
comp-lzo

# log level (da 0 per il minimo a 9 per il massimo)
verb 3


Note