SwordArMor

Router son bloc IPv6 /48 pour ses VMs chez online.net

Jusqu’à aujourd’hui je n’utilisais qu’une IPv6 chez online, tout tournait sur la même machine. Puis, je me suis dit que ça serait pas mal de séparer un peu les choses, simplement parce que je ne savais pas le faire.
Je suis parti sur des containers LXC. Alors oui, je sais, ce n’est pas le plus sécurisé et tout, mais là le but pour moi est juste de connaître les bases (surtout au niveau réseau), pas de faire un truc qui résistera à des attaques que je ne subis pas. Au passage, le fait de faire des containers m’évite la surcouche matérielle pour chaque machine, mon serveur n’aurait pas résisté.

Histoire de ne pas faire trop compliqué je ne vais utiliser que deux machines pour cet exemple : la machine physique est ginette et le container LXC est rodolphe.
Configuration IP de ginette avant toute modification :


root@ginette:~# ip addr show 
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
   link/ether c8:0a:a9:03:3c:8f brd ff:ff:ff:ff:ff:ff
   inet 195.154.116.3/24 brd 195.154.116.255 scope global eth0
       valid_lft forever preferred_lft forever
   inet6 2001:bc8:3c56:100::1/56 scope global 
       valid_lft forever preferred_lft forever
   inet6 fe80::ca0a:a9ff:fe03:3c8f/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1:  mtu 1500 qdisc noop state DOWN group default qlen 1000
   link/ether c8:0a:a9:03:3c:90 brd ff:ff:ff:ff:ff:ff
root@ginette:~# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp

iface eth0 inet6 static
	address 	2001:bc8:3c56:100::1
	netmask		56
	accept_ra	1
	pre-up /sbin/dhclient -1 -v -pf /run/dhclient6.eth0.pid -lf /var/lib/dhcp/dhclient6.eth0.leases -cf /etc/dhcp/dhclient6.conf -6 -P eth0
	pre-down /sbin/ip -6 addr del 2001:bc8:3c56:100::1/56 dev eth0
La ligne pre-up dans /etc/network/interfaces vient du wiki online. Je ne m’attarderai pas dessus, je vous conseille de le lire pour savoir comment générer vos DIUD et comment configurer votre machine.
Comme vous pouvez le voir, j’ai délégué tout un /56 (et non un /64) à ma machine, afin de pouvoir le découper en différents /64 plus proprement par la suite.

Comme je compte faire du LXC, ça peut être bien de l’installer : apt-get install lxc, on vérifie ensuite qu’il y a tout ce qu’il faut sur la machine avec lxc-checkconfig et pour finir on crée un container avec MIRROR=http://mirrors.online.net/debian lxc-create -n rodolphe -t debian -- -r wheezy
À ce moment, il peut être intéressant de savoir ce que LXC fait au niveau réseau.


root@ginette:~# ip addr show 
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether c8:0a:a9:03:3c:8f brd ff:ff:ff:ff:ff:ff
    inet 195.154.116.3/24 brd 195.154.116.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2001:bc8:3c56:100::1/56 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::ca0a:a9ff:fe03:3c8f/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1:  mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether c8:0a:a9:03:3c:90 brd ff:ff:ff:ff:ff:ff
4: lxcbr0:  mtu 1500 qdisc noqueue state UP group default 
    link/ether fe:38:cd:72:d6:e5 brd ff:ff:ff:ff:ff:ff
    inet 10.0.3.1/24 brd 10.0.3.255 scope global lxcbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::fc38:33ff:fee1:275f/64 scope link 
       valid_lft forever preferred_lft forever
8: vethBCTHMQ:  mtu 1500 qdisc pfifo_fast master lxcbr0 state UP group default qlen 1000
    link/ether fe:38:cd:72:d6:e5 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc38:cdff:fe72:d6e5/64 scope link 
       valid_lft forever preferred_lft forever
En voyant cela je me dis que lxcbr0 sert d’interface entre le réseau physique et le réseau LXC, je décide donc d’y ajouter la première IPv6 d’un /64 découlant de mon /56 : ip -6 addr add 2001:bc8:3c56:101::1/64 dev lxcbr0.
Ensuite, je me mets dans mon container et je lui attribue l’IP suivante et je configure la route par défaut :

root@rodolphe:~# ip -6 addr add 2001:bc8:3c56:101::2/64 dev eth0
root@rodolphe:~# ip -6 route add default via 2001:bc8:3c56:101::1 dev eth0
root@rodolphe:~# root@rodolphe:~# ping6 2001:bc8:3c56:101::1
PING 2001:bc8:3c56:101::1(2001:bc8:3c56:101::1) 56 data bytes
64 bytes from 2001:bc8:3c56:101::1: icmp_seq=1 ttl=64 time=0.090 ms
64 bytes from 2001:bc8:3c56:101::1: icmp_seq=2 ttl=64 time=0.116 ms
64 bytes from 2001:bc8:3c56:101::1: icmp_seq=3 ttl=64 time=0.116 ms
^C
--- 2001:bc8:3c56:101::1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.090/0.107/0.116/0.014 ms
Le ping6 est là uniquement pour m’assurer que j’ai ajouté l’IPv6 sur la bonne interface de la machine physique, il semblerait que oui.
À ce moment, tout le monde est près à communiquer en IPv6, il ne reste plus qu’à activer le routage sur la machine physique : sysctl net.ipv6.conf.all.forwarding=1
Sauf qu’en activant le routage on ignore les RA des routeur d’online et on ne peut plus joindre notre machine en IPv6. Il faut alors forcer la prise en compte des RA malgré l’activation du routage : sysctl net.ipv6.conf.eth0.accept_ra=2
Et là normalement vous devriez pouvoir joindre votre container en IPv6 et également sortir en IPv6 depuis ce container :

alarig@pikachu ~ $ traceroute6 rodolphe.swordarmor.fr 
traceroute to rodolphe.swordarmor.fr (2001:bc8:3c56:101::2), 30 hops max, 80 byte packets
 1  drscott.swordarmor.fr (2001:470:1f13:138::1)  0.183 ms  0.166 ms  0.151 ms
 2  alarig-1.tunnel.tserv10.par1.ipv6.he.net (2001:470:1f12:138::1)  67.437 ms  70.337 ms  72.927 ms
 3  ge2-3.core1.par1.he.net (2001:470:0:7b::1)  73.396 ms  73.390 ms  73.457 ms
 4  10ge9-1.core1.par2.he.net (2001:470:0:1b0::2)  74.513 ms  74.502 ms  74.496 ms
 5  online.equinix-ix.fr (2001:7f8:43::1:2876:1)  113.226 ms  113.185 ms  113.190 ms
 6  2001:bc8:0:1::45 (2001:bc8:0:1::45)  75.511 ms  75.132 ms  73.964 ms
 7  2001:bc8:0:1::76 (2001:bc8:0:1::76)  73.343 ms  27.323 ms  21.447 ms
 8  ginette.swordarmor.fr (2001:bc8:3c56:100::1)  21.341 ms  21.320 ms  21.294 ms
 9  rodolphe.swordarmor.fr (2001:bc8:3c56:101::2)  21.269 ms  21.390 ms  21.272 ms

root@rodolphe:~# traceroute6 pokedex.swordarmor.fr
traceroute to pokedex.swordarmor.fr (2001:470:1f13:138:715d:2fa0:b591:532f), 30 hops max, 80 byte packets
 1  2001:bc8:3c56:101::1 (2001:bc8:3c56:101::1)  0.124 ms  0.074 ms  0.066 ms
 2  2001:bc8:2::2:125:1 (2001:bc8:2::2:125:1)  0.986 ms  0.970 ms  0.940 ms
 3  2001:bc8:0:1::79 (2001:bc8:0:1::79)  0.974 ms  1.244 ms  1.251 ms
 4  2001:bc8:0:1::1 (2001:bc8:0:1::1)  1.092 ms  0.996 ms  0.927 ms
 5  he.franceix.net (2001:7f8:54::10)  0.700 ms  0.660 ms  0.881 ms
 6  10ge3-1.core1.par1.he.net (2001:470:0:1b0::1)  0.896 ms  0.968 ms  0.912 ms
 7  tserv1.par1.he.net (2001:470:0:7b::2)  3.772 ms  6.530 ms  9.269 ms
 8  alarig-1-pt.tunnel.tserv10.par1.ipv6.he.net (2001:470:1f12:138::2)  24.777 ms  24.680 ms  18.963 ms
 9  bulbizarre.swordarmor.fr (2001:470:1f13:138:715d:2fa0:b591:532f)  18.843 ms  18.742 ms  18.344 ms

Maintenant, il faut mettre cette configuration dans les fichiers pour que ça résiste au reboot.
Dans le container c’est très simple :


root@rodolphe:~# cat /etc/network/interfaces 
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
iface eth0 inet6 static
	address	2001:bc8:3c56:101::2
	netmask	64
	up	ip -6 route add default via 2001:bc8:3c56:101::1 dev eth0
	down	ip -6 route del default via 2001:bc8:3c56:101::1 dev eth0
Ça se corse un peu pour la machine physique. Il faut d’abord ajouter net.ipv6.conf.all.forwarding=1 à /etc/sysctl.conf.
Ensuite, il faut modifier un peu le fichier /etc/network/interfaces afin d’ajouter l’IP à l’interface LXC et de quand même recevoir les RA :

root@ginette:~# cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp

iface eth0 inet6 static
	address 	2001:bc8:3c56:100::1
	netmask		56
	accept_ra	2
	pre-up		/sbin/dhclient -1 -v -pf /run/dhclient6.eth0.pid -lf /var/lib/dhcp/dhclient6.eth0.leases -cf /etc/dhcp/dhclient6.conf -6 -P eth0
	up		ip -6 addr add 2001:bc8:3c56:101::1/64 dev lxcbr0
	pre-down	/sbin/ip -6 addr del 2001:bc8:3c56:100::1/56 dev eth0

Je n’ai volontairement pas fait de RA sur mon réseau interne parce que je sais déjà comment on fait, mais ça aurait parfaitement pu être possible.