OpenVPN VPS Debian

Prérequis

Disposer d’un serveur Debian 8 64bits avec accès via SSH (avec ou sans clés)

Se connecter en ssh

ssh utilisateur@serveur.tld

Script

Toutes les opérations seront effectuées en root (su ou sudo -s)
Téléchargement du script :

wget --no-check-certificate https://raw.githubusercontent.com/Angristan/OpenVPN-install/master/openvpn-install.sh

Rendre le script exécutable :

chmod +x openvpn-install.sh

Exécution du script :

./openvpn-install.sh

Quelques détails du déroulement de la procédure

Welcome to the secure OpenVPN installer (github.com/Angristan/OpenVPN-install)

I need to ask you a few questions before starting the setup
You can leave the default options and just press enter if you are ok with them

I need to know the IPv4 address of the network interface you want OpenVPN listening to.
If you server is running behind a NAT, (e.g. LowEndSpirit, Scaleway) leave the IP adress as it is. (local/private IP)
Otherwise, it sould be your public IPv4 address.
IP address: 46.166.168.130

What port do you want for OpenVPN?
Port: 1194

What protocol do you want for OpenVPN?
Unless UDP is blocked, you should not use TCP (unnecessarily slower)
Protocol [UDP/TCP]: UDP

What DNS do you want to use with the VPN?
   1) Current system resolvers (/etc/resolv.conf)
   2) FDN (France)
   3) DNS.WATCH (Germany)
   4) OpenDNS (Anycast: worldwide)
   5) Google (Anycast: worldwide)
DNS [1-5]: 4
  
See https://github.com/Angristan/OpenVPN-install#encryption to learn more about 
the encryption in OpenVPN and the choices I made in this script.
Please note that all the choices proposed are secure (to a different degree)
and are still viable to date, unlike some default OpenVPN options

Choose which cipher you want to use for the data channel:
   1) AES-128-CBC (fastest and sufficiently secure for everyone, recommended)
   2) AES-192-CBC
   3) AES-256-CBC
Alternatives to AES, use them only if you know what you're doing.
They are relatively slower but as secure as AES.
   4) CAMELLIA-128-CBC
   5) CAMELLIA-192-CBC
   6) CAMELLIA-256-CBC
   7) SEED-CBC
Cipher [1-7]: 1

Choose what size of Diffie-Hellman key you want to use:
   1) 2048 bits (fastest)
   2) 3072 bits (recommended, best compromise)
   3) 4096 bits (most secure)
DH key size [1-3]: 3

Choose what size of RSA key you want to use:
   1) 2048 bits (fastest)
   2) 3072 bits (recommended, best compromise)
   3) 4096 bits (most secure)
DH key size [1-3]: 3

Finally, tell me a name for the client certificate and configuration
Please, use one word only, no special characters
Client name: clientlt

Okay, that was all I needed. We are ready to setup your OpenVPN server now
Press any key to continue...

La génération clé + Diffie-Hellman de 4096 bit est très très longue , de 15 à 45 minutes…

[...]  

Finished!

Your client config is available at ~/clientlt.ovpn
If you want to add more clients, you simply need to run this script another time!

Vérifier sur le serveur dans le fichier /etc/sysctl.conf que la ligne suivante est décommentée (le script openvpn-install-new le fait automatiquement pour ipv4):

net.ipv4.ip_forward=1

Configuration client : /root/clientlt.ovpn

La configuration /etc/openvpn/server.conf

port 1194
proto udp
dev tun
user nobody
group nogroup
persist-key
persist-tun
keepalive 10 120
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
push "redirect-gateway def1 bypass-dhcp" 
crl-verify crl.pem
ca ca.crt
cert server.crt
key server.key
tls-auth tls-auth.key 0
dh dh.pem
auth SHA384 
cipher AES-128-CBC
tls-server
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384
status openvpn.log
verb 3

Rotation des logs (logrotate)

Rotation des fichiers log openvpn

sudo nano /etc/logrotate.d/openvpn
/etc/openvpn/openvpn.log {
        rotate 6
        monthly
        compress
        missingok
}
  • surveille le fichier xxxx.log et génère une rotation une fois par mois - c’est l’ “intervalle de rotation”.
  • ‘rotate 6’ signifie qu’à chaque intervalle, on conserve 6 semaines de journalisation.
  • Les fichiers de logs peuvent sont compressés au format gzip en spécifiant ‘compress’
  • ‘missingok’ permet au processus de ne pas s’arrêter à chaque erreur et de poursuivre avec le fichier de log suivant.

Démarrer OpenVpn

systemctl start openvpn

Pare-feu (iptables)

Règles

Passage en mode sudo ou su

sudo -s

Création fichier des règles

nano /etc/iptables.up.rules

ATTENTION! adapter le port SSH (ici 47022) qui est par défaut 22 (pas de modification accès SSH)

*filter  
:INPUT DROP [0:0]  
:FORWARD ACCEPT [0:0]  
:OUTPUT ACCEPT [0:0]  
-A INPUT -i lo -j ACCEPT  
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  
-A INPUT -p tcp -m tcp --dport 47022 -j ACCEPT  
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT  
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT  
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT  
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT  
-A INPUT -p udp -m udp --dport 53 -j ACCEPT  
-A FORWARD -i tun0 -o venet0 -j ACCEPT  
COMMIT
*nat  
:PREROUTING ACCEPT [0:0]  
:POSTROUTING ACCEPT [0:0]  
:OUTPUT ACCEPT [0:0]  
-A POSTROUTING -s 10.8.0.0/24 -o venet0 -j MASQUERADE  
COMMIT

Lignes indispensables

-A INPUT -i lo -j ACCEPT ((Ce sont les communications IP entre processus locaux s'exécutant sur la machine et c'est critique)).  
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT ((ça permet le retour vers la machine des infos demandées auprès des sites web. En l'absence de cette règle, la navigation deviendrait difficile. C'est relativement important )).  
-A INPUT -p tcp -m tcp --dport 47022 -j ACCEPT # utilisation SSH sur un port différent (22 par défaut)

Les droits

chmod 600 /etc/iptables.up.rules

Appliquer les règles

iptables-restore < /etc/iptables.up.rules

Appliquer les règles au démarrage

Créer un bash

nano /etc/network/if-pre-up.d/iptables
#!/bin/sh  
   
# Load iptables rules before interfaces are brought online  
# This ensures that we are always protected by the firewall  
#  
# Note: if bad rules are inadvertently (or purposely) saved it could block  
# access to the server except via the serial tty interface.  
#  
   
RESTORE=/sbin/iptables-restore  
STAT=/usr/bin/stat  
IPSTATE=/etc/iptables.up.rules  
   
test -x $RESTORE || exit 0  
test -x $STAT || exit 0  
   
# Check permissions and ownership (rw------- for root)  
if test `$STAT --format="%a" $IPSTATE` -ne "600"; then  
  echo "Permissions for $IPSTATE must be 600 (rw-------)"  
  exit 0  
fi  
   
# Since only the owner can read/write to the file, we can trust that it is  
# secure. We need not worry about group permissions since they should be  
# zeroed per our previous check; but we must make sure root owns it.  
if test `$STAT --format="%u" $IPSTATE` -ne "0"; then  
  echo "The superuser must have ownership for $IPSTATE (uid 0)"  
  exit 0  
fi  
   
# Now we are ready to restore the tables  
$RESTORE < $IPSTATE  

Droits et exécutable

chmod +x /etc/network/if-pre-up.d/iptables
chown root:root /etc/network/if-pre-up.d/iptables

Redémarrer le serveur pour vérifier le chargement des règles

systemctl reboot

Vérifications après “reboot” serveur

Se connecter au serveur via ssh
Etat serveur openvpn

sudo systemctl status openvpn
● openvpn.service - OpenVPN service
   Loaded: loaded (/lib/systemd/system/openvpn.service; enabled)
   Active: active (exited) since Mon 2016-12-05 08:52:34 CET; 2min 37s ago
  Process: 308 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 308 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/openvpn.service

Dec 05 08:52:34 xinyiczen systemd[1]: Starting OpenVPN service...
Dec 05 08:52:34 xinyiczen systemd[1]: Started OpenVPN service.

Les règles du pare-feu (firewall)

sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:47022
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     udp  --  anywhere             anywhere             udp dpt:openvpn
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  10.8.0.0/24          anywhere            
SNAT       all  --  10.8.0.0/24          anywhere             to:46.166.168.130

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Déplacer le fichier ovpn sur le home utilisateur

sudo mv /root/clientlt.ovpn /home/$USER

Changement propriétaire

sudo chown $USER. /home/$USER/clientlt.ovpn

Client OpenVpn

Installation openvpn client

ArchLinux / Manajaro (openvpn et openresolv sont installés par défaut)

sudo pacman -S openvpn openresolv

Debian / Ubuntu

sudo apt-get- install openvpn resolvconf

Fedora

yum install openvpn resolvconf

Copier le contenu du fichier clientlt.ovpn du serveur VPN distant sur un poste local

Clients : Utiliser les serveurs DNS définit par le serveur

FACULTATIF et UNIQUEMENT sur DESKTOP (ordinateur de bureau,portable)

Par défaut le fichier généré par le serveur est fonctionnel , mais on va lui apporter quelques petites modifications pour forcer l’utilisation des serveurs DNS défini par le serveur OpenVPN

Vérifier la présence du bash /etc/openvpn/update-resolv-conf

si inexistant sur Archlinux/Manjaro

yaourt -S openvpn-update-resolv-conf

si inexistant sur Debian , créer le fichier update-resolv-conf :

sudo nano /etc/openvpn/update-resolv-conf
#!/bin/bash  
#  
# Parses DHCP options from openvpn to update resolv.conf  
# To use set as 'up' and 'down' script in your openvpn *.conf:  
# up /etc/openvpn/update-resolv-conf  
# down /etc/openvpn/update-resolv-conf  
#  
# Used snippets of resolvconf script by Thomas Hood <jdthood@yahoo.co.uk>  
# and Chris Hanson  
# Licensed under the GNU GPL.  See /usr/share/common-licenses/GPL.  
# 07/2013 colin@daedrum.net Fixed intet name  
# 05/2006 chlauber@bnc.ch  
#  
# Example envs set from openvpn:  
# foreign_option_1='dhcp-option DNS 193.43.27.132'  
# foreign_option_2='dhcp-option DNS 193.43.27.133'  
# foreign_option_3='dhcp-option DOMAIN be.bnc.ch'  
# foreign_option_4='dhcp-option DOMAIN-SEARCH bnc.local'  
  
## You might need to set the path manually here, i.e.  
RESOLVCONF=/usr/bin/resolvconf  
  
case $script_type in  
  
up)  
  for optionname in ${!foreign_option_*} ; do  
    option="${!optionname}"  
    echo $option  
    part1=$(echo "$option" | cut -d " " -f 1)  
    if [ "$part1" == "dhcp-option" ] ; then  
      part2=$(echo "$option" | cut -d " " -f 2)  
      part3=$(echo "$option" | cut -d " " -f 3)  
      if [ "$part2" == "DNS" ] ; then  
        IF_DNS_NAMESERVERS="$IF_DNS_NAMESERVERS $part3"  
      fi  
      if [[ "$part2" == "DOMAIN" || "$part2" == "DOMAIN-SEARCH" ]] ; then  
        IF_DNS_SEARCH="$IF_DNS_SEARCH $part3"  
      fi  
    fi  
  done  
  R=""  
  if [ "$IF_DNS_SEARCH" ]; then  
    R="search "  
    for DS in $IF_DNS_SEARCH ; do  
      R="${R} $DS"  
    done  
  R="${R}  
"  
  fi  
  
  for NS in $IF_DNS_NAMESERVERS ; do  
    R="${R}nameserver $NS  
"  
  done  
  #echo -n "$R" | $RESOLVCONF -p -a "${dev}"  
  echo -n "$R" | $RESOLVCONF -a "${dev}.inet"  
  ;;  
down)  
  $RESOLVCONF -d "${dev}.inet"  
  ;;  
esac  
  

Propriétaire et droits

sudo chown root.root /etc/openvpn/update-resolv-conf
sudo chmod +x /etc/openvpn/update-resolv-conf

Forcer l’utilisation des serveurs DNS ,modifier fichier ovpn

C’est grâce à update-resolv-conf , qu’il va être possible de forcer l’utilisation des serveurs DNS définit sur le serveur OpenVPN.

Modification du fichier de configuration client.ovpn

nano clientlt.ovpn

Ajouter ces lignes en fin de fichier :

dhcp-option DNS  
script-security 2  
up /etc/openvpn/update-resolv-conf  
down /etc/openvpn/update-resolv-conf  

Client VPN : Les différentes connexions possibles

1-Connexion manuelle client sur le serveur OpenVPN

lancer le service openvpn dans un terminal

sudo openvpn clientlt.ovpn

Initialization Sequence Completed indique que tout s’est bien déroulé

Wed Aug 31 17:20:17 2016 Unrecognized option or missing parameter(s) in clientlt.ovpn:12: block-outside-dns (2.3.12)
Wed Aug 31 17:20:17 2016 OpenVPN 2.3.12 x86_64-unknown-linux-gnu [SSL (OpenSSL)] [LZO] [EPOLL] [PKCS11] [MH] [IPv6] built on Aug 24 2016
Wed Aug 31 17:20:17 2016 library versions: OpenSSL 1.0.2h  3 May 2016, LZO 2.09
Wed Aug 31 17:20:17 2016 NOTE: the current --script-security setting may allow this configuration to call user-defined scripts
Wed Aug 31 17:20:17 2016 Control Channel Authentication: tls-auth using INLINE static key file
Wed Aug 31 17:20:17 2016 UDPv4 link local: [undef]
Wed Aug 31 17:20:17 2016 UDPv4 link remote: [AF_INET]46.166.168.130:1194
Wed Aug 31 17:20:17 2016 [server] Peer Connection Initiated with [AF_INET]46.166.168.130:1194
Wed Aug 31 17:20:20 2016 TUN/TAP device tun0 opened
Wed Aug 31 17:20:20 2016 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Wed Aug 31 17:20:20 2016 /usr/bin/ip link set dev tun0 up mtu 1500
Wed Aug 31 17:20:20 2016 /usr/bin/ip addr add dev tun0 10.8.0.2/24 broadcast 10.8.0.255
Wed Aug 31 17:20:20 2016 /etc/openvpn/update-resolv-conf tun0 1500 1601 10.8.0.2 255.255.255.0 init
which: no resolvconf in ((null))
dhcp-option DNS
dhcp-option DNS 89.111.13.60
dhcp-option DNS 193.183.98.154
Wed Aug 31 17:20:20 2016 Initialization Sequence Completed

2-Connexion via service systemd

Pour démarrer OpenVPN automatiquement au démarrage du système, que ce soit pour un client ou pour un serveur, activez (enable) openvpn@.service

Par exemple, si le fichier de configuration du client est /etc/openvpn/client.conf, le nom du service est openvpn@client.service , si le fichier de configuration du serveur est /etc/openvpn/server.conf, le nom du service est openvpn@server.service

Dans notre cas c’est /etc/openvpn/clientlt.conf qui contient un copier/coller du fichier clientlt.ovpn (le plus simple est de renommé le fichier .ovpn en .conf )

Renommer

sudo mv /etc/openvpn/clientlt.ovpn /etc/openvpn/vpnlt.conf

Ensuite , il faut lancer

sudo systemctl start openvpn@vpnlt.service

Vérifier la bonne exécution

● openvpn@vpnlt.service - OpenVPN connection to vpnlt  
   Loaded: loaded (/usr/lib/systemd/system/openvpn@.service; disabled; vendor preset: disabled)  
   Active: active (running) since lun. 2016-05-02 16:47:18 CEST; 9s ago  
  Process: 2625 ExecStart=/usr/bin/openvpn --cd /etc/openvpn --config /etc/openvpn/%i.conf --daemon openvpn@%i --write  
 Main PID: 2626 (openvpn)  
    Tasks: 1 (limit: 512)  
   CGroup: /system.slice/system-openvpn.slice/openvpn@vpnlt.service  
           └─2626 /usr/bin/openvpn --cd /etc/openvpn --config /etc/openvpn/vpnlt.conf --daemon openvpn@vpnlt --writepi  
  
mai 02 16:47:18 manjaro systemd[1]: Started OpenVPN connection to vpnlt.  
mai 02 16:47:18 manjaro openvpn@vpnlt[2626]: UDPv4 link local: [undef]  
mai 02 16:47:18 manjaro openvpn@vpnlt[2626]: UDPv4 link remote: [AF_INET]185.86.149.85:1194  
mai 02 16:47:19 manjaro openvpn@vpnlt[2626]: [server] Peer Connection Initiated with [AF_INET]185.86.149.85:1194  
mai 02 16:47:22 manjaro openvpn@vpnlt[2626]: TUN/TAP device tun0 opened  
mai 02 16:47:22 manjaro openvpn@vpnlt[2626]: do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0  
mai 02 16:47:22 manjaro openvpn@vpnlt[2626]: /usr/bin/ip link set dev tun0 up mtu 1500  
mai 02 16:47:22 manjaro openvpn@vpnlt[2626]: /usr/bin/ip addr add dev tun0 10.8.0.2/24 broadcast 10.8.0.255  
mai 02 16:47:22 manjaro openvpn@vpnlt[2626]: /etc/openvpn/update-resolv-conf tun0 1500 1542 10.8.0.2 255.255.255.0 ini  
mai 02 16:47:22 manjaro openvpn@vpnlt[2626]: Initialization Sequence Completed  

Si on l’on veut un lancement openvpn au démarrage du client (NON UTILISE dans notre cas de figure)

sudo systemctl enable openvpn@vpnlt.service

3-Connexion via NetworkManager et systemd

On peut utiliser NetworkManager pour se connecter au serveur en exécutant un script suivant la connexion utilisée
On va créer une connexion supplémentaire en clic droit sur l’applet NetworkManager puis “Modification des connexions” et “ajouter”
Elle est identique à celle existante au nom prés , on va l’appeler “vps-vpn-lt”

Il faut créer un script avec un numéro d’ordre dans le dossier /etc/NetworkManager/dispatcher.d/ ,le 10 existe alors 20

sudo nano /etc/NetworkManager/dispatcher.d/20-openvpn
#!/bin/bash  
  
case "$2" in  
  up)  
    if [ "$CONNECTION_ID" == "vps-vpn-lt" ]; then  
      systemctl start openvpn@vpnlt.service  
    fi  
  ;;  
  down)  
    systemctl stop openvpn@vpnlt.service  
  ;;  
esac  

Exécutable

sudo chmod +x /etc/NetworkManager/dispatcher.d/20-openvpn

Le script 20-openvpn sera exécuté à chaque connexion via NetworkManager et openvpn sera lancé avec la connexion ‘‘“vps-vpn-lt”’’ et stoppé pour les autres

Afin que les scripts s’exécutent, il est nécessaire de vérifier si le dispatcher est actif

sudo systemctl status NetworkManager-dispatcher
● NetworkManager-dispatcher.service - Network Manager Script Dispatcher Service  
   Loaded: loaded (/usr/lib/systemd/system/NetworkManager-dispatcher.service; enabled; vendor preset: disabled)  

Sinon l’activer :

sudo systemctl enable NetworkManager-dispatcher

Statut connexion

Sur une autre fenêtre terminal

adresse IP de l’interface tun0 :

ip a | grep tun0
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 100  
    inet 10.8.0.2/24 brd 10.8.0.255 scope global tun0  

le serveur DNS utlisé :

drill +short cinay.pw
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 25411  
;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2   
;; QUESTION SECTION:  
;; cinay.pw.	IN	A  
  
;; ANSWER SECTION:  
cinay.pw.	3296	IN	A	198.50.145.246  
  
;; AUTHORITY SECTION:  
cinay.pw.	3296	IN	NS	ns200.anycast.me.  
cinay.pw.	3296	IN	NS	dns200.anycast.me.  
  
;; ADDITIONAL SECTION:  
ns200.anycast.me.	39595	IN	A	46.105.207.200  
dns200.anycast.me.	39595	IN	A	46.105.206.200  
  
;; Query time: 121 msec  
;; SERVER: 80.67.169.12  
;; WHEN: Tue Mar 15 11:15:53 2016  
;; MSG SIZE  rcvd: 125  

Le serveur DNS utilisé est bien 80.67.169.12

4-Client Vpn avec NetworkManager

Avec la dernière version NetworkManager , on peut importer directement la configuration au format .ovpn

  • Clic-droit sur l’icône NetworkManager dans la barre des tâches ‘’–> Modification des connexions’’
  • Cliquer sur ‘‘Ajouter’’ , Sélectionner ‘‘Importer une configuration VPN enregistrée…’’ dans la liste déroulante
  • Cliquer sur ‘‘Créer…’’ , rechercher et sélectionner le fichier .ovpn à importer
  • Modifier le nom de la connexion et cliquer sur ‘‘Enregistrer’’

Client android OpenVpn