Creare un Server VPN L2TP/IPSec su Debian

Tunnel in Codice Binario

Oggi vedremo come creare un server VPN L2TP/IPSec su Debian e Navigare al sicuro!!

Quante volte ci siamo connessi a WiFi disponibili liberamente e ci siamo chiesti “ma sono veramente al sicuro?”, quindi perché non Creare un Server VPN L2TP/IPSec su Debian e toglierci questo problema?

Ovunque troviamo sevizi sia gratuiti che a pagamento per navigare “tranquilli”; io sinceramente continuo a pensare che tali strumenti, da qualche parte dovranno guadagnare, quindi nelle peggiori delle ipotesi, venderanno dati anonimi (ovviamente non sensibili) sulle navigazioni degli utenti.

Ma non è questa la sola situazione per il quale si necessita di una rete VPN, ad esempio possiamo volere una connessione sicura verso il nostro server remoto o ancor meglio limitare l’accesso solo ad essa e non a chiunque.

Quindi perché non instaurare una connessione sicura diretta (“tunnel”) verso la nostra macchina e connettersi al mondo da li?

Ecco di seguito un’immagine di come funziona il Tunnel VPN e subito dopo la spiegazione pratica
Diagramma VPNIl Tipo di VPN che andremo a configurare si basta su L2TP (Layer 2 Tunneling Protocol), di base questo pacchetto non provvede a criptare i dati, quindi andremo a colmare questa mancanza con IPSec.

I pacchetti che andremo ad utilizzare saranno

  • xl2tpd: il servizio che si occuperà della VPN (L2TP)
  • racoon: servizio di scambio chiavi IPSec
  • iptables: per manipolare le regole firewall

Quindi se già non li abbiamo installati provvediamo dando il comando

sudo apt-get install racoon xl2tpd iptables

Racoon

Configuriamo ora racoon per lavorare in modalità PSK (Pre-Shared Key), dunque andiamo a modificare il file /etc/racoon/psk.txt e aggiungiamo una chiave segreta da condividere con tutti i dispositivi che dovranno connettersi, preceduta da un asterisco che sta a specificare che questa chiave è accettabile con tutti gli indirizzi IP.

Attenzione! Questa non è la password dei singoli dispositivi, vedremo come configurarla successivamente.

* ChiaveSegretaCondivisa

Aggiungiamo ora a /etc/racoon/racoon.conf

remote anonymous {
        exchange_mode main;

        generate_policy on;
        nat_traversal on;

        dpd_delay 20;

        proposal {
                encryption_algorithm aes;
                hash_algorithm md5;
                authentication_method pre_shared_key;
                dh_group modp1024;
        }
}

sainfo anonymous {
        encryption_algorithm aes, 3des;
        authentication_algorithm hmac_sha1, hmac_md5;
        compression_algorithm deflate;
}

Il termine “anonymous” indica che non si conoscono gli indirizzi IP dei vari dispositivi che si connetteranno es.: Un telefono che si connette dalla rete dati.

xl2tpd

Terminata la configurazione di racoon, passiamo a xl2tpd, apriamo quindi /etc/xl2tpd/xl2tpd.conf:

[global]
access control = no

Nella sezione “global” disabilitiamo il controllo degli accessi, essendo che come detto prima, non conosciamo gli IP dei client. Successivamente, definiamo la configurazione del server L2TP oppure chiamato “LNS”.

[lns default]
ip range = 192.168.2.1-192.168.2.99
local ip = 192.168.2.100
require authentication = yes
require chap = yes
refuse pap = yes
length bit = yes
name = l2tpd
pppoptfile = /etc/ppp/xl2tpd-options

Come ben si può intender la prima direttiva “ip range” imposta il range di indirizzi disponibili per i nostri client.
La seconda “local ip” definisce l’IP locale del Server VPN L2TP/IPSec su Debian, quindi non l’indirizzo pubblico.
L’autenticazione è abilitata ma per il momento è impostata solo CHAP.

PPPD

PPPD è il software che si occupa di mantenere il tunnel “point-to-point” connesso tra il client ed il server.
Come abbiamo specificato prima nel file di configurazione, apriamo e modifichiamo /etc/ppp/xl2tpd-options:

auth
nodefaultroute
lock
proxyarp
require-chap
ms-dns 8.8.8.8
ms-dns 8.8.4.4

In questo esempio abbiamo abilitato l’autenticazione CHAP, e configurato per la navigazione attraverso VPN, i Server DNS di Google (potrete scegliere i Server DNS che volete).

Possiamo finalmente configurare le credenziali per i singoli client, per far ciò, apriamo il file /etc/ppp/chap-secrets e inseriamo l’esempio che segue:

NomeUtente      l2tpd   password123        *
  • “NomeUtente” = Come specifica, è il nome del client da inserire durante l’autenticazione;
  • “l2tpd” = è il nome del server che avete impostato precedentemente in /etc/xl2tpd/xl2tpd.conf;
  • “password123” = è la password è deve essere inserita come testo semplice;
  • “*” = indica l’indirizzo IP del client, quando è impostato l’asterisco, viene attribuito automaticamente, altrimenti se volete potrete attribuirne uno statico di quelli del range impostato precedentemente.

Impostazione del Firewall

Il forwarding attraverso le interfacce del sistema deve essere abilitato per consentire al tunnel VPN di comunicare con gli altri dispositivi di rete, modifichiamo quindi /etc/sysctl.conf e togliamo il # dalla riga con questa impostazione:

net.ipv4.ip_forward=1

Ora tutti i pacchetti che giungono dalla VPN, avranno l’indirizzo privato, che ovviamente non vi consentirà di navigare sulla rete essendo “sconosciuti”.
Dobbiamo quindi dire ad iptables di riscrivere gli indirizzi che entrano ed escono dalla nostra interfaccia, in questo caso “eth0”.
Inseriamo e modificate secondo le vostre necessità la regola:

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.2.0/24 -j MASQUERADE

Assicuriamoci ora che le connessioni già stabilite o “conseguenti” siano accettate (molto probabilmente avrete già questa regola attiva se avete configurato il vostro firewall):

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Abilitiamo ora il traffico IKE, NAT-T ed IPSec/esp:

iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT

Infine, l’ultima regola che andremo ad inserire accetterà solo i pacchetti IPSec SA, quindi solo dopo che racoon ha instaurato una connessione point-to-point:

iptables -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT

Quest’ultimo passo che andrò ad illustrarvi è facoltativo se non si è dietro NAT, ma io consiglio di farlo ugualmente.
Può capitare che quando il client è dietro una NAT, racoon generi delle politiche IPSec errate, quindi con questa configurazione andremo a forzare il “criptaggio” di tutte le comunicazioni L2TP.

Creiamo un nuovo file /etc/ipsec-tools.d/l2tp.conf ed inseriamo al suo interno:

spdadd 100.200.300.1[l2tp] 0.0.0.0/0 udp -P out ipsec
        esp/transport//require;
spdadd 0.0.0.0/0 100.200.300.1[l2tp] udp -P in ipsec
        esp/transport//require;

Modificate l’indirizzo “100.200.300.1” con l’indirizzo pubblico del server!!

Riavviate e configurate i vostri client, nel mio caso un telefono Android (vedremo in un altro articolo come configurarli) e finalmente avrete il vostro Server VPN L2TP/IPSec su Debian!!

Per qualunque chiarimento, commentate pure di seguito tanto è gratis e privo di registrazione!!!

Sciauusss 😎

11 Commenti

  1. Ciao Angelo, la procedura vale anche per ubuntu?
    Perchè l’ho seguita passo per passo, tutto è andato a buon fine, ma la vpn non funzica!
    vorrei capire cosa sbaglio, o se c’è un comando che permetta div edere che non ci siano errori

    • Ciao Chand! Ti faccio tre domande a bruciapelo:

      – Con che client o sistema operativo stai provando a connetterti?
      – Il server è “domestico” o ospitato altrove?
      – Hai aperto le porte?

      P.S. Non ci sono problemi con Ubuntu, essendo una distribuzione derivata da Debian 😃

      Sarò felice d’aiutarti!!
      Sciauusss!! 😉

      • Ciao Angelo! Grazie per la risposta 🙂
        Di seguito rispondo alle tue domande:
        – sto provando da mac con OSX Mojave
        – il server è domestico, ma posso accederci anche dall’esterno con ip pubblico o no-ip.
        – ovviamente ho già nattato le porte 1701, 500 e 4500 udp
        Quando provo a connettermi mi dice che il server L2TP-VPN non ha risposto

        • Ciao chand, Figurati, come detto son qui per aiutarvi 😉

          Ti propongo due soluzioni, la prima è di provare a connetterti alla VPN da un dispositivo Android o da client linux (anche quello del tuo ubuntu va’ benissimo), dato che so per certo della sua funzionalità; ti dico questo per isolare il problema al client se fosse il caso.

          La seconda è di provare a sostituire le “proposal” del “remote anonymous” con
          encryption_algorithm 3des;
          hash_algorithm sha1;

          Mi è successo lo stesso con il client nativo di Windows e ho risolto così; infatti stavo appunto scrivendo un articolo di rettifica 😀

          Attendo tuoi aggiornamenti, Sciauusss!! 😎

          • ho fatto entrambe le prove, ma niente da fare 🙁
            A questo punto mi viene qualche dubbio:
            – su /etc/racoon/psk.txt lascio anche le altre cose che mi trovo, o è meglio che svuoto tutto e lascio solo la chiave condivisa?
            – sul conf di xl2tpd /etc/xl2tpd/xl2tpd.conf, prima di “global” e “access control” devo lasciare il “;”?
            – se provo a dare il comando “systemctl status xl2tpd.service”, mi risulta questo:
            [code]systemctl status xl2tpd.service
            ● xl2tpd.service – LSB: layer 2 tunelling protocol daemon
            Loaded: loaded (/etc/init.d/xl2tpd; bad; vendor preset: enabled)
            Active: failed (Result: exit-code) since sab 2019-02-09 21:12:57 CET; 33s ago
            Docs: man:systemd-sysv-generator(8)
            Process: 20645 ExecStart=/etc/init.d/xl2tpd start (code=exited, status=1/FAILU

            feb 09 21:12:57 mioserver systemd[1]: Starting LSB: layer 2 tunelling protocol
            feb 09 21:12:57 mioserver xl2tpd[20645]: Starting xl2tpd:
            feb 09 21:12:57 mioserver systemd[1]: xl2tpd.service: Control process exited,
            feb 09 21:12:57 mioserver systemd[1]: Failed to start LSB: layer 2 tunelling p
            feb 09 21:12:57 mioserver systemd[1]: xl2tpd.service: Unit entered failed stat
            feb 09 21:12:57 mioserver systemd[1]: xl2tpd.service: Failed with result ‘exit[/code]
            può servire a capire il problema?

            • Scusa l’attesa, ho avviato una nuova istanza per controllare il problema, ed effettivamente hanno aggiornato alcuni pacchetti e bisogna fare qualche modifica, mi faresti solo una cortesia, per verificare che siamo allo stesso punto?

              mi daresti un log della connessione con un tail -f /var/log/syslog

              Comunque ci sono vicino 😎

              • eccolo:
                Mar 5 16:43:26 mioserver systemd[1]: Created slice User Slice of root.
                Mar 5 16:43:26 mioserver systemd[1]: Starting User Manager for UID 0…
                Mar 5 16:43:26 mioserver systemd[1]: Started Session 10853 of user root.
                Mar 5 16:43:27 mioserver systemd[27433]: Reached target Paths.
                Mar 5 16:43:27 mioserver systemd[27433]: Reached target Timers.
                Mar 5 16:43:27 mioserver systemd[27433]: Reached target Sockets.
                Mar 5 16:43:27 mioserver systemd[27433]: Reached target Basic System.
                Mar 5 16:43:27 mioserver systemd[27433]: Reached target Default.
                Mar 5 16:43:27 mioserver systemd[27433]: Startup finished in 181ms.
                Mar 5 16:43:27 mioserver systemd[1]: Started User Manager for UID 0.

              • e aggiungo:
                Mar 5 16:45:02 mioserver CRON[28039]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 16:45:02 mioserver CRON[28045]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
                Mar 5 16:48:01 mioserver CRON[28721]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 16:51:01 mioserver CRON[29439]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 16:54:01 mioserver CRON[30096]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 16:55:01 mioserver CRON[30347]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
                Mar 5 16:57:01 mioserver CRON[30778]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:00:01 mioserver CRON[31448]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:03:01 mioserver CRON[32097]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:05:01 mioserver CRON[497]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
                Mar 5 17:06:01 mioserver CRON[782]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:09:01 mioserver CRON[1418]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:09:01 mioserver CRON[1422]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && if [ ! -d /run/systemd/system ]; then /usr/lib/php/sessionclean; fi)
                Mar 5 17:09:01 mioserver systemd[1]: Starting Clean php session files…
                Mar 5 17:09:01 mioserver systemd[1]: Started Clean php session files.
                Mar 5 17:12:01 mioserver CRON[2340]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:15:01 mioserver CRON[3017]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:15:01 mioserver CRON[3041]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
                Mar 5 17:17:01 mioserver CRON[3509]: (root) CMD ( cd / && run-parts –report /etc/cron.hourly)
                Mar 5 17:18:01 mioserver CRON[3722]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:21:01 mioserver CRON[4394]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:24:01 mioserver CRON[5040]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:25:01 mioserver CRON[5260]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
                Mar 5 17:27:01 mioserver CRON[5719]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:30:01 mioserver CRON[6364]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:33:01 mioserver CRON[7046]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:35:01 mioserver CRON[7489]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
                Mar 5 17:36:01 mioserver CRON[7723]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:39:00 mioserver systemd[1]: Starting Clean php session files…
                Mar 5 17:39:00 mioserver systemd[1]: Started Clean php session files.
                Mar 5 17:39:01 mioserver CRON[8457]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:39:01 mioserver CRON[8458]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && if [ ! -d /run/systemd/system ]; then /usr/lib/php/sessionclean; fi)
                Mar 5 17:42:01 mioserver CRON[9163]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:45:01 mioserver CRON[9851]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:45:01 mioserver CRON[9850]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
                Mar 5 17:48:01 mioserver CRON[10578]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:51:01 mioserver CRON[11246]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:54:01 mioserver CRON[11961]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 17:55:01 mioserver CRON[12207]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
                Mar 5 17:57:01 mioserver CRON[12675]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 18:00:01 mioserver CRON[13359]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 18:03:01 mioserver CRON[14072]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 18:05:01 mioserver CRON[14539]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
                Mar 5 18:06:01 mioserver CRON[14765]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 18:09:01 mioserver systemd[1]: Starting Clean php session files…
                Mar 5 18:09:01 mioserver CRON[15534]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && if [ ! -d /run/systemd/system ]; then /usr/lib/php/sessionclean; fi)
                Mar 5 18:09:01 mioserver CRON[15535]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 18:09:01 mioserver systemd[1]: Started Clean php session files.
                Mar 5 18:12:01 mioserver CRON[16247]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 18:15:01 mioserver CRON[16937]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 18:15:01 mioserver CRON[16938]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
                Mar 5 18:17:01 mioserver CRON[17424]: (root) CMD ( cd / && run-parts –report /etc/cron.hourly)
                Mar 5 18:18:01 mioserver CRON[17653]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 18:21:01 mioserver CRON[18339]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 18:24:01 mioserver CRON[19048]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 18:25:01 mioserver CRON[19296]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
                Mar 5 18:27:01 mioserver CRON[19774]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 18:30:01 mioserver CRON[20450]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 18:33:01 mioserver CRON[21164]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 18:35:01 mioserver CRON[21622]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
                Mar 5 18:36:01 mioserver CRON[21848]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 18:39:00 mioserver systemd[1]: Starting Clean php session files…
                Mar 5 18:39:01 mioserver systemd[1]: Started Clean php session files.
                Mar 5 18:39:01 mioserver CRON[22614]: (root) CMD (/etc/cron.hourly/gcc.sh)
                Mar 5 18:39:01 mioserver CRON[22615]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && if [ ! -d /run/systemd/system ]; then /usr/lib/php/sessionclean; fi)

                p.s. i cron credo siano legati ad un bot che ho configurato sul mio server

  2. Devo configurare una vpn cisco ipsec su mac high sierra: ho provato con preferenze di sistema ma non mi permette di configurare la porta e quella del server con cui devo comunicare non è standard. Hai qualche suggerimento?

LASCIA UN COMMENTO

Please enter your comment!
Please enter your name here