Afficher/cacher Sommaire
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@
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
- Logiciel android OpenVPN Connect , télécharger le profile clientlt.ovpn
- Paramètage
- VPN Protocol : ‘‘UDP’’
- Force AES-CBC doit être
__NON COCHE__