OpenVPN con assegnazione IP statici


Siccome è stata davvero dura riuscire a risalire a una configurazione funzionante di un server OpenVPN che assegni IP statici, ho deciso di scrivere un HOWTO.

In rete, soprattutto sui forum, ci sono una miriade di informazioni errate, incomplete e contrastanti.

Avete mai avuto la necessità di configurare un server OpenVPN in modo che assegni in maniera statica gli indirizzi IP? Avete client misti (Linux e Windows)?
La configurazione non è così semplice, almeno, bisogna sapere di cosa si parla. Il problema, per chi ignora il tipo di problema, non è solo la differenza di configurazione lato server per i client Windows e Linux, come vedremo.


Architettura

  1. Nodo A: OpenVPN server sotto ADSL pubblica con un servizio a cui si deve accedere solo da VPN (magari un server HTTP non pubblico);
  2. Nodo B: (altro/i apparato/i collegati al nodo A tramite switch collegato alla rete interna per mezzo della seconda scheda di rete del nodo A);
  3. Nodo C: OpenVPN client Linux sotto ADSL pubblica;
  4. Nodo D: OpenVPN client Windows sotto ADSL pubblica.

Nota che le tre ADSL di cui si parla sono diverse. Per il nodo C e il nodo D potrebbe essere anche la stessa, l’importante è che non sia la stessa del nodo A visto che la premessa per l’uso di OpenVPN è proprio accedere da una rete pubblica verso un proprio server collocato altrove (ufficio, cloud, …).

Il nodo A ha due schede di rete, la prima collegata su rete 192.168.0.0/24 e la seconda su rete 192.168.30.0/24 connessa al nodo B. Dall’esterno, nodo C, mi deve essere possibile, una volta facente parte della VPN, accedere sia a 192.168.0.0/24 che 192.168.30.0/24 (nodi A e B su rete interna). La prima scheda di rete del nodo A ha indirizzo IP 192.168.0.100, mentre la seconda 192.168.30.1.

Il nodo A è esposto su una ADSL raggiungibile su un certo indirizzo IP pubblico X.Y.Z.W, volendo si può anche usare un nome host, l’importante è che la risoluzione DNS punti all’indirizzo IP corretto. In caso di ADSL con IP dinamico si deve ricorrere a un servizio di DNS dinamico come noip.com. Se invece l’indirizzo IP è statico, allora si può anche indicare quello nel file di configurazione del client.

Va configurato il router del nodo A affinché sia abilitato un NAT su una porta da usare per connettersi al server OpenVPN. Basta dire al router che, per esempio, quando c’è una richiesta che usa la porta 3000, questa deve essere data in pasto al server OpenVPN che è su indirizzo 192.168.0.100 su porta 1193.

Configurazioni

Il server OpenVPN:
port 1193
proto udp
dev tun
tun-mtu 1500
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh1024.pem
server 10.20.0.0 255.255.255.0
push "route 192.168.30.0 255.255.255.0"
topology p2p
script-security 2
client-to-client
client-config-dir /etc/openvpn/clients
max-clients 15
user nobody
group nobody
keepalive 10 120
comp-lzo
persist-key
persist-tun
script-security 3
up /etc/openvpn/up.sh
down /etc/openvpn/down.sh
status /var/log/openvpn-status.log
log /var/log/openvpn.log
log-append /var/log/openvpn.log
verb 3

Il client OpenVPN:

client
float
comp-lzo
float
nobind
persist-key
persist-tun
dev tun
tun-mtu 1500
remote X.Y.Z.W 3000
proto udp
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
verb 3
route-delay 2
mute 20
status /var/log/openvpn-status.log
log /var/log/openvpn/openvpn.log
log-append /var/log/openvpn.log
verb 3

Chiaramente per X.Y.Z.W vale il discorso fatto. O si indica esattamente l’indirizzo IP pubblico o uno nome host a cui è sempre associato l’indirizzo IP corretto.

La configurazione client di cui sopra va bene per Linux. Naturalmente, nel caso di Windows si devono eliminare le tre righe relative ai log. E al posto di:

ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key

va impostato il percorso Windows in cui ci saranno i certificati importati nel vostro client OpenVPN Windows, oppure va usato un file di configurazione con estensione .ovpn che al posto del percorso ai certificati abbia il contenuto dei file corrispondenti racchiuso tra i seguenti tag:

<ca></ca>, <cert></cert> e <key></key>.

<ca> per il certificato della CA. <cert> per quello del certificato server e <key> per la chiave del certificato server. Nei tag, per i certificati, va riportato tutto ciò che è tra -----BEGIN CERTIFICATE----- e -----END CERTIFICATE----- incluso.

Tutto ciò prevede chiaramente la generazione di una CA e di certificati server e client personali, ovvero, ogni client ha il suo certificato unico. La cosa fondamentale è quella di dare a ciascun certificato un CN diverso. Il server OpenVPN darà l’indirizzo IP giusto andando a leggere il CN del certificato che presenta il client per la connessione al server OpenVPN e se più certificati hanno lo stesso Common Name avrete brutte sorprese. La generazione di una CA e relativi certificati è un procedimento standard ed è ben documentato sul sito di OpenVPN: ecco il link.

Come si assegnano indirizzi IP statici

Sul server, nella directory /etc/openvpn/clients, possiamo stabilire l’indirizzo di ciascun client.

Basta, per esempio, creare il file “android” con la seguente unica riga:

ifconfig-push 10.20.0.8 10.20.0.1

in questo modo, il client che si presenta con il CN “android” avrà assegnato l’indirizzo IP 10.20.0.8. Avendo scelto per l’appunto indirizzi VPN 10.20.0.0/24. Questa è una configurazione che va bene per Linux e derivati (come per l’appunto Android). E 10.20.0.1 è l’indirizzo del server VPN che resterà immutato.

Per Windows, invece, bisogna impostare una configurazione particolare e limitarsi a un certo numero di indirizzi IP. La configurazine da mettere nel server è del tipo:

ifconfig-push 10.20.0.26 10.20.0.25

Per avere assegnato l’indirizzo IP 10.20.0.26.

Se si usasse una configurazione come Linux, o una coppia di IP non validi, il client Windows riporterebbe nel file di log il seguente messaggio di errore:

There is a problem in your selection of –ifconfig endpoints [local=10.20.0.20, remote=10.20.0.1].  The local and remote VPN endpoints must exist within the same 255.255.255.252 subnet.  This is a limitation of –dev tun when used with the TAP-WIN32 driver.  Try ‘openvpn –show-valid-subnets’ option for more info.

Bisogna sapere quali coppie di indirizzi usare.

Sotto Windows si dà il comando:

openvpn --show-valid-subnets

OpenVPN Windows

determinazione coppie IP validi

Ed ecco determintate tutte le possibili coppie da usare. Chiaramente l’insieme di questi indirizzi è limitato, per tanto, se si può, meglio usare client Linux, sennò va tenuta in mente questa limitazione.

A questo punto vi direte: abbiamo finito, no?

No.

Se si guarda il file di configurazione del server abbiamo imposto che openvpn sia eseguito da un utente nobody del gruppo nobody. Bisogna dare i seguenti comandi per rendere la configurazione degli indirizzi IP statici applicabile:

chmod a+rx /etc/openvpn (in certi casi potrebbe anche non servire, usarlo solo nel caso la configurazione non assegna l’indirizzo IP voluto)
chown -R nobody:nobody /etc/openvpn

Inoltre vediamo che ci sono le seguenti due righe:

up /etc/openvpn/up.sh
down /etc/openvpn/down.sh

A che servono?

Il parametro up indica di eseguire lo script corrispondente suna volta avviato il server OpenVPN, mentre down indica lo script da eseguire quando il server viene fermato. Questi due script sono importanti se avete un firewall sul sistema Linux o se volete impostare un firewall tramite gli stessi. Va detto che debbono avere il permesso di eseguibilità.

Io sono partito da un caso di assenza di firewall, così da abilitarlo nello scirpt up.sh:

#!/bin/bash
IPTABLES="/sbin/iptables"
VPN_NET="10.20.0.0/24"
TLC_NET="192.168.30.0/24"
LOCAL_NET="127.0.0.1/8"
$IPTABLES -F
#$IPTABLES -F -t nat
$IPTABLES -P INPUT DROP
$IPTABLES -A INPUT -s $VPN_NET -j ACCEPT
$IPTABLES -A INPUT -s $TLC_NET -j ACCEPT
$IPTABLES -A INPUT -s $LOCAL_NET -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 1193 -j ACCEPT
$IPTABLES -A INPUT -p udp --dport 1193 -j ACCEPT
# Allow established traffic to pass back and forth
$IPTABLES -I INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -A FORWARD -s $VPN_NET -j ACCEPT
# Allow traffic initiated from VPN to access LAN
$IPTABLES -I FORWARD -i tun0 -o eth0 \
-s $VPN_NET -m conntrack --ctstate NEW -j ACCEPT
# Allow established traffic to pass back and forth
$IPTABLES -I FORWARD -m conntrack --ctstate RELATED,ESTABLISHED \
-j ACCEPT
$IPTABLES -P OUTPUT ACCEPT

Lo script, come si può vedere, attiva un firewall e permette l’accesso alla VPN 10.20.0.0/24 e alla rete 192.168.30.0/24. Ricordarsi di aggiungere le seguenti righe in /etc/sysctl.conf:

# Controls IP packet forwarding
net.ipv4.ip_forward = 1

Solitamente già sono presenti e quel valore 1 è imposto di default a 0. Dopo la modifica a detto file va eseguito il comando:

sysctl -p

Naturalmente, se si riavvia tutto il nodo non bisogna fare nulla in quanto il file /etc/sysctl.conf viene letto all’avvio della macchina e configura correttamente il passaggio dei pacchetti tra le interfaccie (eth0/eth1/tun0).

Ecco invece, lo script down.sh:

#!/bin/bash
IPTABLES="sudo /sbin/iptables"
$IPTABLES -F
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT

Quest’ultimo disabilita il firewall e permette qualsiasi tipo di connessione.

A questo punto avete il vostro server OpenVPN che assegna gli indirizzi IP da voi decisi sia per nodi Linux (e derivati) che per Windows. Non vi resta che generare tanti certificati client quante sono le macchine che vorranno fare parte della vostra VPN e magari impostare il parametro max-clients con il massimo numero di client OpenVPN che volete fare connettere.

Nel mio caso sono 15:
max-clients 15

Aggiungere IP statici

Si può anche modificare la configurazione aggiungendo nuove corrispondenze tra CN di nuovi certificati client e corrispondente indirizzo IP da assegnare senza riavviare il server OpenVPN. Si prepara il solito file da aggiungere nella directory /etc/openvpn/clients e poi si danno i permessi corretti con il solito comando:

chown -R nobody:nobody/etc/openvpn/clients/

Ottimizzazioni

Nel caso si può consultare il documento: http://community.openvpn.net/openvpn/wiki/Gigabit_Networks_Linux

About these ads

2 thoughts on “OpenVPN con assegnazione IP statici

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...