Project

General

Profile

De la config en vrac par rapport à TTN

By APLU

VPN

Tunnel VPN de type TUN via openvpn

Le but de ce VPN est de faire passer IPv6 et IPv4 au sein du même tunnel pour être visible sur internet avec une l'ip de son serveur.

[Serveur] Prerequis

  • sudo
  • openvpn

[Serveur] Configuration NAT/ip forward

dans sysctl.conf :

net/ipv4/ip_forward=1
net/ipv6/conf/default/forwarding=1
net/ipv6/conf/all/forwarding=1
net/ipv6/conf/all/proxy_ndp=1
net.ipv6/conf/eth0/proxy_ndp=1

iptables :

iptables -t nat -A POSTROUTING -s 10.42.42.0/24 -o eth0 -j MASQUERADE

Si on a ufw il faut modifier /etc/ufw/before.rules, il y a de la doc sur internet.

[Serveur] Configurer sudo

On édite le fichier sudoers avec les info suivantes, ceci sera utilisé dans la suite pour permettre la déclaration de l'IPv6 tunnel côté TTN pour que l'IPv6 puisse être routé.

Cmnd_Alias IPVPN = /bin/ip neigh add *, /bin/ip neigh del *, /bin/ip neigh replace *
nobody ALL = NOPASSWD: IPVPN

TODO: Voir comment rendre ça un peu plus sécurisé

[Serveur] Configuration openvpn - creation certificat

# cd /etc/openvpn
# mkdir easy-rsa
# cp -R /usr/share/easy-rsa/* easy-rsa/

Editer : /etc/openvpn/easy-rsa/vars pour renseigner les infos relatives à la clef. On peut aussi changer la taille des clefs.

# cd easy-rsa/
# touch keys/index.txt
# echo 01 > keys/serial
# . ./vars  # set environment variables
# ./clean-all
# ./build-ca
# ./build-key-server server
# ./build-dh # prends du temps (+15h si on choisi 8192, ~10 minutes pour 2048)

[Serveur] Configuration openvpn - openvpn

Créer un fichier de configuration /etc/openvpn/myvpn.conf (on peut changer le nom)

dev tun
proto udp
port 1194

ca      /etc/openvpn/easy-rsa/keys/ca.crt    # generated keys
cert    /etc/openvpn/easy-rsa/keys/server.crt
key     /etc/openvpn/easy-rsa/keys/server.key  # keep secret
dh      /etc/openvpn/easy-rsa/keys/dh2048.pem

user nobody
group nogroup
server 10.42.42.0 255.255.255.0

tun-ipv6
push tun-ipv6

push "route-ipv6 2000::/3" 
learn-address /etc/openvpn/learn-address

# execution de script
script-security 2

#mssfix 
#fragment 1300

persist-key
persist-tun

keepalive 10 100

status /var/log/openvpn-status.log
log-append /var/log/openvpn
verb 3
client-to-client

push "redirect-gateway def1 bypass-dhcp" 
push "dhcp-option DNS 10.42.42.1" 
push "dhcp-option DNS 91.224.149.254" 

comp-lzo adaptive

server-ipv6 2a01:6600:80XX:YY01::1/64

On adaptera XX:YY en fonction de l'IPv6 fourni par les administrateurs de TTN.

[serveur] Configuration openvpn - scripts

Créer le script /etc/openvpn/learn-address avec le contenu suivant (penser à le rendre executable) :

Ce script ajoute l'IPv6 du peer au proxy ndp, il fait l'équivalent du soft ndppd qui n'existe plus ou n'est pas maintenu (juin 2015)

#!/bin/bash

action="$1" 
addr="$2" 
grep -qE "^2a01:.*" <<< "$addr" 
if [ $? -eq 0 ]
then
case "$action" in 
        add )
                sudo  /bin/ip neigh add proxy "$addr" dev eth0
        ;;
        update )
                sudo /bin/ip neigh replace proxy "$addr" dev eth0
        ;;
        delete)
                sudo /bin/ip neigh del proxy "$addr" dev eth0
        ;;
esac
fi

TODO: S'assurer que $addr contient bien une IPv6.. le script est lancée en nobody les checks ne risque rien, le sudo moins.

[serveur/client] generer le certificat pour chaque client

Si ce n'est pas déjà fait :

# cd /etc/openvpn/easy-rsa/
# . ./vars  # set environment variables

Puis:

# ./build-key clientname

clientname correspond au nom du client, penser à signer le certificat une fois la génération fini.

Copier les fichiers .crt et .key ainsi que ca.crt sur le client.

Rappel : Les .key sont les clefs privée !

[Client] Prerequis

  • openvpn
  • resolvconf

[Client] Configuration openvpn

Créer le fichier de configuration /etc/openvpn/myvpn.conf avec le contenu suivant

client
dev tun
port 1194
proto udp

nobind

ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/monclient.crt
key /etc/openvpn/keys/monclient.key

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

comp-lzo
persist-key
persist-tun
remote 1.2.3.4 1194

Pensez à mettre votre IP à la place 1.2.3.4

Le script /etc/openvpn/update-resolv-conf est fourni par le paquet openvpn cependant pour éviter le DNSLeak j'ai effectué la modification suivante

# diff update-resolv-conf.original update-resolv-conf                                   
52a53
>       /sbin/resolvconf -d original.resolvconf

[serveur/client] activer

Avec systemd faire sur le serveur et sur le client

  1. systemctl daemon-reload
  2. service openvpn restart

Pour tester

On peut faire un mtr/traceroute pour verifier que le chemin soit correct.
Penser à verifier l'IPv6 et l'IPv4 puisque la config offre les deux.

Dans la config j'utilise un resolver DNS local présent sur le serveur, ce dernier doit donc accepter de répondre aux requêtes du VPN, le deuxième resolver et celui de TTN.

Sur le web on peut verifier que l'IPv4 et IPv6 fonctionnement bien en allant sur : http://test-ipv6.com

On peut aussi verifier qu'on ne leak pas d'IP avec : http://ipleak.net

Debugger

ping/mtr/traceroute

A savoir, si un script échoue (par exemple learn-address) la session VPN est refusé.

Si l'IPv4 fonctionne mais pas l'IPv6 verifier le proxy ndp.