Changelog:
1.0.0 Release Iniziale
1.0.1 Inserita generazione certificati client + modifica parte iniziale
1.0.2 Inserita configurazione IP specifico per i client OpenVPN
1.1.1 Riorganizzata guida e migliorata leggibilità
1.1.2 Bugfix
1.1.3 Bugfix
1.1.4 Rimossa la configurazione firma HMAC per problemi sulle recenti versioni di OpenVPN
1.1.5 Modificato file di configurazione con cifratura AES-256-GCM
Come tutti sappiamo, già da tempo gli operatori hanno smesso di fornire IP pubblici sulle sim dei telefoni cellulari. Questa guida ha il duplice scopo di ottenere un IP pubblico su linee 3G/4G da utilizzare per i dispositivi interni e/o accedere dall'esterno alla propria rete LAN.
Cosa serve:
- Connessione 3G/4G correttamente configurata e funzionante.
- Dispositivo Linux (Raspberry o PC) correttamente installato con un'interfaccia avente IP statico e come default gateway la connessione 3G/4G.*
*
La guida è sviluppata su questa configurazione, ma poi ovviamente il client VPN con opportuni certificati può essere utilizzato ovunque.
- Dispositivo Linux correttamente installato con un'interfaccia avente IP pubblico (VPS o altra connessione con IP pubblico di cui si è legittimi fruitori. Ricordo che la condivisione di connessioni internet è illegale).
NOTE
- Ho saltato la parte di configurazione dei dispositivi Linux: partiamo dal presupposto che siano correttamente funzionanti. Se avete bisogno, in rete c'è ampia documentazione o potete chiedere a me, ma in ogni caso esula dallo scopo di questa guida.
- Per gestire il traffico uscente, nel caso si voglia tunnelizzare il traffico attrverso la VPN, serve implementare il routing sul Raspberry/PC in modo che faccia da gateway per tutta la propria rete. Ad oggi questa parte di configurazione non l'ho ancora implementata, quindi sulla release attuale non la troverete. Non escludo di inserirla, tempo permettendo, in futuro. L'alternativa per il momento è installare un client VPN su ogni dispositivo che necessiti di utilizzare l'IP pubblico.
Capitolo 1: Installazione Server
Installo Open VPN:
Codice:
apt install openvpn
Creo una cartella per la Certification Authorithy e la scarico :
Codice:
mkdir /etc/easyrsa
cd /etc/easyrsa
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.4/EasyRSA-3.0.4.tgz
Nota: la versione di EasyRSA viene aggiornata di continuo, di conseguenza suggerisco di verificare la versione corrente e sostituirla al numero nel link qui sopra (....v3.0.X/EasyRSA-3.0.X.tgz
I punti che seguono avranno di conseguenza il nome directory modificato a seconda della versione scaricata.
La estraggo:
Codice:
tar xvf EasyRSA-3.0.4.tgz
cd /etc/easyrsa/EasyRSA-3.0.4/
Mi faccio una copia del file di esempio:
Codice:
cp vars.example vars
Edito il file di configurazione:
Vado nella sezione set var e tolgo il commento (è un certificato autogenerato, quindi si può scrivere quello che si vuole):
Codice:
set_var EASYRSA_REQ_COUNTRY "IT"
set_var EASYRSA_REQ_PROVINCE "Italia"
set_var EASYRSA_REQ_CITY "A"
set_var EASYRSA_REQ_ORG "B"
set_var EASYRSA_REQ_EMAIL "me@example.net"
set_var EASYRSA_REQ_OU "C"
Adesso posso installare il server certificati e la chiave server:
Codice:
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa gen-req server nopass
./easyrsa sign-req server server
Creo la chiave di cifratura (questo ci metterà un po’):
Copio i file generati nella cartella di OpenVPN:
Codice:
cp /etc/easyrsa/EasyRSA-3.0.4/pki/issued/server.crt /etc/openvpn/
cp /etc/easyrsa/EasyRSA-3.0.4/pki/private/server.key /etc/openvpn/
cp /etc/easyrsa/EasyRSA-3.0.4/pki/ca.crt /etc/openvpn/
cp /etc/easyrsa/EasyRSA-3.0.4/pki/dh.pem /etc/openvpn/
Generazione certificati client
Per la generazione dei certificati client mi posiziono nella cartella di EasyRSA e lancio i seguenti comandi:
Codice:
cd /etc/easyrsa/EasyRSA-3.0.4/
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1
Il primo comando è la richiesta di generazione di un certificato chiamato client1, senza password (opzione nopass).
Il secondo comando è la richiesta di firma del certificato client1 di tipo client. Al termine del processo avremo creato 2 file client1.key e client1.crt rispettivamente chiave e certificato, presenti nelle cartelle:
Cartella chiavi /etc/easyrsa/EasyRSA-3.0.4/EasyRSA-3.0.4/pki/private
Cartella certificati /etc/easyrsa/EasyRSA-3.0.4/pki/issued
Questa procedura può essere ripetuta cambiando nome, se si desidera creare più certificati per la connessione simultanea di più client.
Configurazione Server OpenVPN:
Creo nella cartella /etc/openvpn/ un file server.conf
Codice:
nano /etc/openvpn/server.conf
All'interno inserisco i seguenti parametri:
Codice:
### OpenVPN server.conf ###
port 1194
proto tcp4
dev tun
### Files
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
###
server 10.8.0.0 255.255.255.0
topology subnet
client-config-dir /etc/openvpn/ccd
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
keepalive 60 120
key-direction 0
cipher AES-256-GCM
auth SHA256
max-clients 6
persist-key
client-to-client
status openvpn-status.log
log /etc/openvpn/openvpn.log
log-append /etc/openvpn/openvpn.log
verb 3
Riavvio il server. Dopo il riavvio con il comando
Verifico di avere attiva un'interfaccia con tun0 IP 10.8.0.1
Nel caso si desideri assegnare al client un IP specifico, creare un file nella cartella /etc/openvpn/ccd con il nome del client generato (nel nostro esempio client1):
Codice:
cd /etc/openvpn/ccd
nano client1
ifconfig-push 10.8.0.X 255.255.255.0
Ed aggiungere la seguente riga nel file di configurazione:
Codice:
client-config-dir /etc/openvpn/ccd
Capitolo 2: Forwarding e Routing
Bene... A questo punto abbiamo un'interfaccia lan e un'interfaccia VPN denominata tun0. Dobbiamo fare in modo che il traffico che arriva sulla tun0 sia girata alla lan (quello che normalmente faremmo nella sezione "virual server" di un qualsiasi router). Per abilitare permanentemente il packet forwarding dobbiamo editare il file /etc/sysctl.conf e togliere il commento dalla riga net.ipv4.ip_forward=1 Quindi:
Codice:
nano /etc/sysctl.conf
Dopo la modifica deve presentarsi cosi:
Codice:
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
A questo punto applichiamo le modifiche appena fatte:
Codice:
sysctl -p
sysctl --system
Ora, le regole di routing si applicano modificando iptables, questa guida non vuole essere un trattato sul funzionamento di iptables, anche perchè sono la persona meno indicata, quindi mi limiterò a ciò che serve per quello che vogliamo ottenere. Prima cosa: i comandi lanciati con iptables non sono permanenti e vengono persi con il riavvio, di conseguenza dobbiamo installare un programma che ci consenta di renderle permanenti, questo programma si chiama iptables-persistent. Quindi:
Codice:
apt install iptables-persistent
Ora creiamo il file di configurazione, o se già creato lo editiamo cancellando tutto il contenuto presente:
Codice:
nano /etc/iptables/rules.v4
E inseriamo le regole di seguito descritte:
Codice:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i tun0 -p icmp -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 1194 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.8.0.0/24 -i tun0 -o eth0 -m conntrack --ctstate NEW -j ACCEPT
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i tun0 -o eth0 -m conntrack --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
-A PREROUTING -i eth0 -p tcp -m tcp --dport XXXX -j DNAT --to-destination 10.8.0.XXX
COMMIT
Spiegazione:
Sezione *filter: blocco tutto il traffico inbound e di forward su tutte le interfacce, ad eccezione del traffico sulle porte 22 e 1194, in questo modo ho il server completamente chiuso dall'esterno, ad eccezione delle porte 1194 necessaria per il finzionamento di OpenVPN, e la porta 22 per l'SSH. Questa configurazione è particolarmente utile nel caso di VPS con IP pubblico direttamente assegato all'interfaccia eth0. Tutte le regole di forward sono per consentire il traffico tra le due interfacce eth0 e tun0.
Sezione *nat: faccio il NAT di tutto il traffico outbound proveniente dall'interfaccia tun0. Questo serve per consentire la navigazione attraverso il tunnel VPN. La riga di prerouting serve per inoltrare il traffico di una determinata porta verso un IP della VPN.
Per applicare le regole, lanciare:
Codice:
systemctl restart netfilter-persistent
Per vedere le regole effettivamente applicate, è sufficiente lanciare il comando:
Codice:
iptables -L -n -t nat
A questo punto abbiamo un server OpenVPN correttamente funzionante con interfaccia eth0 con aperte solamente la porta 1194 e 22 e interfaccia tun0 con IP 10.8.0.1.
DISCLAIMER: questa guida è frutto delle mie ricerce e i miei test con i servizi e le configurazioni da me scelti, non mi assumo nessuna responsabilità in caso di qualsiasi problema su servizi/apparecchiature che andrete ad acquistare.