less openvpn-setup-guide-on-debian-routed-and-bridged-vpn.md
OpenVPN: setup guide on Debian (routed and bridged VPN)
# archivio storico — scritto anni fa, conservato com'era. Alcune info sono datate.
Argomento assai delicato e al tempo stesso molto affascinante! La soluzione che vi propongo vi permette di collegare ad un server centrale sia altre macchine sfruttando il bridging di rete (TAP), sia dispositivi mobili utilizzando il routing di rete (TUN).
Presupposto principale è quello di conoscere il concetto di Virtual Private Network (VPN) e di conseguenza buona parte del mondo che vi è dietro. Una lettura iniziale e interessante su cos’è una VPN la trovate seguendo il relativo link su wikipedia.
Riassumendo molto il concetto credo si possa affermare che:
“…una VPN è l’estensione di una rete locale privata che collega tra loro server e client variamente dislocati su un ampio territorio sfruttando una connessione pubblica ad Internet per realizzare di fatto una rete LAN, detta appunto virtuale e privata, del tutto equivalente a un’infrastruttura fisica di rete (ossia con collegamenti fisici) appositamente dedicata.”
A dire il vero non poche sono state le difficoltà che ho incontrato nel realizzare la mia personale VPN. Sulla rete prolificano decine di migliaia di guide. Se non trovate qualcosa che vi server in questa non vi resta che cercare.
Disclaimer: Fate attenzione a quanto stiamo per realizzare. Eventuali errori possono esporre la vostra rete interna a qualche malintenzionato, quindi procedete con cautela! Una VPN ha nella sicurezza della trasmissione dei dati la sua ragione di esistere, ma ricordate che il primo baluardo in fatto di sicurezza siete voi!
Vi dico subito che l’autenticazione verso la nostra VPN avverrà attraverso l’emissione di certificati digitali. Se qualche certificato dovessero andare perso o rubato vi basterà revocarlo per impedire l’accesso alla rete. Si possono facilmente implementare altre tipologie di autenticazione ma non saranno oggetto di questa guida.
CREATE A BRIDGE
OpenVPN sarà il software che ci permetterà di creare la nostra rete privata. Prima occupiamoci di creare un bridge di rete (br0).
apt-get install uml-utilities bridge-utils
Attiviamo il relativo modulo nel kernel
modprobe tun
Il seguente comando serve a rendere permanente la creazione dello speciale device di loopback tap0 assegnandolo ad uno specifico utente: ad esempio all’utente nobody
/usr/sbin/tunctl -t tap0 -u nobody
Adesso è arrivato ill momento di eliminare ogni pregressa configurazione delle interfacce di rete che entreranno a far parte del bridge di rete
ifconfig eth0 0.0.0.0 promisc up
ifconfig tap0 0.0.0.0 promisc up
Creiamo il nostro bridge e aggiungiamoci i device di rete
brctl addbr br0
brctl addif br0 tap0
brctl addif br0 eth0
Verificate con il comando brctl show che tutto sia in ordine
bridge name bridge id STP enabled interfaces
br0 8000.1c6f653460a7 no eth0
tap0
È arrivato il momento di tirare su lo speciale device assegnando un IP
ifconfig br0 up
ifconfig br0 10.105.1.150/24
route add default gw 10.105.1.1
se il route è impostato correttamente il comando /sbin/route -n dovrebbe restituire qualcosa del genere
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.105.1.1 0.0.0.0 UG 0 0 0 br0
10.105.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
Ora dovremmo avere connettività di rete su entrambe le interfacce di rete. Per rendere permanente quanto fatto sino ad ora sarà necessario modificare opportunamente il file /etc/network/interfaces. Segue un esempio basta sul mio. L’indirizzo IP del bridge e di conseguenza dell’interfaccia di rete dovrà essere corretto in base alla vostra subnet.
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
auto br0
#iface br0 inet dhcp
iface br0 inet static
bridge-ports eth0 tap0
bridge_stp on
bridge_hello 2
bridge_maxage 12
bridge_prio 1000
bridge_maxwait 0
address 10.105.1.150
netmask 255.255.255.0
gateway 10.105.1.1
# The primary network interface
auto eth0
iface eth0 inet manual
up ip link set $IFACE up
down ip link set $IFACE down
up ip link set $IFACE promisc on
down ip link set $IFACE promisc off
up brctl addif br0 $IFACE || true
down brctl delif br0 $IFACE || true
auto tap0
iface tap0 inet manual
pre-up /usr/bin/tunctl -t tap0 -u nobody
up ip link set $IFACE up
up ip link set $IFACE promisc on
down ip link set $IFACE promisc off
down ip link set $IFACE down
up brctl addif br0 $IFACE || true
down brctl delif br0 $IFACE || true
INSTALL OPENVPN
È giunto il momento di installare openvpn è di configurarne il demone.
apt-get install openvpn
Bisognerà iniziare a creare i file della nostra Certification Authority
Procediamo alla creazione dei certificati necessari. Segue uno spaccato di comandi che potranno servire allo scopo.
cp -r /usr/share/easy-rsa/ /etc/openvpn
mkdir -pv /etc/openvpn/easy-rsa/keys
sed -ie 's/KEY_NAME="EasyRSA"/KEY_NAME="MyVPN"/' /etc/openvpn/easy-rsa/vars
openssl dhparam -out /etc/openvpn/dh1024.pem 1024
cd /etc/openvpn/easy-rsa && . ./vars
# Optionally set indentity information for certificates:
# export KEY_COUNTRY="<%COUNTRY%>" # 2-char country code
# export KEY_PROVINCE="<%PROVINCE%>" # 2-char state/province code
# export KEY_CITY="<%CITY%>" # City name
# export KEY_ORG="<%ORG%>" # Org/company name
# export KEY_EMAIL="<%EMAIL%>" # Email address
# export KEY_OU="<%ORG_UNIT%>" # Orgizational unit / department
cd /etc/openvpn/easy-rsa && ./clean-all
cd /etc/openvpn/easy-rsa && ./build-ca --batch
cd /etc/openvpn/easy-rsa && ./build-key-server --batch server
cp /etc/openvpn/easy-rsa/keys/server.crt /etc/openvpn
cp /etc/openvpn/easy-rsa/keys/server.key /etc/openvpn
cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn
cp /etc/openvpn/easy-rsa/keys/crl.pem /etc/openvpn
cd /etc/openvpn/ && openvpn --genkey --secret ta.key
Passiamo adesso alla configurazione del server. Quello che segue si pone ad esempio l’obiettivo di creare due differenti istanze di openvpn che permetteranno di collegare due subnet affinché i dispositivi IOS ad esempio possano vedere i PC e i server sulla net e viceversa.
Si consideri che la subnet 10.105.1.0/24 sarà utilizzata per la maggior parte dei server e dei PC, mentre la subnet 10.105.2.0/24 sarà dedicata ai dispositivi mobili quali ad esempio i dispositivi IOS, nonché da tutti quelli che non rendono possibile l’utilizzo dell’interfaccia tapX bensì quella tunX.
SERVER “Bridging Mode”
Diamo uno sguardo al file /etc/openvpn/server.conf
mode server
proto udp
port 1194
dev tap0
client-to-client
client-config-dir ccd
tls-server
tls-auth ta.key 0
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
crl-verify crl.pem
keepalive 10 120
daemon
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
verb 3
mute 20
script-security 3 system
cipher AES-256-CBC
auth sha256
push "route 10.105.2.0 255.255.255.0 10.105.1.150"
push "route-delay 5 600"
Le due direttive push in fondo al file avranno maggior senso alla fine di tutto. Serviranno a coloro che si collegano alla VPN di installare correttamente il traffico verso gli IP della subnet “mobile”.
Nel file sono presenti le direttive sui certificati che andranno creati prima di avviare il server e che saranno necessari anche per la creazione delle chiavi per i client.
Procediamo alla creazione dei certificati necessari. Segue uno spaccato di comandi che potranno servire allo scopo.
cp -r /usr/share/easy-rsa/ /etc/openvpn
mkdir -pv /etc/openvpn/easy-rsa/keys
sed -ie 's/KEY_NAME="EasyRSA"/KEY_NAME="MyVPN"/' /etc/openvpn/easy-rsa/vars
openssl dhparam -out /etc/openvpn/dh1024.pem 1024
cd /etc/openvpn/easy-rsa && . ./vars
# Optionally set indentity information for certificates:
# export KEY_COUNTRY="<%COUNTRY%>" # 2-char country code
# export KEY_PROVINCE="<%PROVINCE%>" # 2-char state/province code
# export KEY_CITY="<%CITY%>" # City name
# export KEY_ORG="<%ORG%>" # Org/company name
# export KEY_EMAIL="<%EMAIL%>" # Email address
# export KEY_OU="<%ORG_UNIT%>" # Orgizational unit / department
cd /etc/openvpn/easy-rsa && ./clean-all
cd /etc/openvpn/easy-rsa && ./build-ca --batch
cd /etc/openvpn/easy-rsa && ./build-key-server --batch server
cp /etc/openvpn/easy-rsa/keys/server.crt /etc/openvpn
cp /etc/openvpn/easy-rsa/keys/server.key /etc/openvpn
cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn
cp /etc/openvpn/easy-rsa/keys/crl.pem /etc/openvpn
cd /etc/openvpn/ && openvpn --genkey --secret ta.key
SERVER “Routing Mode”
Se tutto è andato bene, tirare sul la seconda istanza che si occuperà di permettere ai dispositivi mobile di collegarsi sarà semplicissima. Segue un spaccato del file server_mobile.conf
proto tcp-server
port 1194
dev tun0
tcp-nodelay
tls-server
tls-auth ta.key 0
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
crl-verify crl.pem
user nobody
group nogroup
persist-key
persist-tun
cipher BF-CBC
auth SHA1
comp-lzo
script-security 3 system
keepalive 30 120
status /var/log/openvpn/openvpn-statusmobile.log
log /var/log/openvpn/openvpn-mobile.log
verb 3
client-config-dir ccd
mode server
topology "subnet"
push "topology subnet"
server 10.105.2.0 255.255.255.0
push "route-delay 5 600"
route 10.105.2.0 255.255.255.0
ifconfig-pool-persist ipp_mobile.txt
push "route 10.105.1.0 255.255.255.0"
client-to-client
client-connect "/etc/openvpn/connect"
client-disconnect "/etc/openvpn/disconnect"
up "/etc/openvpn/up_mob.sh"
#push "redirect-gateway def1 bypass-dhcp"
#push "dhcp-option DNS 8.8.8.8"
#push "dhcp-option DNS 8.8.4.4"
Le ultime righe che seguono potrebbe servirvi qualora desideriate fare in modo che tutto il traffico internet dei dispositivi mobili passi attraverso la VPN. Preferisco sinceramente scegliere a livello di client se e quando usufruire del beneficio. Del resto la VPN è vostra è la usate come vi aggrada. Non posso qui assolutamente suggerire i benefici di usare una VPN che redirige interamente il traffico attraverso il server VPN. Basti pensare a quali benefici si potrebbero sfruttare quando siete all’estero e il vostro server è in Italia a casa vostra…
È arrivato il momento di riavviare openvpn verificando l’assenza di eventuali errori.
systemctl restart openvpn
CONFIGURAZIONE DEI CLIENTS
Quest’ultima parte passa per due aspetti: la generazione dei certificati (uno per singolo client) e il file di configurazione da usare per collegarsi al server centrale.
Quello che segue è un piccolo script che io uso e mi semplifica parecchio il da farsi.
#!/bin/sh
if [[ -z "$1" ]]; then
echo "Inserisci il CN del futuro client"
echo "Usage: $0 "
exit 1
fi
cd /etc/openvpn/easy-rsa/
. ./vars
. ./build-key --batch $1
Il client che si collegherà al server in Bridging Mode avrà una configurazione di questo tipo:
client
dev tap
proto udp
remote IPOFYOURSERVER 1194
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
keepalive 6 180
tls-auth ta.key 1
ca ca.crt
cert client.crt
key client.key
ns-cert-type server
comp-lzo
float
ping-timer-rem
reneg-sec 3600
mute-replay-warnings
ping 15
verb 6
pull
mute 20
status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log
log-append /var/log/openvpn/openvpn-append.log
tls-cipher TLS-RSA-WITH-AES-256-CBC-SHA
cipher AES-256-CBC
auth sha256
script-security 2
Quella che segue è un esempio di configurazione per i client che si collegheranno in Routing Mode
client
dev tun
tls-client
remote IPYOURSERVER 1194
pull
#ca ca.crt
#cert 6_plus.crt
#key 6_plus.key
#tls-auth ta.key 1
comp-lzo
proto tcp
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
float
key-direction 1
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
...
-----END OpenVPN Static key V1-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 16 (0x10)
Signature Algorithm: sha1WithRSAEncryption
...
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
Fatto!
Se vi occorrono chiarimenti basta chiedere… Buon divertimento!!!
References:
http://manpages.ubuntu.com/manpages/precise/man8/tunctl.8.html