Projet

Général

Profil

Id2ndR » Historique » Version 13

Fabien ADAM, 09/02/2016 17:35
conf ndppd

1 1 Fabien ADAM
h1. Mes travaux perso relatifs à Tetaneutral
2 1 Fabien ADAM
3 1 Fabien ADAM
Auteur : Id2ndR
4 1 Fabien ADAM
5 1 Fabien ADAM
h2. Virtualisation
6 1 Fabien ADAM
7 4 Fabien ADAM
Au dessus, de libvirt, je fais tourner quelques VM sur ma machine Zbox ID18 http://www.ldlc.com/fiche/PB00158714.html : Celeron double cœurs supportant le VT, avec 8Go de RAM
8 1 Fabien ADAM
9 1 Fabien ADAM
h2. OpenWRT
10 1 Fabien ADAM
11 1 Fabien ADAM
Je possède un TP-Link WDR3600 gigabit et double bande N. Il tourne sous Barrier Breaker 14.04.
12 1 Fabien ADAM
13 1 Fabien ADAM
Objectifs :
14 1 Fabien ADAM
- connecter le routeur à Internet via une connexion 4G
15 1 Fabien ADAM
- sortir sur une VM tournant sur ma machine à Tetaneutral, pour avoir un accès réseau complet (IP fixe, IPv6, téléphonie SIP, pas de bridage ni de modification du flux via les proxys transparents)
16 4 Fabien ADAM
- brancher un téléphone IP ethernet (offre Plug&Phone d'OVH) qui passe dans le VPN, et qui fonctionne normalement sans aucune configuration
17 1 Fabien ADAM
18 1 Fabien ADAM
h3. 4G
19 1 Fabien ADAM
20 4 Fabien ADAM
Inspiré de http://wiki.openwrt.org/doc/howto/usb.tethering
21 3 Fabien ADAM
<pre>
22 3 Fabien ADAM
root@OpenWrt:~# opkg update
23 3 Fabien ADAM
root@OpenWrt:~# opkg install kmod-usb-net-rndis
24 3 Fabien ADAM
root@OpenWrt:~# insmod usbnet
25 3 Fabien ADAM
root@OpenWrt:~# insmod cdc_ether
26 3 Fabien ADAM
root@OpenWrt:~# insmod rndis_host
27 3 Fabien ADAM
root@OpenWrt:~# ifconfig usb0
28 3 Fabien ADAM
usb0      Link encap:Ethernet  HWaddr 02:34:68:55:02:03  
29 3 Fabien ADAM
          BROADCAST MULTICAST  MTU:1500  Metric:1
30 3 Fabien ADAM
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
31 3 Fabien ADAM
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
32 3 Fabien ADAM
          collisions:0 txqueuelen:1000 
33 3 Fabien ADAM
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
34 3 Fabien ADAM
</pre>
35 3 Fabien ADAM
Dans Luci, Network > Interfaces : créer une interface nommée 4G exploitant l'interface usb0, en client dhcp
36 1 Fabien ADAM
37 4 Fabien ADAM
Pinguer depuis le routeur.
38 4 Fabien ADAM
39 1 Fabien ADAM
h3. OpenVPN
40 1 Fabien ADAM
41 1 Fabien ADAM
Mise en place :
42 1 Fabien ADAM
* Certificat SSL du serveur (VM) : généré par CA-Cert (je n'ai jamais pu faire marcher le VPN sur OpenWRT avec un certificat auto-signé)
43 1 Fabien ADAM
* Certificat d'un certificat client : généré avec easy-rsa (build-ca, build-key-server, build-key). Remarque : il n'est pas nécessaire que ces certificats soient issues du certificat du serveur vérifié à la connexion, car le serveur connaît son référentiel de clef, indépendament du certificat serveur présenté sur le port d'écoute.
44 1 Fabien ADAM
* Configuration du serveur :
45 1 Fabien ADAM
<pre>
46 1 Fabien ADAM
id2ndr@id2ndr-vm: ~$ cat /etc/openvpn/id2ndr.conf 
47 1 Fabien ADAM
##################################
48 1 Fabien ADAM
dev tun
49 1 Fabien ADAM
proto udp
50 1 Fabien ADAM
port 1194
51 1 Fabien ADAM
52 1 Fabien ADAM
ca /etc/openvpn/easy-rsa/keys/class3.crt
53 1 Fabien ADAM
cert /etc/openvpn/easy-rsa/keys/id2ndr.toulan.fr.crt
54 1 Fabien ADAM
key /etc/openvpn/easy-rsa/keys/id2ndr.toulan.fr.key
55 1 Fabien ADAM
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
56 1 Fabien ADAM
57 1 Fabien ADAM
user nobody
58 1 Fabien ADAM
group nogroup
59 1 Fabien ADAM
server 10.9.0.0 255.255.255.0
60 1 Fabien ADAM
61 1 Fabien ADAM
persist-key
62 1 Fabien ADAM
#persist-tun
63 1 Fabien ADAM
64 4 Fabien ADAM
keepalive 10 100
65 1 Fabien ADAM
66 1 Fabien ADAM
67 1 Fabien ADAM
status /var/log/openvpn-status.log
68 1 Fabien ADAM
verb 3
69 1 Fabien ADAM
client-to-client
70 1 Fabien ADAM
71 1 Fabien ADAM
72 1 Fabien ADAM
#push "redirect-gateway def1"
73 1 Fabien ADAM
#set the dns servers
74 1 Fabien ADAM
#push "dhcp-option DNS 8.8.8.8"
75 1 Fabien ADAM
#push "dhcp-option DNS 8.8.4.4"
76 1 Fabien ADAM
push "redirect-gateway def1"
77 1 Fabien ADAM
push dhcp-option DNS 91.224.149.254
78 1 Fabien ADAM
79 1 Fabien ADAM
80 1 Fabien ADAM
log-append /var/log/openvpn
81 1 Fabien ADAM
comp-lzo adaptive
82 1 Fabien ADAM
</pre>
83 1 Fabien ADAM
84 1 Fabien ADAM
* Installation du client :
85 1 Fabien ADAM
<pre>
86 1 Fabien ADAM
root@OpenWrt:~# opkg update; opkg install openvpn-openssl
87 2 Fabien ADAM
root@OpenWrt:~# uci set openvpn.custom_config.enabled=1
88 2 Fabien ADAM
root@OpenWrt:~# uci commit
89 1 Fabien ADAM
root@OpenWrt:~# cat /etc/openvpn/my-vpn.conf 
90 1 Fabien ADAM
dev tun
91 1 Fabien ADAM
client
92 1 Fabien ADAM
#proto tcp
93 1 Fabien ADAM
proto udp
94 1 Fabien ADAM
remote id2ndr.toulan.fr 1195
95 1 Fabien ADAM
resolv-retry infinite
96 1 Fabien ADAM
nobind
97 1 Fabien ADAM
persist-key
98 1 Fabien ADAM
persist-tun
99 1 Fabien ADAM
ca /etc/openvpn/class3.crt
100 1 Fabien ADAM
cert /etc/openvpn/Id2ndR.crt
101 1 Fabien ADAM
key /etc/openvpn/Id2ndR.key
102 1 Fabien ADAM
comp-lzo no
103 1 Fabien ADAM
verb 3
104 1 Fabien ADAM
root@OpenWrt:/etc/openvpn# wget http://www.cacert.org/certs/class3.crt
105 1 Fabien ADAM
root@OpenWrt:~# vi /etc/openvpn/Id2ndR.crt
106 1 Fabien ADAM
root@OpenWrt:~# vi /etc/openvpn/Id2ndR.key
107 2 Fabien ADAM
root@OpenWrt:~# uci set openvpn.custom_config.enabled=1
108 2 Fabien ADAM
root@OpenWrt:~# uci commit
109 2 Fabien ADAM
root@OpenWrt:~# /etc/init.d/openvpn start
110 2 Fabien ADAM
root@OpenWrt:~# logread
111 2 Fabien ADAM
[..]
112 2 Fabien ADAM
Sat Dec  6 19:35:15 2014 daemon.warn openvpn(custom_config)[25584]: WARNING: file '/etc/openvpn/Id2ndR.key' is group or others accessible
113 2 Fabien ADAM
Sat Dec  6 19:35:15 2014 daemon.notice netifd: Interface 'wan_vpn' is disabled
114 2 Fabien ADAM
Sat Dec  6 19:35:15 2014 daemon.notice openvpn(custom_config)[25584]: Socket Buffers: R=[163840->131072] S=[163840->131072]
115 2 Fabien ADAM
Sat Dec  6 19:35:15 2014 daemon.notice openvpn(custom_config)[25584]: UDPv4 link local: [undef]
116 2 Fabien ADAM
Sat Dec  6 19:35:15 2014 daemon.notice openvpn(custom_config)[25584]: UDPv4 link remote: [AF_INET]91.224.149.109:1195
117 2 Fabien ADAM
Sat Dec  6 19:35:15 2014 daemon.notice openvpn(custom_config)[25584]: TLS: Initial packet from [AF_INET]91.224.149.109:1195, sid=2e0c718b e9ec8be6
118 2 Fabien ADAM
Sat Dec  6 19:35:15 2014 daemon.notice openvpn(custom_config)[25584]: VERIFY OK: depth=1, O=CAcert Inc., OU=http://www.CAcert.org, CN=CAcert Class 3 Root
119 2 Fabien ADAM
Sat Dec  6 19:35:15 2014 daemon.notice openvpn(custom_config)[25584]: VERIFY OK: depth=0, CN=id2ndr.toulan.fr
120 2 Fabien ADAM
Sat Dec  6 19:35:16 2014 daemon.notice openvpn(custom_config)[25584]: Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
121 2 Fabien ADAM
Sat Dec  6 19:35:16 2014 daemon.notice openvpn(custom_config)[25584]: Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
122 2 Fabien ADAM
Sat Dec  6 19:35:16 2014 daemon.notice openvpn(custom_config)[25584]: Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
123 2 Fabien ADAM
Sat Dec  6 19:35:16 2014 daemon.notice openvpn(custom_config)[25584]: Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
124 2 Fabien ADAM
Sat Dec  6 19:35:16 2014 daemon.notice openvpn(custom_config)[25584]: Control Channel: TLSv1.0, cipher TLS-DHE-RSA-WITH-AES-256-CBC-SHA, 2048 bit RSA
125 2 Fabien ADAM
Sat Dec  6 19:35:16 2014 daemon.notice openvpn(custom_config)[25584]: [id2ndr.toulan.fr] Peer Connection Initiated with [AF_INET]91.224.149.109:1195
126 2 Fabien ADAM
Sat Dec  6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: SENT CONTROL [id2ndr.toulan.fr]: 'PUSH_REQUEST' (status=1)
127 2 Fabien ADAM
Sat Dec  6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1,dhcp-option DNS 91.224.149.254,route 10.9.0.0 255.255.255.0,topology net30,ping 30,ping-restart 100,ifconfig 10.9.0.6 10.9.0.5'
128 2 Fabien ADAM
Sat Dec  6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: OPTIONS IMPORT: timers and/or timeouts modified
129 2 Fabien ADAM
Sat Dec  6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: OPTIONS IMPORT: --ifconfig/up options modified
130 2 Fabien ADAM
Sat Dec  6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: OPTIONS IMPORT: route options modified
131 2 Fabien ADAM
Sat Dec  6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
132 2 Fabien ADAM
Sat Dec  6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: TUN/TAP device tun0 opened
133 2 Fabien ADAM
Sat Dec  6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: TUN/TAP TX queue length set to 100
134 2 Fabien ADAM
Sat Dec  6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
135 1 Fabien ADAM
Sat Dec  6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: /sbin/ifconfig tun0 10.9.0.6 pointopoint 10.9.0.5 mtu 1500
136 2 Fabien ADAM
Sat Dec  6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: /sbin/route add -net 91.224.149.109 netmask 255.255.255.255 gw 192.168.0.1
137 1 Fabien ADAM
</pre>
138 5 Fabien ADAM
139 5 Fabien ADAM
Résultats :
140 5 Fabien ADAM
* j'ai mesuré environ 70% d'utilisation CPU sur le routeur pour faire passer 17 méga. Ceci est cohérent avec [[Benchmark_VPN]].
141 5 Fabien ADAM
* en 4G, avec une SIM Red, je fais passé en général 6 méga down / 1 méga up (mais parfois beaucoup plus)
142 5 Fabien ADAM
143 7 Fabien ADAM
h3. Routage
144 7 Fabien ADAM
145 7 Fabien ADAM
* Nat via le VPN : inspiré de http://wiki.openwrt.org/doc/howto/vpn.server.openvpn.tun Use-Case 3
146 7 Fabien ADAM
** Dans Luci, Network > Interfaces : créer une interface nommée wan_vpn exploitant l'interface tun0, en client dhcp
147 7 Fabien ADAM
** Dans Luci, Network > Firewall : créer une zone wan_vpn avec l'interface wan_vpn en activant Masquerading
148 7 Fabien ADAM
** Dans Luci, Network > Firewall : supprimer la zone lan existante. Créer la zone lan avec le forward vers la zone wan_vpn
149 7 Fabien ADAM
** Depuis un PC derrière le routeur : traceroute google.fr doit sortir par h7.tetaneutral.net (4ème nœuds chez moi, à cause de la VM)
150 7 Fabien ADAM
151 7 Fabien ADAM
Résultats :
152 7 Fabien ADAM
* Le VPN ajoute en général 20-25ms par rapport à une route directe (vers un autre site que tetaneutral).
153 7 Fabien ADAM
* Le VPN ne réduit pas le débit par rapport à la connexion hors VPN.
154 7 Fabien ADAM
* La VoIP (SIP) fonctionne très bien via le VPN
155 7 Fabien ADAM
156 7 Fabien ADAM
Limites :
157 7 Fabien ADAM
* Pour les jeux en ligne, on tourne autour de 100-105ms de ping avec le VPN contre 80ms en connexion direct.
158 7 Fabien ADAM
* Pas de sélection des flux à faire passer dans le VPN, et ceux à faire passer directement en 4G :
159 7 Fabien ADAM
** Le masquerade d'OpenWRT fait via luci fonctionne par zone, et s'il est possible d'autoriser le forward d'une zone vers plusieurs zones, seule la dernière zone est prise en compte
160 7 Fabien ADAM
** Il n'est pas possible via Luci d'utiliser une même zone dans plusieurs règles de forward vers chacun une zone différente
161 7 Fabien ADAM
** La table de routage du noyau linux ne permet pas de définir plusieurs passerelles par défaut.
162 7 Fabien ADAM
163 7 Fabien ADAM
Piste à explorer pour contourner les limites ci-dessus : installer iproute2, et ajouter des étiquettes sur les différents flux, pour faire un routage plus évolué.
164 7 Fabien ADAM
165 6 Fabien ADAM
h2. Raspberry Pi
166 6 Fabien ADAM
167 5 Fabien ADAM
Objectifs :
168 5 Fabien ADAM
* Transformer le rPi en routeur, avec comme interface de sortie vers Internet un appareil en usb, et comme interface LAN, le port ethernet
169 1 Fabien ADAM
* Encapsuler la connexion des clients sur le LAN dans le VPN
170 1 Fabien ADAM
* Faire du filtrage pour choisir explicitement quoi router dans le VPN, et quoi faire passer en direct
171 1 Fabien ADAM
172 1 Fabien ADAM
h3. Routage
173 1 Fabien ADAM
174 7 Fabien ADAM
* Configurer l'interface ethernet en hotplug, avec une IP fixe; et l'usb en dhcp (Internet)
175 7 Fabien ADAM
<pre>
176 7 Fabien ADAM
auto eth0
177 7 Fabien ADAM
allow-hotplug eth0
178 7 Fabien ADAM
iface eth0 inet static
179 7 Fabien ADAM
        address 192.168.1.1
180 7 Fabien ADAM
        netmask 255.255.255.0
181 7 Fabien ADAM
        post-up iptables-restore < /etc/network/iptables
182 1 Fabien ADAM
183 7 Fabien ADAM
auto usb0
184 7 Fabien ADAM
allow-hotplug usb0
185 7 Fabien ADAM
        iface usb0 inet dhcp
186 7 Fabien ADAM
</pre>
187 7 Fabien ADAM
* Installer le paquet dnsmasq, et lui donner la page d'IP à allouer en DHCP. dnsmasq fait office de relai DNS de manière automatique, et fourni également la route par défaut (il indique que le rPi fait office de passerelle vers Internet) : echo "dhcp-range=eth0,192.168.1.2,192.168.1.10,4h" | sudo tee /etc/dnsmasq.d/raspberry.conf
188 7 Fabien ADAM
* Activer le routage sur le rPi :
189 8 Fabien ADAM
** l'ip forward : Décommenter la ligne _net.ipv4.ip_forward=1_ dans /etc/sysctl.conf, et appliquer les modifications avec _sudo sysctl -p /etc/sysctl.conf_ (vérification : sudo sysctl net.ipv4.ip_forward)
190 7 Fabien ADAM
** le nat : sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE; sudo iptables-save | sudo tee /etc/network/iptables
191 7 Fabien ADAM
192 1 Fabien ADAM
h3. OpenVPN
193 5 Fabien ADAM
194 5 Fabien ADAM
* Installer le paquet openvpn.
195 5 Fabien ADAM
* Recopier la conf (4 fichier) dans /etc/openvpn
196 5 Fabien ADAM
* Redémarrer le service
197 5 Fabien ADAM
198 5 Fabien ADAM
TODO : tester 2 connexions VPN en //, pour éventuellement faire du bounding (si FreeMobile limite le débit vers tetaneutral par flux)
199 5 Fabien ADAM
200 5 Fabien ADAM
TODO : mettre en place de l'IPv6
201 5 Fabien ADAM
202 5 Fabien ADAM
h3. Routage sélectif
203 5 Fabien ADAM
204 5 Fabien ADAM
TODO : avec iproute2
205 9 Fabien ADAM
206 9 Fabien ADAM
Ici le rPi :
207 9 Fabien ADAM
* prend le net via la 4G, soit en usb, soit en wifi, cela ne change rien (sauf l'IP de la passerelle utilisée ci-dessous)
208 9 Fabien ADAM
* partage le net via son port ethernet, branché sur un switch, en faisant serveur DHCP
209 9 Fabien ADAM
210 9 Fabien ADAM
Objectif : faire transiter tous les flux dans le VPN, sauf ceux qui ne doivent pas être ralentis (ping ou bridage FreeMobile)
211 9 Fabien ADAM
Source : http://irp.nain-t.net/doku.php/100iproute:020_iproute2
212 9 Fabien ADAM
213 9 Fabien ADAM
Démo : ici on va faire passer le web via la 4G, et le reste dans le VPN.
214 9 Fabien ADAM
<pre>
215 9 Fabien ADAM
id2ndr@raspberrypi ~ $ sudo vim.tiny /etc/iproute2/rt_tables                    # Ajout de la ligne "200    4G"
216 9 Fabien ADAM
id2ndr@raspberrypi ~ $ sudo ip rule add fwmark 80 table 4G
217 9 Fabien ADAM
id2ndr@raspberrypi ~ $ ip rule list
218 9 Fabien ADAM
0:      from all lookup local 
219 9 Fabien ADAM
32764:  from all fwmark 0x50 lookup 4G 
220 9 Fabien ADAM
32765:  from all fwmark 0x50 lookup 4G 
221 9 Fabien ADAM
32766:  from all lookup main 
222 9 Fabien ADAM
32767:  from all lookup default 
223 9 Fabien ADAM
id2ndr@raspberrypi ~ $ ip a s dev wlan0
224 9 Fabien ADAM
4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
225 9 Fabien ADAM
    link/ether 00:08:a1:ac:cf:ab brd ff:ff:ff:ff:ff:ff
226 9 Fabien ADAM
    inet 192.168.43.241/24 brd 192.168.43.255 scope global wlan0
227 9 Fabien ADAM
       valid_lft forever preferred_lft forever
228 9 Fabien ADAM
    inet6 fe80::208:a1ff:feac:cfab/64 scope link 
229 9 Fabien ADAM
       valid_lft forever preferred_lft forever
230 9 Fabien ADAM
id2ndr@raspberrypi ~ $ sudo ip route add default via 192.168.43.1 table 4G
231 9 Fabien ADAM
id2ndr@raspberrypi ~ $ ip r s
232 9 Fabien ADAM
0.0.0.0/1 via 10.9.0.5 dev tun0 
233 9 Fabien ADAM
default via 192.168.43.1 dev wlan0 
234 9 Fabien ADAM
10.9.0.0/24 via 10.9.0.5 dev tun0 
235 9 Fabien ADAM
10.9.0.5 dev tun0  proto kernel  scope link  src 10.9.0.6 
236 9 Fabien ADAM
128.0.0.0/1 via 10.9.0.5 dev tun0 
237 9 Fabien ADAM
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.1 
238 9 Fabien ADAM
192.168.43.0/24 dev wlan0  proto kernel  scope link  src 192.168.43.241 
239 9 Fabien ADAM
id2ndr@raspberrypi ~ $ ip r s table 4G
240 9 Fabien ADAM
default via 192.168.43.1 dev wlan0 
241 9 Fabien ADAM
id2ndr@raspberrypi ~ $ sudo iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 80
242 9 Fabien ADAM
</pre>
243 9 Fabien ADAM
244 9 Fabien ADAM
En activant ou non la règle iptables à la fin, on peut comparer un speedtest passant dans le VPN ou en direct
245 9 Fabien ADAM
246 9 Fabien ADAM
Tests :
247 9 Fabien ADAM
* sudo tcptraceroute google.fr 80  # doit sortir en direct
248 9 Fabien ADAM
* sudo tcptraceroute google.fr 100 # doit passer par tetaneutral
249 10 Fabien ADAM
250 10 Fabien ADAM
Mise en place permanente :
251 10 Fabien ADAM
* Contenu de /home/id2ndr/scripts/4G_direct_FreeMobile.sh :
252 10 Fabien ADAM
<pre>
253 10 Fabien ADAM
#!/bin/bash
254 10 Fabien ADAM
255 10 Fabien ADAM
sudo ip route add default via 192.168.43.1 table 4G
256 10 Fabien ADAM
sudo ip rule add fwmark 80 table 4G
257 10 Fabien ADAM
# Web
258 10 Fabien ADAM
sudo iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 80
259 10 Fabien ADAM
# Jeu en ligne (pour le ping) : Steam
260 10 Fabien ADAM
sudo iptables -t mangle -A PREROUTING -i eth0 -p udp --dport 27000:27015 -j MARK --set-mark 80
261 10 Fabien ADAM
sudo iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 27030:27039 -j MARK --set-mark 80
262 10 Fabien ADAM
</pre>
263 10 Fabien ADAM
* Ajout de @        post-up /home/id2ndr/scripts/4G_direct_FreeMobile.sh@ dans /etc/network/interfaces pour eth0
264 11 Fabien ADAM
265 11 Fabien ADAM
h2. IPv6 et VPN
266 11 Fabien ADAM
267 11 Fabien ADAM
Les VPN peuvent faire transiter de l'IPv6, mais ce protocole étant assez vaste par nature, le contrôle fait par les VPN pose souvent problème.
268 11 Fabien ADAM
Dans mon cas, je n'ai pas réussi à router correctement l'IPv6 au dela du VPN lorsque je spécifiais des sous-réseaux IPv6 dans la conf des VPN (OpenVPN et tinc).
269 11 Fabien ADAM
270 11 Fabien ADAM
Le plus simple est de ne pas indiquer au VPN qu'il y a de l'IPv6, pour après faire la configuration avec iproute2. Cette solution est d'ailleurs utilisée à TTN pour faire transiter l'IPv6 à travers les ponts wifi.
271 11 Fabien ADAM
* Avec OpenVPN, il faut le lancer en ligne de commande avec les options en argument (je n'ai pas réussi à le faire fonctionner avec un fichier de configuration) ; exemple sur le client _sudo openvpn --dev tunipv6 --dev-type tun --lport 0 --proto udp --daemon --remote 91.224.149.109 65002 --secret /etc/openvpn/secret.key --keepalive 10 60 --verb 3 --log-append /tmp/tunipv6.log --mssfix 1389_
272 11 Fabien ADAM
* Avec Tinc, il suffit de le faire fonctionner au niveau 2 (ethernet) : _Mode = switch_ dans /etc/tinc/tinc.conf
273 11 Fabien ADAM
274 11 Fabien ADAM
h3. Routage et configuration automatique
275 11 Fabien ADAM
276 11 Fabien ADAM
L'idée est d'apporter l'IPv6 aux clients derrière le VPN, qui sont derrière un switch physique.
277 11 Fabien ADAM
* Plan réseau : <Internet>---</56 TTN sur le serveur>---VPN---</64 sur le LAN>
278 11 Fabien ADAM
* Voici mon architecture matérielle : <Internet>---<Serveur à TTN>---4G---<smartphone>---usb---<Odroid_C1>--eth---<switch_wifi>---<PCs>
279 11 Fabien ADAM
280 11 Fabien ADAM
Éléments techniques pour le routage :
281 11 Fabien ADAM
* Conteneur docker sur le serveur : déclare le sous-réseau en /64 à router dans le VPN
282 11 Fabien ADAM
* Pas d'IPv6 global à l'entrée et à la sortie du tunnel VPN : l'utilisation des adresses de liens permettra de pousser le /64 au delà du Odroid_C1 : sur le LAN
283 11 Fabien ADAM
* Proxy NDP pour pouvoir router le trafic unicast à travers les liens-locaux
284 11 Fabien ADAM
285 11 Fabien ADAM
h3. Mise en place
286 11 Fabien ADAM
287 11 Fabien ADAM
* Tinc :
288 11 Fabien ADAM
** Serveur :
289 11 Fabien ADAM
*** mkdir /docker_volumes/tinc ; cd /docker_volumes/tinc ; echo -e "Name = tinc_ipv6\nForwarding = kernel\nMode = switch" > tinc.conf ; echo "Address = id2ndr.tetaneutral.net" > hosts/tinc_ipv6 ; echo -e "#!/bin/sh\nip link set $INTERFACE up\nip link set mtu 1400 dev $INTERFACE\nip -6 addr add fe80::81:6d03/64 dev $INTERFACE\nip -6 route add 2a01:6600:8081:6d03::/64 dev $INTERFACE" > tinc-up ; chmod +x tinc-up
290 11 Fabien ADAM
*** docker run -d --name tinc --net=host --device=/dev/net/tun --cap-add NET_ADMIN --volume /docker_volumes/tinc:/etc/tinc jenserat/tinc start -D
291 12 Fabien ADAM
*** docker exec -ti tinc tinc init # Génère les clefs de l'hôte
292 11 Fabien ADAM
*** docker exec -ti tinc tinc export # Récupérer la conf hosts/tinc_ipv6
293 11 Fabien ADAM
*** docker restart tinc
294 11 Fabien ADAM
** Client :
295 11 Fabien ADAM
*** apt install tinc
296 1 Fabien ADAM
*** cd /etc/tinc ; echo -e "Name = tinc_ipv6_odroid\nForwarding = kernel\nMode = switch" > tinc.conf ; echo -e "Name = tinc_ipv6_odroid\nInterface=vpn6\nConnectTo = tinc_ipv6" > hosts/tinc_ipv6_odroid ; echo -e "#!/bin/sh\nip link set $INTERFACE up\nip link set mtu 1400 $INTERFACE\nip -6 route add default via fe80::81:6d03 dev $INTERFACE > tinc-up ; chmod +x tinc-up ; echo "Import de hosts/tinc_ipv6"
297 12 Fabien ADAM
*** tincd -K # Génère les clefs de l'hôte
298 1 Fabien ADAM
*** tincd # Puis dans docker, on vérifie la connexion avec : tinc dump node
299 11 Fabien ADAM
*** apt install radvd # Va indiquer le sous-réseau à utiliser pour les PC sur le LAN
300 12 Fabien ADAM
*** echo -e "interface eth0\n{\n   AdvSendAdvert on;\n   prefix 2a01:6600:8081:6d03::/64\n   {\n       AdvRouterAddr on; \n   };\n   RDNSS 2a01:6600:8081:ffff:: {\n   };\n};" > /etc/radvd.conf
301 11 Fabien ADAM
*** sudo service radvd start
302 11 Fabien ADAM
*** echo "Télécharger NDPPD sur https://github.com/DanielAdolfsson/ndppd/releases"
303 11 Fabien ADAM
*** make
304 13 Fabien ADAM
*** echo -e "proxy vpn6 {\n   router yes\n   timeout 500   \n   ttl 30000\n   rule 2a01:6600:8081:6d03::/64 {\n      static\n   }\n}" > /etc/ndppd.conf # static permet de répondre à toutes les requêtes : permet de résoudre les éventuels problèmes de transmission de paquet sur le Lan/wifi, et permet également à l'Odroid l'accès au réseau global IPv6 grace à son IP construite sur l'interface eth0.
305 11 Fabien ADAM
*** ./ndppd -d # A intégrer dans le tinc-up
306 11 Fabien ADAM
307 11 Fabien ADAM
Ensuite on teste :
308 11 Fabien ADAM
* Écoute du trafic un peu partout : sudo tcpdump ip6 and icmp6 -i vpn6 -n
309 11 Fabien ADAM
* ping6 sur l'adresse de lien (odroid vers conteneur) : ping6 fe80::81:6d31%vpn6
310 13 Fabien ADAM
* ping6 sur adresse global depuis l'odroid : ok (uniquement si le proxy NDP est réglé sur "static", car sinon il ne fait que relayer les requêtes arrivant sur l'interface eth0)
311 11 Fabien ADAM
* ping6 sur id2ndr.tetaneutral.net depuis un PC : OK
312 11 Fabien ADAM
* wget -6 google.fr