Projet

Général

Profil

Id2ndR » Historique » Version 6

Fabien ADAM, 16/12/2014 15:22
Raspberry Pi

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 6 Fabien ADAM
h2. Raspberry Pi
144 6 Fabien ADAM
145 6 Fabien ADAM
Objectifs :
146 6 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
147 6 Fabien ADAM
* Encapsuler la connexion des clients sur le LAN dans le VPN
148 6 Fabien ADAM
* Faire du filtrage pour choisir explicitement quoi router dans le VPN, et quoi faire passer en direct
149 6 Fabien ADAM
150 6 Fabien ADAM
h3. Routage
151 6 Fabien ADAM
152 6 Fabien ADAM
* Configurer l'interface ethernet en hotplug, avec une IP fixe
153 6 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)
154 6 Fabien ADAM
* Activer l'ip forward sur le rPi
155 6 Fabien ADAM
156 6 Fabien ADAM
h3. OpenVPN
157 6 Fabien ADAM
158 6 Fabien ADAM
* Installer le paquet openvpn.
159 6 Fabien ADAM
* Recopier la conf (4 fichier) dans /etc/openvpn
160 6 Fabien ADAM
* Redémarrer le service
161 6 Fabien ADAM
162 6 Fabien ADAM
TODO : tester 2 connexions VPN en //, pour éventuellement faire du bounding (si FreeMobile limite le débit vers tetaneutral par flux)
163 6 Fabien ADAM
164 6 Fabien ADAM
TODO : mettre en place de l'IPv6
165 6 Fabien ADAM
166 6 Fabien ADAM
h3. Routage sélectif
167 6 Fabien ADAM
168 6 Fabien ADAM
TODO : avec iproute2
169 6 Fabien ADAM
170 5 Fabien ADAM
h3. Routage
171 5 Fabien ADAM
172 1 Fabien ADAM
* Nat via le VPN : inspiré de http://wiki.openwrt.org/doc/howto/vpn.server.openvpn.tun Use-Case 3
173 1 Fabien ADAM
** Dans Luci, Network > Interfaces : créer une interface nommée wan_vpn exploitant l'interface tun0, en client dhcp
174 1 Fabien ADAM
** Dans Luci, Network > Firewall : créer une zone wan_vpn avec l'interface wan_vpn en activant Masquerading
175 1 Fabien ADAM
** Dans Luci, Network > Firewall : supprimer la zone lan existante. Créer la zone lan avec le forward vers la zone wan_vpn
176 4 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)
177 1 Fabien ADAM
178 1 Fabien ADAM
Résultats :
179 5 Fabien ADAM
* Le VPN ajoute en général 20-25ms par rapport à une route directe (vers un autre site que tetaneutral).
180 5 Fabien ADAM
* Le VPN ne réduit pas le débit par rapport à la connexion hors VPN.
181 5 Fabien ADAM
* La VoIP (SIP) fonctionne très bien via le VPN
182 5 Fabien ADAM
183 5 Fabien ADAM
Limites :
184 5 Fabien ADAM
* Pour les jeux en ligne, on tourne autour de 100-105ms de ping avec le VPN contre 80ms en connexion direct.
185 5 Fabien ADAM
* Pas de sélection des flux à faire passer dans le VPN, et ceux à faire passer directement en 4G :
186 5 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
187 5 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
188 5 Fabien ADAM
** La table de routage du noyau linux ne permet pas de définir plusieurs passerelles par défaut.
189 5 Fabien ADAM
190 5 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é.