Tuto Client OpenVPN

De Wiki LDN
Sauter à la navigation Sauter à la recherche


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).

Warning.png 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 :

  1. rester en UDP mais essayer un autre port (notre service VPN est accessible sur la plupart des ports UDP et TCP en IPv4) ;
  2. essayer de passer en TCP sur un des ports 80, 443, 8080, etc. ;
  3. 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 ».