Poiché l'installazione di VPN assomiglia molto a una transazione client-server, mi servirò di questa terminologia per dare un nome al computer alla fine di ogni passaggio:
È un computer che aspetta passivamente l'arrivo di richieste di connessione VPN. Fuunziona completamente incustodito.
È un computer che inizializza le richieste di connessione, chiedendo al Server di creare una VPN.
Nel kernel deve essere presente, compilato, il supporto a TCP/IP e PPP. Quasi tutti le distribuzioni includono direttamente il supporto a PPP. Se la vostra non lo include, o se state usando un kernel particlare, includerò ulteriori dettagli a riguardo,in la Sezione 3.4.
Bisogna installare il demone pppd. Questo probabilmente è incluso nella vostra distribuzione. Io sto usando ppp-2.3.11. Le versioni successive dovrebbero funzionare bene, come anche le versioni precedenti, finché supportano le opzioni "pty". Non è necessario installare chat o alcun altro strumento destinato a funzionare insieme a PPP: è sufficiente avere pppd.
La macchina client deve avere installato il client ssh. Esistono svariate versioni di ssh in circolazione, ma dovrebbero funzionare tutte quante. Per la redazione di questo HOWTO è stato utilizzato OpenSSH per OpenBSD, versione 2.2.0p1.
La macchina server deve disporre del demone sshd per fare fronte alle richieste del client. OpenSSH comprende un demone ssh molto buono.
Per ultima cosa potrebbe essere richiesto di installare sudo sul server. È possibile trovare ulteriori informazioni riguardo a sudo in Linux Administrator's Security Guide, nella sezione Tool Amministrativi e in Linux Security HOWTO,nella sezione Root Security. Inoltre potrebbe essere di aiuto leggere sudo's home page.
Per impostare un collegamento PPP-SSH occorre specificare i seguenti parametri:
Qual'è lo hostname o l'indirizzo IP del server VPN?
Sul vostro server, con quale nome utente il software per la VPN funzionerà? Questo HOWTO comprende istruzioni riguardanti la creazione di un utente di nome "vpn" specificamente per questo scopo. Il software non deve essere eseguito da root! Per esigenze di sicurezza e di registrazione degli accessi, si dovrebbe usare un account riservato.
La VPN PPP-SSH necessita di interfacce di rete dedicate sia sul client che sul server. L'interfaccia sarà pppN, dove N è il numero della prima interfaccia ppp inutilizzata (per esempio sarà ppp1 se si sta già utilizzando ppp0 per una chiamata con il modem).
Sarà necessario specificare l'indirizzo IP per l'interfaccia sul server. Questo indirizzo sarà visibile solo da client e server (e dalle macchine sulle subnet a cui il client o il server potrebbero inoltrare i pacchetti de-mascherati).
Se non è noto l'indirizzo IP da specificare, si legga il capitolo 2.2 in Linux Network Administrators Guide e si guardi in particolare alla tabella 2-1. Per esempio, 192.168.0.1 è una buona scelta.
È necessario impostare l'indirizzo IP dell'interfaccia sul client. Deve ovviamente apartenere alla stessa rete dell'indirizzo del server. Non deve essere in conflitto con altre reti dal lato del client e non può essere lo stesso indirizzo IP dell'interfaccia di rete del server. Se è stato scelto 192.168.0.1 per la precedente risposta, probabilmente qui si dovrebbe usare 192.168.0.2.
La mia configurazione è:
SERVER_HOSTNAME = eldivino.domain.com SERVER_USERNAME = vpn SERVER_IFIPADDR = 192.168.3.1 CLIENT_IFIPADDR = 192.168.3.2 |
Il codice per PPP può essere compilato nel kernel stesso o può essere presente in moduli caricabili nel kernel. Se è stato compilato nel kernel, si può saltare al passo successivo: non occorre altro. Invece, se si sta caricando PPP sotto forma di moduli, bisogna assicurarsi che vengano caricati in modo appropriato.
Si può controllare se ppp è incluso nella lista di tutti i moduli correntemente caricati eseguendo lsmod. Si ricordi di controllare che il modulo PPP sia caricato sia sul client che sul server.
server$ /sbin/lsmod Module Size Used by ppp 20780 0 (unused) slhc 4376 0 [ppp] 3c59x 21636 1 client$ lsmod Module Size Used by ppp_deflate 40308 0 (autoclean) bsd_comp 4076 0 (autoclean) ppp 20844 2 [ppp_deflate bsd_comp] slhc 4376 1 [ppp] |
Se si è sicuri di avere compilato ppp come modulo, ma non è caricato nel kernel, si provi a caricarlo con modprobe.
# modprobe ppp |
Se modprobe non ritorna alcun errore, si controlli di nuovo lsmod: a questo punto ppp dovrebbe essere presente nella lista. Se è così, significa che il modulo ppp non viene caricato al momento dell'avvio. Ciò non costituisce un problema se si ha intenzione di eseguire il demone per il kernel, poiché i moduli PPP verranno caricati su richiesta. Se non si intende fare così, si renderà necessario caricare i moduli al momento dell'avvio inserendo una riga contenente la sola parola "ppp" nel file /etc/modules.
Si veda Linux Kernel HOWTO per maggiori informazioni al riguardo.
Il traffico di rete tra le due macchine (risultante dal tunnel, naturalmente) sarà basato sul solo protocollo SSH.
SSH impiega solo flussi TCP, nessun pacchetto UDP o ICMP. Il server ssh (sshd) normalmente è in ascolto sulla porta 22. Il client (dato che useremo il flag -P) utilizzerà solo le porte non privilegiate dalla 1024 alla 65535. Questa descrizione dovrebbe fornire informazioni sufficienti per potere impostare un firewall.
Per esempio, ecco i comandi per ipchains necessari a permettere le connessioni ssh verso il server. Consentiremo di passare alle connessioni dirette alla porta 22 sulla macchina locale e provenienti da qualsiasi porta sulla macchina remota. SI sostituisca eth0 con l'interfaccia di rete su cui viaggerà il traffico ssh e $IPADDR con l'indirizzo IP di quella interfaccia.
ipchains -A input -i eth0 -p tcp -d $IPADDR 22 -j ACCEPT ipchains -A output -i eth0 -p tcp ! -y -s $IPADDR 22 -j ACCEPT |
I comandi seguenti sono necessari per impostare il firewall sulla macchina client. Non sono permesse le connessioni ssh in ingresso, mentre viene consentito al protocollo di passare tra la porta 22 della macchina remota e le porte non privilegiate su questa macchina. Ancora una volta, si sostituisca a eth0 l'interfaccia che trasporterà il traffico ssh, e a $IPADDR l'indirizzo IP di tale interfaccia.
ipchains -A input -i eth0 -p tcp ! -y --source-port 22 -d $IPADDR 1024:65535 -j ACCEPT ipchains -A output -i eth0 -p tcp -s $IPADDR 1024:65535 --destination-port 22 -j ACCEPT |