Id2ndR » Historique » Version 6
Version 5 (Fabien ADAM, 11/12/2014 16:04) → Version 6/13 (Fabien ADAM, 16/12/2014 15:22)
h1. Mes travaux perso relatifs à Tetaneutral
Auteur : Id2ndR
h2. Virtualisation
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
h2. OpenWRT
Je possède un TP-Link WDR3600 gigabit et double bande N. Il tourne sous Barrier Breaker 14.04.
Objectifs :
- connecter le routeur à Internet via une connexion 4G
- 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)
- brancher un téléphone IP ethernet (offre Plug&Phone d'OVH) qui passe dans le VPN, et qui fonctionne normalement sans aucune configuration
h3. 4G
Inspiré de http://wiki.openwrt.org/doc/howto/usb.tethering
<pre>
root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg install kmod-usb-net-rndis
root@OpenWrt:~# insmod usbnet
root@OpenWrt:~# insmod cdc_ether
root@OpenWrt:~# insmod rndis_host
root@OpenWrt:~# ifconfig usb0
usb0 Link encap:Ethernet HWaddr 02:34:68:55:02:03
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
</pre>
Dans Luci, Network > Interfaces : créer une interface nommée 4G exploitant l'interface usb0, en client dhcp
Pinguer depuis le routeur.
h3. OpenVPN
Mise en place :
* 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é)
* 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.
* Configuration du serveur :
<pre>
id2ndr@id2ndr-vm: ~$ cat /etc/openvpn/id2ndr.conf
##################################
dev tun
proto udp
port 1194
ca /etc/openvpn/easy-rsa/keys/class3.crt
cert /etc/openvpn/easy-rsa/keys/id2ndr.toulan.fr.crt
key /etc/openvpn/easy-rsa/keys/id2ndr.toulan.fr.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
user nobody
group nogroup
server 10.9.0.0 255.255.255.0
persist-key
#persist-tun
keepalive 10 100
status /var/log/openvpn-status.log
verb 3
client-to-client
#push "redirect-gateway def1"
#set the dns servers
#push "dhcp-option DNS 8.8.8.8"
#push "dhcp-option DNS 8.8.4.4"
push "redirect-gateway def1"
push dhcp-option DNS 91.224.149.254
log-append /var/log/openvpn
comp-lzo adaptive
</pre>
* Installation du client :
<pre>
root@OpenWrt:~# opkg update; opkg install openvpn-openssl
root@OpenWrt:~# uci set openvpn.custom_config.enabled=1
root@OpenWrt:~# uci commit
root@OpenWrt:~# cat /etc/openvpn/my-vpn.conf
dev tun
client
#proto tcp
proto udp
remote id2ndr.toulan.fr 1195
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/class3.crt
cert /etc/openvpn/Id2ndR.crt
key /etc/openvpn/Id2ndR.key
comp-lzo no
verb 3
root@OpenWrt:/etc/openvpn# wget http://www.cacert.org/certs/class3.crt
root@OpenWrt:~# vi /etc/openvpn/Id2ndR.crt
root@OpenWrt:~# vi /etc/openvpn/Id2ndR.key
root@OpenWrt:~# uci set openvpn.custom_config.enabled=1
root@OpenWrt:~# uci commit
root@OpenWrt:~# /etc/init.d/openvpn start
root@OpenWrt:~# logread
[..]
Sat Dec 6 19:35:15 2014 daemon.warn openvpn(custom_config)[25584]: WARNING: file '/etc/openvpn/Id2ndR.key' is group or others accessible
Sat Dec 6 19:35:15 2014 daemon.notice netifd: Interface 'wan_vpn' is disabled
Sat Dec 6 19:35:15 2014 daemon.notice openvpn(custom_config)[25584]: Socket Buffers: R=[163840->131072] S=[163840->131072]
Sat Dec 6 19:35:15 2014 daemon.notice openvpn(custom_config)[25584]: UDPv4 link local: [undef]
Sat Dec 6 19:35:15 2014 daemon.notice openvpn(custom_config)[25584]: UDPv4 link remote: [AF_INET]91.224.149.109:1195
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
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
Sat Dec 6 19:35:15 2014 daemon.notice openvpn(custom_config)[25584]: VERIFY OK: depth=0, CN=id2ndr.toulan.fr
Sat Dec 6 19:35:16 2014 daemon.notice openvpn(custom_config)[25584]: Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
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
Sat Dec 6 19:35:16 2014 daemon.notice openvpn(custom_config)[25584]: Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
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
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
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
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: SENT CONTROL [id2ndr.toulan.fr]: 'PUSH_REQUEST' (status=1)
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'
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: OPTIONS IMPORT: timers and/or timeouts modified
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: OPTIONS IMPORT: --ifconfig/up options modified
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: OPTIONS IMPORT: route options modified
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: TUN/TAP device tun0 opened
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: TUN/TAP TX queue length set to 100
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
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
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
</pre>
Résultats :
* j'ai mesuré environ 70% d'utilisation CPU sur le routeur pour faire passer 17 méga. Ceci est cohérent avec [[Benchmark_VPN]].
* 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)
h2. Raspberry Pi
Objectifs :
* Transformer le rPi en routeur, avec comme interface de sortie vers Internet un appareil en usb, et comme interface LAN, le port ethernet
* Encapsuler la connexion des clients sur le LAN dans le VPN
* Faire du filtrage pour choisir explicitement quoi router dans le VPN, et quoi faire passer en direct
h3. Routage
* Configurer l'interface ethernet en hotplug, avec une IP fixe
* 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)
* Activer l'ip forward sur le rPi
h3. OpenVPN
* Installer le paquet openvpn.
* Recopier la conf (4 fichier) dans /etc/openvpn
* Redémarrer le service
TODO : tester 2 connexions VPN en //, pour éventuellement faire du bounding (si FreeMobile limite le débit vers tetaneutral par flux)
TODO : mettre en place de l'IPv6
h3. Routage sélectif
TODO : avec iproute2
h3. Routage
* Nat via le VPN : inspiré de http://wiki.openwrt.org/doc/howto/vpn.server.openvpn.tun Use-Case 3
** Dans Luci, Network > Interfaces : créer une interface nommée wan_vpn exploitant l'interface tun0, en client dhcp
** Dans Luci, Network > Firewall : créer une zone wan_vpn avec l'interface wan_vpn en activant Masquerading
** Dans Luci, Network > Firewall : supprimer la zone lan existante. Créer la zone lan avec le forward vers la zone wan_vpn
** 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)
Résultats :
* Le VPN ajoute en général 20-25ms par rapport à une route directe (vers un autre site que tetaneutral).
* Le VPN ne réduit pas le débit par rapport à la connexion hors VPN.
* La VoIP (SIP) fonctionne très bien via le VPN
Limites :
* Pour les jeux en ligne, on tourne autour de 100-105ms de ping avec le VPN contre 80ms en connexion direct.
* Pas de sélection des flux à faire passer dans le VPN, et ceux à faire passer directement en 4G :
** 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
** 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
** La table de routage du noyau linux ne permet pas de définir plusieurs passerelles par défaut.
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é.
Auteur : Id2ndR
h2. Virtualisation
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
h2. OpenWRT
Je possède un TP-Link WDR3600 gigabit et double bande N. Il tourne sous Barrier Breaker 14.04.
Objectifs :
- connecter le routeur à Internet via une connexion 4G
- 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)
- brancher un téléphone IP ethernet (offre Plug&Phone d'OVH) qui passe dans le VPN, et qui fonctionne normalement sans aucune configuration
h3. 4G
Inspiré de http://wiki.openwrt.org/doc/howto/usb.tethering
<pre>
root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg install kmod-usb-net-rndis
root@OpenWrt:~# insmod usbnet
root@OpenWrt:~# insmod cdc_ether
root@OpenWrt:~# insmod rndis_host
root@OpenWrt:~# ifconfig usb0
usb0 Link encap:Ethernet HWaddr 02:34:68:55:02:03
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
</pre>
Dans Luci, Network > Interfaces : créer une interface nommée 4G exploitant l'interface usb0, en client dhcp
Pinguer depuis le routeur.
h3. OpenVPN
Mise en place :
* 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é)
* 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.
* Configuration du serveur :
<pre>
id2ndr@id2ndr-vm: ~$ cat /etc/openvpn/id2ndr.conf
##################################
dev tun
proto udp
port 1194
ca /etc/openvpn/easy-rsa/keys/class3.crt
cert /etc/openvpn/easy-rsa/keys/id2ndr.toulan.fr.crt
key /etc/openvpn/easy-rsa/keys/id2ndr.toulan.fr.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
user nobody
group nogroup
server 10.9.0.0 255.255.255.0
persist-key
#persist-tun
keepalive 10 100
status /var/log/openvpn-status.log
verb 3
client-to-client
#push "redirect-gateway def1"
#set the dns servers
#push "dhcp-option DNS 8.8.8.8"
#push "dhcp-option DNS 8.8.4.4"
push "redirect-gateway def1"
push dhcp-option DNS 91.224.149.254
log-append /var/log/openvpn
comp-lzo adaptive
</pre>
* Installation du client :
<pre>
root@OpenWrt:~# opkg update; opkg install openvpn-openssl
root@OpenWrt:~# uci set openvpn.custom_config.enabled=1
root@OpenWrt:~# uci commit
root@OpenWrt:~# cat /etc/openvpn/my-vpn.conf
dev tun
client
#proto tcp
proto udp
remote id2ndr.toulan.fr 1195
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/class3.crt
cert /etc/openvpn/Id2ndR.crt
key /etc/openvpn/Id2ndR.key
comp-lzo no
verb 3
root@OpenWrt:/etc/openvpn# wget http://www.cacert.org/certs/class3.crt
root@OpenWrt:~# vi /etc/openvpn/Id2ndR.crt
root@OpenWrt:~# vi /etc/openvpn/Id2ndR.key
root@OpenWrt:~# uci set openvpn.custom_config.enabled=1
root@OpenWrt:~# uci commit
root@OpenWrt:~# /etc/init.d/openvpn start
root@OpenWrt:~# logread
[..]
Sat Dec 6 19:35:15 2014 daemon.warn openvpn(custom_config)[25584]: WARNING: file '/etc/openvpn/Id2ndR.key' is group or others accessible
Sat Dec 6 19:35:15 2014 daemon.notice netifd: Interface 'wan_vpn' is disabled
Sat Dec 6 19:35:15 2014 daemon.notice openvpn(custom_config)[25584]: Socket Buffers: R=[163840->131072] S=[163840->131072]
Sat Dec 6 19:35:15 2014 daemon.notice openvpn(custom_config)[25584]: UDPv4 link local: [undef]
Sat Dec 6 19:35:15 2014 daemon.notice openvpn(custom_config)[25584]: UDPv4 link remote: [AF_INET]91.224.149.109:1195
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
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
Sat Dec 6 19:35:15 2014 daemon.notice openvpn(custom_config)[25584]: VERIFY OK: depth=0, CN=id2ndr.toulan.fr
Sat Dec 6 19:35:16 2014 daemon.notice openvpn(custom_config)[25584]: Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
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
Sat Dec 6 19:35:16 2014 daemon.notice openvpn(custom_config)[25584]: Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
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
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
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
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: SENT CONTROL [id2ndr.toulan.fr]: 'PUSH_REQUEST' (status=1)
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'
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: OPTIONS IMPORT: timers and/or timeouts modified
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: OPTIONS IMPORT: --ifconfig/up options modified
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: OPTIONS IMPORT: route options modified
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: TUN/TAP device tun0 opened
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: TUN/TAP TX queue length set to 100
Sat Dec 6 19:35:18 2014 daemon.notice openvpn(custom_config)[25584]: do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
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
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
</pre>
Résultats :
* j'ai mesuré environ 70% d'utilisation CPU sur le routeur pour faire passer 17 méga. Ceci est cohérent avec [[Benchmark_VPN]].
* 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)
h2. Raspberry Pi
Objectifs :
* Transformer le rPi en routeur, avec comme interface de sortie vers Internet un appareil en usb, et comme interface LAN, le port ethernet
* Encapsuler la connexion des clients sur le LAN dans le VPN
* Faire du filtrage pour choisir explicitement quoi router dans le VPN, et quoi faire passer en direct
h3. Routage
* Configurer l'interface ethernet en hotplug, avec une IP fixe
* 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)
* Activer l'ip forward sur le rPi
h3. OpenVPN
* Installer le paquet openvpn.
* Recopier la conf (4 fichier) dans /etc/openvpn
* Redémarrer le service
TODO : tester 2 connexions VPN en //, pour éventuellement faire du bounding (si FreeMobile limite le débit vers tetaneutral par flux)
TODO : mettre en place de l'IPv6
h3. Routage sélectif
TODO : avec iproute2
h3. Routage
* Nat via le VPN : inspiré de http://wiki.openwrt.org/doc/howto/vpn.server.openvpn.tun Use-Case 3
** Dans Luci, Network > Interfaces : créer une interface nommée wan_vpn exploitant l'interface tun0, en client dhcp
** Dans Luci, Network > Firewall : créer une zone wan_vpn avec l'interface wan_vpn en activant Masquerading
** Dans Luci, Network > Firewall : supprimer la zone lan existante. Créer la zone lan avec le forward vers la zone wan_vpn
** 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)
Résultats :
* Le VPN ajoute en général 20-25ms par rapport à une route directe (vers un autre site que tetaneutral).
* Le VPN ne réduit pas le débit par rapport à la connexion hors VPN.
* La VoIP (SIP) fonctionne très bien via le VPN
Limites :
* Pour les jeux en ligne, on tourne autour de 100-105ms de ping avec le VPN contre 80ms en connexion direct.
* Pas de sélection des flux à faire passer dans le VPN, et ceux à faire passer directement en 4G :
** 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
** 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
** La table de routage du noyau linux ne permet pas de définir plusieurs passerelles par défaut.
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é.