APLU » Historique » Version 3
Version 2 (Aymeric APLU, 11/06/2015 21:47) → Version 3/4 (Aymeric APLU, 11/06/2015 21:47)
h1. De la config en vrac par rapport à TTN
By APLU
h1. VPN
h2. 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.
h3. [Serveur] Prerequis
* sudo
* openvpn
h3. [Serveur] Configuration NAT/ip forward
dans sysctl.conf :
<pre>
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
</pre>
iptables :
<pre>
iptables -t nat -A POSTROUTING -s 10.42.42.0/24 -o eth0 -j MASQUERADE
</pre>
Si on a ufw il faut modifier /etc/ufw/before.rules, il y a de la doc sur internet.
h3. [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é.
<pre>
Cmnd_Alias IPVPN = /bin/ip neigh add *, /bin/ip neigh del *, /bin/ip neigh replace *
nobody ALL = NOPASSWD: IPVPN
</pre>
TODO: Voir comment rendre ça un peu plus sécurisé
h3. [Serveur] Configuration openvpn - creation certificat
<pre>
# cd /etc/openvpn
# mkdir easy-rsa
# cp -R /usr/share/easy-rsa/* easy-rsa/
</pre>
Editer : /etc/openvpn/easy-rsa/vars pour renseigner les infos relatives à la clef. On peut aussi changer la taille des clefs.
<pre>
# 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)
</pre>
h3. [Serveur] Configuration openvpn - openvpn
Créer un fichier de configuration /etc/openvpn/myvpn.conf (on peut changer le nom)
<pre>
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
</pre>
On adaptera XX:YY en fonction de l'IPv6 fourni par les administrateurs de TTN.
h3. [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)
<pre>
#!/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
</pre>
TODO: S'assurer que $addr contient bien une IPv6.. le script est lancée en nobody les checks ne risque rien, le sudo moins.
h3. [serveur/client] generer le certificat pour chaque client
Si ce n'est pas déjà fait :
<pre>
# cd /etc/openvpn/easy-rsa/
# . ./vars # set environment variables
</pre>
Puis:
<pre>
# ./build-key clientname
</pre>
clientname correspond au nom du client, penser à signer le certificat une fois la génération fini.
h3. [Client] Prerequis
* openvpn
* resolvconf
h3. [Client] Configuration openvpn
Créer le fichier de configuration /etc/openvpn/myvpn.conf avec le contenu suivant
<pre>
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
</pre>
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
<pre>
# diff update-resolv-conf.original update-resolv-conf
52a53
> /sbin/resolvconf -d original.resolvconf
</pre>
h3. [serveur/client] activer
Avec systemd faire sur le serveur et sur le client
# systemctl daemon-reload
# service openvpn restart
h3. 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
h3. 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.
By APLU
h1. VPN
h2. 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.
h3. [Serveur] Prerequis
* sudo
* openvpn
h3. [Serveur] Configuration NAT/ip forward
dans sysctl.conf :
<pre>
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
</pre>
iptables :
<pre>
iptables -t nat -A POSTROUTING -s 10.42.42.0/24 -o eth0 -j MASQUERADE
</pre>
Si on a ufw il faut modifier /etc/ufw/before.rules, il y a de la doc sur internet.
h3. [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é.
<pre>
Cmnd_Alias IPVPN = /bin/ip neigh add *, /bin/ip neigh del *, /bin/ip neigh replace *
nobody ALL = NOPASSWD: IPVPN
</pre>
TODO: Voir comment rendre ça un peu plus sécurisé
h3. [Serveur] Configuration openvpn - creation certificat
<pre>
# cd /etc/openvpn
# mkdir easy-rsa
# cp -R /usr/share/easy-rsa/* easy-rsa/
</pre>
Editer : /etc/openvpn/easy-rsa/vars pour renseigner les infos relatives à la clef. On peut aussi changer la taille des clefs.
<pre>
# 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)
</pre>
h3. [Serveur] Configuration openvpn - openvpn
Créer un fichier de configuration /etc/openvpn/myvpn.conf (on peut changer le nom)
<pre>
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
</pre>
On adaptera XX:YY en fonction de l'IPv6 fourni par les administrateurs de TTN.
h3. [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)
<pre>
#!/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
</pre>
TODO: S'assurer que $addr contient bien une IPv6.. le script est lancée en nobody les checks ne risque rien, le sudo moins.
h3. [serveur/client] generer le certificat pour chaque client
Si ce n'est pas déjà fait :
<pre>
# cd /etc/openvpn/easy-rsa/
# . ./vars # set environment variables
</pre>
Puis:
<pre>
# ./build-key clientname
</pre>
clientname correspond au nom du client, penser à signer le certificat une fois la génération fini.
h3. [Client] Prerequis
* openvpn
* resolvconf
h3. [Client] Configuration openvpn
Créer le fichier de configuration /etc/openvpn/myvpn.conf avec le contenu suivant
<pre>
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
</pre>
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
<pre>
# diff update-resolv-conf.original update-resolv-conf
52a53
> /sbin/resolvconf -d original.resolvconf
</pre>
h3. [serveur/client] activer
Avec systemd faire sur le serveur et sur le client
# systemctl daemon-reload
# service openvpn restart
h3. 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
h3. 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.