Tuto Client OpenVPN
TODO,
- kill switch
Configuration de base
Page dédiée
Voir la page Ajouter un compte VPN.
# Configuration OpenVPN Lorraine Data Network (LDN) # Contact <contact@ldn-fai.net> # Aide <benevoles@listes.ldn-fai.net> # Documentation https://wiki.ldn-fai.net/wiki/Tuto_Client_OpenVPN # À changer: remote vpn.example.com # Choisir entre: udp6 / udp / tcp6-client / tcp-client proto udp port 1194 nobind # Seulement pour UDP: explicit-exit-notify # Certificats tls-client remote-cert-tls server ca /etc/openvpn/keys/ca_server.crt cert /etc/openvpn/keys/cmichu.crt key /etc/openvpn/keys/cmichu.key # IPv4 configuration dev tun tun-ipv6 redirect-gateway def1 bypass-dhcp route-ipv6 2000::/3 # Autres pull keepalive 10 30 comp-lzo adaptive verb 3 mute 5 # status /var/log/openvpn-client.status log-append /var/log/openvpn-client.log
Limitations et problèmes
Choses non gérées dans cette configuration (et à améliorer):'
- IPv6 natif (il est préférable de couper l'IPv6 natif);
- gestion du DNS (à faire !);
- bypass-dns et bypass-dhcp ne marchent que sous Windows :/, il faut le faire à la main.
Problèmes :
- ne marche pas avec IPv6 pour le transport parce qu'il n'ajoute pas la route spécifique IPv6 de access pour ne pas se couper l'herbe sous le pied (alors qu'il le fait en IPv4).
Meilleure configuration sous Linux
Décommenter dans la configuration :
script-security 2 route-up client-handler down client-handler
Placer "client-handler" dans le même répertoire que le fichier de configuration OpenVPN. Ce script configure l'utilisation des serveurs de noms du VPN:
#!/bin/sh # env > env-$script_type.txt # This interface has precedence over most interaces # in openresolv/resolvconf: rdev=lo # ##### Routing keep_routes() { local ip for ip in "$@"; do ip route add $(ip route get "$ip" | head -n1) done } drop_routes() { local ip for ip in "$@"; do ip route del $(ip route get "$ip" | head -n1) done } # ##### DHCP # Write foreign options to stdout: foreign_options() { local i while true; do local varname=foreign_option_$i local value="$(eval echo \$$varname)" if [ -z "$value" ]; then return fi i=$((i+1)) done } # Get resolvconf configuration: create_resolvconf() { foreign_options | grep "^dhcp-option DNS " | sed "s/^dhcp-option DNS /nameserver /" } # ##### Eventss route_up() { # Append nameservers to resolvconf (it would be better to override them): create_resolvconf | resolvconf -a $rdev # keep_routes $trusted_ip6 } down() { resolvconf -d $rdev # drop_routes $trusted_ip6 } # TODO, support for http-proxy case "$script_type" in route-up) route_up "$@" ;; down) route_pre_down "$@" ;; esac
Il existe un script "standardisé" (distribué dans Debian) pour la gestion des options DHCP (/etc/openvpn/update-resolve-conf) qui peut être utilisé à la place de ce script.
Ces deux scripts ajoutent les serveurs de nom plutôt de les remplacer. On peut remplacer la configuration avec openresolv en passant le paramètre -x (resvolconf -a $rdev -x).
Attention | |
---|---|
Ce script (ainsi que celui distribué dans debian) nécessite le paquet resolvconf (et openvpn ne sortira pas d'erreur si celui-ci manque). |
Accéder au VPN dans un réseau très filtré
À essayer dans l'ordre :
- rester en UDP mais essayer un autre port (notre service VPN est accessible sur la plupart des ports UDP et TCP en IPv4) ;
- essayer de passer en TCP sur un des ports 80, 443, 8080, etc. ;
- essayer de passer en TCP via un proxy HTTP.
Utilisation d'un autre port
Pour changer le port utiliser,
proto udp port 123
Notre service écoute sur la majorité des ports que ce soit en TCP ou en UDP grace à la magie d'un PAT.
Cette fonctionnalité n'étant disponible qu'en IPv4 dans le noyau Linux, assurez vous de passer par IPv4: "udp6" et "tcp6-client" peuvent passer par IPv6.
Passer en TCP
Si ça ne fonctionne pas, vous pouvez passer en TCP (qui est cependant moins adapté qu'UDP pour un VPN) :
proto tcp-client port 1194
Si le port est filtré, vous pouvez utiliser un autre port. En particulier les port 80 et 443 sont rarement filtrés :
proto tcp-client port 443
Utilisation d'un proxy HTTP
Dans un réseau extrèmement filté mais avec un proxy HTTP, il est possible d'utiliser ce dernier :
http-proxy 1.2.3.4 80
Utiliser le VPN en TCP probablement sur un des ports 80, 443, 8080. Les autres seront probablement bloqués au niveau du proxy.
Dépannage
Script de dépannage
Quelques commandes qui peuvent nous aider à comprendre quel est le soucis (on suppose que l'on est sous Linux, il faut le lancer en tant que root):
#!/bin/sh go() { echo "\$ $@" "$@" echo echo echo } go cat /etc/resolv.conf go ip address go ip -4 route go ip -6 route go ip route get 80.67.188.163 go ip route get 2001:913::3 check() { for a in "$@"; do go dig + short "$a" go ping -c1 -n "$a" go ping6 -c1 -n "$a" go traceroute -n "$a" -w 1 go traceroute6 -n "$a" -w 1 done } check www.ldn-fai.net vpn.ldn-fai.net www.fdn.fr go openvpn --version if which systemctl > /dev/null ; then go systemctl list-units | grep vpn fi if which journalctl > /dev/null ; then go journalctl --since today | grep vpn fi
Vérifier le routage
Vérifier le DNS
Notes
« ifconfig-ipv6 » autorise uniquement des subnet /64 ou plus petit, pas plus grand : « Options error: ifconfig-ipv6: /netbits must be between 64 and 124, not '/56' ». Pénalisant dans le cas où l'on cherche à ne pas utiliser de subnet d'interco mais uniquement le préfixe délégué à l'utilisateur et que ce dernier est plus grand que /64 ... sauf à avoir recours à un script « up ».