Projet

Général

Profil

Id2ndR » Historique » Version 9

Fabien ADAM, 18/12/2014 00:52
routage sélectif

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