Come configurare una VPN PPTP su Ubuntu 12.04 per accedere in sicurezza ai propri server

Quando un server ssh non è abbastanza per poter amministrare in remoto i propri server entra in gioco VPN.

Con il termine VPN (Virtual Private Network) non si intende una tecnologia in particolare ma una serie di protocolli come PPTP, IPsec, L2TP, (qui i pro e contro delle varie tecnologie) in entrambi i casi lo scopo è raggiungere in sicurezza la propria rete intranet da una rete pubblica insicura, quindi come quella che si può trovare in bar, ristoranti, biblioteche,..

A differenza di un demone ssh, per accedere a un webserver interno o altro servizio non bisogna creare tunnel ad-hoc (es. VNC over SSH, HTTP over SSH,..) ma alla fine del tunnel si avrà un ip locale quindi tutti i servizi della rete privata saranno automaticamente criptati.

VPN Server pptpd su Linux Ubuntu 12.04

Con un paio di comandi si riesce a configurare un server PPTP, questo protocollo è stato creato da Microsoft e personalmente l'ho scelto perché si installa facilmente e funziona out-of-the-box anche su Android e iOS che hanno un client PPTP integrato.

sudo apt-get install pptpd

Ora ci sono un po' di file di configurazione da sistemare

# /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client server secret IP addresses
pptpuser pptpd miapassword *

# /etc/ppp/pptpd-options
# ...
#refuse-pap
#refuse-chap
#refuse-mschap
# Require the peer to authenticate itself using MS-CHAPv2 [Microsoft
# Challenge Handshake Authentication Protocol, Version 2] authentication.
require-mschap-v2
# Require MPPE 128-bit encryption
# (note that MPPE requires the use of MSCHAP-V2 during authentication)
require-mppe-128
# ...

Per non creare confusione commentate i tipi di autenticazione che non verranno usate e lasciate solo mschap-v2 e mppe-128

# /etc/pptpd.conf 
#..
localip 10.0.0.1
remoteip 10.0.1.234-238,10.0.1.245
# ..

Sistemate gli ip secondo le vostre esigenze, tenete presente che localip è l'ip locale del VPN server di quando vi connetterete tramite il vpn client e remoteip sono gli ip che il server VPN potrà assegnarvi e quindi pingare. Un'altra cosa da notare è che salvo routing particolari, quando sarete connessi sarete in una rete che vedrà il VPN server come unica macchina e il VPN server assegnerà ip simili ma su interfacce pppN diverse.

Debug e firewall

Per avere una visione migliore di quello che sta accadendo date uno sguardo al dmesg e ricordate che ogni volta che modificate i file di configurazione dovete riavviare pptpd

sudo service pppd restart

Talvolta non viene riavviato veramente quindi dovete ammazzarlo brutalmente con "killall pptpd". Un'alternativa agli "smanettamenti" Linux è Freebsd e in particolare PfSense, una distribuzione ad-hoc per gestire i router via web che rende queste operazioni gestibili da Web GUI (ma dovete dedicarci una macchina reale o virtuale a questo OS).

Per quanto riguarda il firewall potete aprire le porte necessarie con i seguenti comandi (via: silverlinux )

sudo ufw allow 22
sudo ufw allow 1723
sudo ufw enable

Lo scopo finale è avere un risultato di "ifconfig" di questo tipo quando c'é un utente collegato in VPN.

ppp0      Link encap:Point-to-Point Protocol  
indirizzo inet:10.0.0.1 P-t-P:10.0.1.234 Maschera:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1396 Metric:1
RX packets:306 errors:0 dropped:0 overruns:0 frame:0
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
collisioni:0 txqueuelen:3
Byte RX:25064 (25.0 KB) Byte TX:348 (348.0 B)

VPN Client

Questa è davvero la parte più facile perché tutti i sistemi operativi (Linux Ubuntu/Network Manager, osx, windows, ios, android) hanno un client PPTP integrato.
Nel caso di Android 4 non ho trovato un modo semplice per sapere l'IP ottenuto nella VPN, ma dal terminale con root è possibile saperlo con lo stesso comando sopracitato "ifconfig ppp0"

Controllate di avere la chiavetta in alto a sinistra e la crittografia MPPE (128bit) abilitata.

DNS dinamico

Si tratta di un passo indipendente dalla VPN, ma se volete che il vostro ip dinamico sia accessibile da "fuori casa" avete bisogno di un dns dinamico che vi punti al vostro server casalingo e si aggiorni in caso che l'ip cambi con eventuli riconnessioni.
Il servizio dyndns.org è diventato a pagamento per i nuovi utenti quindi se ne volete un'altro simile, sempre basato sul protocollo dyndns2 potete provare DNSdynamic. (qui un video su come si configura ddclient)

La configurazione di base ci dovrebbe essere quindi non vi resta che provare la vostra vpn da un'altra rete. Rispetto a vari tunnel SSH,  mi sembra una soluzione più pulita perché in questo caso è facilmente accedere in sicurezza (anche da mobile) a tutti i servizi e web server della intranet senza fare fare tunnel o scomodare SSL.

Che ne pensate, riscontrate problemi di performance? Avete tecniche migliori per accedere in remoto ai vari servizi della intranet?

corso javascript