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