OpenVpn - Server

Da lumacawiki.

Installare OpenVpn

# apt-get install openssl
# apt-get install openvpn

 Se abbiamo bisogno del bridging:
# apt-get install bridge-utils 


Creare Certificati

# cp -R /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn
# cd /etc/openvpn/easy-rsa/
# nano vars
export KEY_COUNTRY="IT"
export KEY_PROVINCE="PI"
export KEY_CITY="Pisa"
export KEY_ORG="Organizzazione"
export KEY_EMAIL="email@email.it"
# source ./vars

cancelliamo vecchi certificati:

# ./clean-all

Creiamo il nuovo certificate authority (ca):

# ./build-ca

Generiamo certificato per il server:

# ./build-key-server <nome completo del server>

....e la ta.key

# openvpn --genkey --secret ta.key

Generiamo i parametri Diffie-Hellman per il server:

# ./build-dh

Generiamo il certificato per il client (ripetere per ogni client che dovrà collegarsi alla VPN):

# ./build-key <nome_client>

Per comodita' , creare cartella dove mettere i certificati/chiavi del server, per esempio /etc/openvpn/keys/LocalSrv e spostiamo i file generati nella directory creata:

#  cd /etc/openvpn/easy-rsa/keys
# cp ca.crt /etc/openvpn/keys/LocalSrv
# cp ca.key /etc/openvpn/keys/LocalSrv
# cp ta.key /etc/openvpn/keys/LocalSrv
# cp <server>.crt /etc/openvpn/keys/LocalSrv
# cp <server.key> /etc/openvpn/keys/LocalSrv
# cp dh1024.pem /etc/openvpn/keys/LocalSrv


Creiamo file di configurazione per il server:

#nano /etc/openvpn/openvpn.conf

e al suo interno mettiamo

port 61000
proto udp
dev tun
#Key and cert
ca keys/LocalSrv/ca.crt
cert keys/LocalSrv/server.crt
key keys/LocalSrv/server.key
dh keys/LocalSrv/dh2048.pem
#Se vogliamo che venga fatto il controllo delle revoche dei certificati
crl-verify keys/LocalSrv/crl.pem
#Qui diamo la direzione della chiave 
#mettendo ta.key 0 sul server, 
#implica che sul client dobbiamo mettere ta.key 1
tls-auth keys/LocalSrv/ta.key 0
ifconfig-pool-persist ipp.txt
# la prox riga dice che dentro la cartella StaticIp ci saranno 
# i files di testo (uno per client) con gli indirizzi da assegnare
# ed eventuali rotte. Serve per avere indirizzi univoci per i client
client-config-dir /etc/openvpn/StaticIP
# Ora specifico la sottorete da usare nella vpn
server 10.0.0.0 255.255.255.0
# mentre qui, metto a disposizione dei client la sottorete interna dove
# e' collegato il server vpn ed eventuali dns
push "route 192.168.0.0 255.255.255.0"
push "explicit-exit-notify 3"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
# la prox direttiva permette la comunicazione diretta tra i 
# vari client connessi. Bisogna pero' abilitare il port forwarding
client-to-client
#duplicate-cn
keepalive 10 120
comp-lzo adaptive
user nobody
group nogroup
persist-key
persist-tun
cipher AES-256-CBC
status openvpn-status.log
verb 3
#up "/etc/openvpn/script/vpnup_tun.sh eth0"
#down "/etc/openvpn/script/vpndown_tun.sh eth0"
script-security 3

Abilitare il port forwarding per far comunicare i clients:

echo 1 > /proc/sys/net/ipv4/ip_forward

Dare indirizzi specifici ai client

per dare ip statici ai clients, creare un file di testo per ogni client con il nome dato al momento della generazione del certificato e al suo interno specificare l'indirizzo ed eventuali altre rotte da passare ai client. Per esempio, Creare la cartella /etc/openvpn/StaticIP

# mkdir /etc/openvpn/StaticIP
# cd /etc/openvpn/StaticIP

ed al suo interno creare file di testo

# nano <nome_client>     <---- questo e' il nome della macchina nonche' della chiave generata

all'interno scrivere per esempio:

ifconfig-push 10.0.0.4 255.255.255.0
push "route 192.168.0.0 255.255.255.0"

In questo caso, al client verra' assegnato l'indirizzo 10.0.0.4 nella vpn e gli viene anche fornita la rotta per la sottorete 192.168.0.0.

A questo punto riavviare openvpn per abilitare le modifiche fatte.


Revoca dei certificati

Nel caso si debba revocare un certificato per negare l'accesso alla VPN e' necessario che il file di configurazione di openvpn contenga la direttiva

crl-verify crl.pem

A questo punto dobbiamo generare/aggiornare il file crl.pem che andra' poi copiato in un luogo accessibile ad openvpn corrispondente a quello specificato nel file di configurazione. Per far cio' dobbiamo posizionarci nella directory dove si creano i certificati (v. sopra) ed eseguire i comandi:

./vars
source ./vars
./revoke-full <nomecertclient>

fatto cio', nella directory keys/ troveremo il file crl.pem da dare in pasto ad openvpn. Se si copia al volo il file nella dir dove andra' a leggere openvpn, questo verrra' letto alla prossima connessione di un client (se era gia' presente la direttiva crl-verify nel file di configurazione) altrimenti andra' riavviato il servizio

NOTA

se vi trovate per esempio a casa, ed il vostro server e' sotto il vs router ADSL, dovrete inserire nel router la rotta per la sottorete della vpn (10.0.0.0) senno' non potrete comunicare (manca il ritorno)


File per il Firewall

Detto cio', va poi creato uno script che carichi le regole per iptables tipo: creiamo il file

#nano /root/00Firew-Rout-VPN.sh

e al suo interno mettiamo:

#!/bin/sh
PATH=/usr/sbin:/sbin:/bin:/usr/bin
#
# delete all existing rules.
#
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Always accept loopback traffic
iptables -A INPUT -i lo -j ACCEPT


# Allow established connections, and those not coming from the outside
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW ! -i tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow outgoing connections from the LAN side.
iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT

# Masquerade.
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

# Don't forward from the outside to the inside.
iptables -A FORWARD -i eth0 -o tun0 -j REJECT

# Enable routing.
echo 1 > /proc/sys/net/ipv4/ip_forward del tipo:

(ovviamente i nomi delle interfacce vanno aggiornati in base al proprio sistema)


Questo file va caricato quando viene caricata la configurazione di rete un buon posto dove richiamarlo e' negli script di inizializzazione della scheda:

Editare il file

#nano /etc/network/if-up.d/openvpn

ed inserire la chiamata allo script. Una volta finito avremo qlc del tipo:

#!/bin/sh

OPENVPN=/etc/init.d/openvpn

if [ ! -x $OPENVPN ]; then
  exit 0
fi

if [ -n "$IF_OPENVPN" ]; then
  for vpn in $IF_OPENVPN; do
    $OPENVPN start $vpn
  done
fi
/root/00Firew-Rout-VPN.sh