IPv6 et l'UniGE
Nous sommes encore en phase de test, prière de ne monter pour l'instant que des serveurs de test en IPv6.Structure IPv6
de 32 bits à 128 bits (129.194.16.54 à 2001:620:600:100:8484:d172:25ab:585c)
Avant tout, télécharger le cheat sheet sur ipv6, imprimez-le et affichez-le!bon la couleuvre est pas facile à passer.
décortiquons notre adresse IPv6 en trois partie: le préfixe global de routage, l'identifiant de sous-réseau, l'identifiant d'interface
- le préfixe global de routage (global routing prefix) est composé des 3 premiers champs (2001:620:600:1000:8484:d172:25ab:585c)
- 2001:620:600:... correspond au préfixe qui identifie le réseau public de l'uni: visible depuis l'extérieur
- fd69:620:600:... correspond au préfixe qui identifie le réseau privé de l'uni.
- l'identifiant de sous-réseau (subnet id) qui correspond au 4ème champs (2001:620:600:1000:8484:d172:25ab:585c)
- A l'uni, l'identifiant de sous-réseau des adresses IPv6 est construit depuis celui en IPv4
- 1000 est déterminé de la manière suivante: de l'adresse 129.194.16.54/22, on cherche la première adresse de ce sous réseau: 129.194.16.0. Puis on retire 129.194 qui correspond au préfixe de l'uni. Dès lors il ne nous que: 16.00. Puis on retranscrit 16.00 en hexa soit 10 pour 16 et 00 pour 00.
- un autre exemple pour illustré le calul: l'observatoire de Genève 129.194.64.78/30 la première ip est 129.194.64.0 donc la partie sous-réseau vaudra: 40 pour 64 et 00 pour 00, soit 2001:620:600:4000::/64
- l'identifiant d'interface est composé des 4 derniers champs (2001:620:600:1000:8484:d172:25ab:585c)
- le nombre d'ip disponible sur 4 champs est de (16⁴)⁴ ou 2¹⁶ soit 1.844674407×10¹⁹.
- Privacy Extension" (RFC 4941) permet d'avoir une adresse ip qui change au cours du temps
- Pour les PC de bureau, nous recommandons fortement d'activer l'extension IPv6 "Privacy Extension" (RFC 4941), qui est activé par défaut sur la ubuntu 12.04 à travers le fichier (/etc/sysctl.d/10-ipv6-privacy.conf). En activant cette extension vous aurez sur votre machine autant une adresse IPv6 construite depuis votre mac adresse qu'une aléatoire. Mais avec cette activation, le noyau choisira par défaut l'aléatoire :). Pour mieux comprendre vos interfaces, préférez ip à ifconfig en tapant : "ip addr show"
- Pour les serveurs, il faut la désactiver avec
cat > /etc/sysctl.d/60-ipv6-privacy-disabled.conf << EOF # IPv6 Privacy Extensions (RFC 4941) # --- # This rules overwrite the one in /etc/sysctl.d/10-ipv6-privacy.conf net.ipv6.conf.all.use_tempaddr = 0 net.ipv6.conf.default.use_tempaddr = 0 EOF
- Dès lors, l'identifiant d'interface est construit depuis l'adresse mac (RFC 4291 Appendix A)
- Au vu du nombre d'adresse IP à disposition pour un sous réseau 2¹⁶
- le risque de collision que deux machines prennent la même adresse est très très...très improbable.
- la recherche d'une machine sur le réseau en scannant une à une les adresses devient impossible
Écriture d'une adresse IPv6
- Une adresse IPv6 est construit de 8 champs, chacun séparé par un ":"
- Chaque champs est composé de 4 chiffres hexadécimal
- les 0 sur la gauche peuvent être omis
- 0034 peut être écrit 34
- 000f en f
- 0100 en 100
- si certains champs sont composés de 0000 on peut les contracter une seul fois par un "::"
- 2001:0000:0000:1000:0000:0000:0000:0001 peut s'écrire 2001:0:0:620:600:1000::1
- 2001:0000:0000:1000:0000:0000:0000:0001 ne peut pas s'écrire 2001::1000:0:0:0:1
- 2001:0000:0000:1000:0000:0000:0000:0001 ne peut pas s'écrire 2001::1000::1 car il ne peut y avoir qu'un seul "::"
Type d'adresse IPv6 (IPv6 address Scopes)
Les adresses IPv6 sont découpées en morceau pour permettre certaine spécificité: (Une jolie référence à ce sujet)- address ip non-spécifiée : utilisé comme route par défaut et pour les soliciations du routeur, ex: 0.0.0.0 en IPv6
- ::/128
- adresse de boucle (localhost) : ex: 127.0.0.1 en IPv4
- ::1/128
- lien locale : adresse autoconfigurée et non-routable utilisé sur le LAN qui permet d'atteindre toutes les machines sur le même réseau
- fe80::/10
- site locale (sous-réseau privé de l'uni)
- fd69:620:600::/48
- sous-réseau public de l'uni
- 2001:620:600::/48
- 2000::/3 : adresse ip globale
- ff00::/8 multicast
Configuration
Poste de Travail
Pour les machines de bureau, rien est à faire puisque le NetworkManager prends la main et que IPv6 y est activé par défaut.Suis-je en IPv6
Pour savoir si la machine sur laquelle, nous nous trouvons est correctement configuré en IPv6, il suffit d'aller sur http://test-ipv6.com/Serveur Public
Dans ce cas, il faut activer ipv6 dans /etc/network/interfaces, à l'aide deiface eth0 inet6 auto
dont voici un example
# 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 #iface lo inet6 loopback # The primary network interface auto eth0 iface eth0 inet6 auto iface eth0 inet static address 129.194.11.5 netmask 255.255.255.0 network 129.194.11.0 broadcast 129.194.11.255 gateway 129.194.11.1 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 129.194.4.6 129.194.8.7 129.194.4.32 dns-search unige.ch
puis on lit l'adresse crée automatiquement
ip addr show | sed 's|^| # |' # 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN # link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 # inet 127.0.0.1/8 scope host lo # inet6 ::1/128 scope host # valid_lft forever preferred_lft forever # 3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 1000 # link/ether 00:50:56:90:22:f4 brd ff:ff:ff:ff:ff:ff # inet 129.194.11.5/24 brd 129.194.11.255 scope global eth0 # inet6 fd69:620:600:b00:250:56ff:fe90:22f4/64 scope global dynamic # valid_lft 2591873sec preferred_lft 604673sec # inet6 2001:620:600:b00:250:56ff:fe90:22f4/64 scope global dynamic # valid_lft 2591873sec preferred_lft 604673sec # inet6 fe80::250:56ff:fe90:22f4/64 scope link # valid_lft forever preferred_lft forever
et on voit que nous avons deux adresses ipv6 une en global (publique, commençant par 2001:), une autre en site-local (privé, commençant en fd69:), plus un lien-local commençant en (fe80)
Serveur Privé
Dans ce cas, il faut prendre une adresse privée, et pour éviter des collisions on la construit à l'aide de EUI-64. Pour ne pas se fatiguer à la calculer, on passe temporairement la machine en ip publique (comme ci-dessus), et on récupère l'ip privée:# ... # inet6 fd69:620:600:b00:250:56ff:feb6:778a/64 scope global dynamic # ...
puis on l'insère dans interfaces en spécifiant aussi le gateway, qui est le premier élémenet dans le sous-reseau fd69:620:600:b00::1
# 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 auto eth0 allow-hotplug eth0 iface eth0 inet static address 10.194.11.4 netmask 255.255.255.0 network 10.194.11.0 broadcast 10.194.11.255 gateway 10.194.11.1 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 129.194.4.6 129.194.8.7 129.194.4.32 dns-search unige.ch iface eth0 inet6 static address fd69:620:600:b00:250:56ff:feb6:778a netmask 64 gateway fd69:620:600:b00::1 # The primary network interface
Route par défaut (Neighbor Discovery "ND")
En IPv6 la configuration de la route par défaut ce fait par le Neighbor Discovery. Pour cela aucune configuration sur le poste n'est nécessaire, cela s'effectue automatiquement.DHCP or not DHCP
L'impression que je retire de mon utilisation d'IPv6 est que le DHCP n'est plus utile pour les raisons suivantes sur les postes de travail:- "Privacy Extension" (RFC 4941) qui protège la sphère privée des internautes
- Pas de risques de collision d'adresse ip au vu du nombre d'ip possible par sous réseau 2¹⁶ ou 1.844674407×10¹⁹
- Plus besoin d'informer le client sur la route par défaut. Ceci est dorénavant opéré par Neighbor Discovery)
- Les adresse NTP définie de base à l'adresse
- ff0X::101, dans notre cas, ff05::101
- plus d'info sur le cheat sheet section : Well Known Multicast Addresses
- DNS offert bientôt par le "Router Advertisement" pour les DNS décrit par la (RFC 6106)
Outils
certains outils s'utilisent d'une autre manière pour tenir compte d'IPv6netstat
Ne pas oublier de mettre l'option -W pour wide afin de ne pas tronquer la sortie de netstat. Car sinon vos adresses ip seront coupéesip (au lieu de ifconfig)
D'après ce que j'ai lu, il faut préférer la commande ip à ifconfig. Quelques reférences (ifconfig vs ip, man ip)route
ajouter l'option -6ip6tables (au lieu d'iptables)
Je vous présente le jeux d'instructions que je mets dans:- /etc/network/if-pre-up.diptables-up
#!/bin/bash # IPv4 --------------------------------------------- # Flush all /sbin/iptables -P INPUT ACCEPT /sbin/iptables -P OUTPUT ACCEPT /sbin/iptables -F /sbin/iptables -X # Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0` /sbin/iptables -A INPUT -i lo -j ACCEPT /sbin/iptables -A INPUT -d 127.0.0.0/8 ! -i lo -j REJECT --reject-with icmp-port-unreachable # Accepts all established connections /sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT /sbin/iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # Accepts all outbound connections /sbin/iptables -A OUTPUT -m state --state NEW -j ACCEPT # allow ping /sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # BEGIN SPECIFIC # allow web /sbin/iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT -m comment --comment "http" /sbin/iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT -m comment --comment "https" # allow ssh for people /sbin/iptables -A INPUT -s 129.194.16.54 -p tcp --dport 22 -m state --state NEW -m comment --comment "ssh Cedric.Briner" -j ACCEPT /sbin/iptables -A INPUT -s 10.194.17.10 -p tcp --dport 22 -m state --state NEW -m comment --comment "ssh Dominique.Petipierre\'" -j ACCEPT /sbin/iptables -A INPUT -s 10.194.17.9 -p tcp --dport 22 -m state --state NEW -m comment --comment "ssh Dominique.Petipierre.2" -j ACCEPT /sbin/iptables -A INPUT -s 129.194.17.66 -p tcp --dport 22 -m state --state NEW -m comment --comment "ssh Pierre.Pasche" -j ACCEPT # allow hobbit /sbin/iptables -A INPUT -s 10.0.0.0/8 -p tcp -m tcp --dport 1984 -m state --state NEW -j ACCEPT -m comment --comment "hobbit" /sbin/iptables -A INPUT -s 129.194.0.0/16 -p tcp -m tcp --dport 1984 -m state --state NEW -j ACCEPT -m comment --comment "hobbit" # END SPECIFIC # enforce the policy /sbin/iptables -P INPUT DROP /sbin/iptables -P OUTPUT DROP /sbin/iptables -P FORWARD DROP # IPv6 --------------------------------------------- # Flush all /sbin/ip6tables -P INPUT ACCEPT /sbin/ip6tables -P OUTPUT ACCEPT /sbin/ip6tables -F /sbin/ip6tables -X # allow all stream related to an accepted session /sbin/ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT /sbin/ip6tables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # allow all new connection from this host /sbin/ip6tables -A OUTPUT -m state --state NEW -j ACCEPT # Disable processing of any RH0 packet # Which could allow a ping-pong of packets # http://www.sixxs.net/wiki/IPv6_Firewalling /sbin/ip6tables -A INPUT -m rt --rt-type 0 -j DROP /sbin/ip6tables -A OUTPUT -m rt --rt-type 0 -j DROP /sbin/ip6tables -A FORWARD -m rt --rt-type 0 -j DROP # Allow anything on the loopback /sbin/ip6tables -A INPUT -i lo -j ACCEPT /sbin/ip6tables -A OUTPUT -o lo -j ACCEPT # Allow Link-Local addresses /sbin/ip6tables -A INPUT -s fe80::/10 -j ACCEPT /sbin/ip6tables -A OUTPUT -s fe80::/10 -j ACCEPT # Allow ICMPv6 /sbin/ip6tables -A INPUT -p icmpv6 -j ACCEPT /sbin/ip6tables -A OUTPUT -p icmpv6 -j ACCEPT # BEGIN SPECIFIC # allow web /sbin/ip6tables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT -m comment --comment "http" /sbin/ip6tables -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT -m comment --comment "https" # allow hobbit /sbin/ip6tables -A INPUT -s fd69:620:600::/32 -p tcp -m tcp --dport 1984 -m state --state NEW -j ACCEPT -m comment --comment "hobbit" /sbin/ip6tables -A INPUT -s 2001:620:600::/32 -p tcp -m tcp --dport 1984 -m state --state NEW -j ACCEPT -m comment --comment "hobbit" # allow ssh for people /sbin/ip6tables -A INPUT -p tcp -s 2001:620:600:1000::/64 --dport 22 -m state --state NEW -j ACCEPT -m comment --comment "ssh" # END SPECIFIC # logging #-A INPUT -p ipv6-icmp -j LOG --log-prefix "Dropped ICMPv6 Packets" # enforce the policy /sbin/ip6tables -P INPUT DROP /sbin/ip6tables -P OUTPUT DROP /sbin/ip6tables -P FORWARD DROP
- /etc/network/if-post-down.d/iptables-down
#!/bin/bash # IPv4 --------------------------------------------- /sbin/iptables -P INPUT ACCEPT /sbin/iptables -P OUTPUT ACCEPT /sbin/iptables -F /sbin/iptables -X # IPv6 --------------------------------------------- /sbin/ip6tables -P INPUT ACCEPT /sbin/ip6tables -P OUTPUT ACCEPT /sbin/ip6tables -F /sbin/ip6tables -X
ping6 (au lieu de ping)
pour "pinger" www.google.comroot@unixmaster1204:~# ping6 2a00:1450:4001:c01::67 # PING 2a00:1450:4001:c01::67(2a00:1450:4001:c01::67) 56 data bytes # 64 bytes from 2a00:1450:4001:c01::67: icmp_seq=1 ttl=52 time=17.4 ms # 64 bytes from 2a00:1450:4001:c01::67: icmp_seq=2 ttl=52 time=16.5 ms # ^C # --- 2a00:1450:4001:c01::67 ping statistics --- # 2 packets transmitted, 2 received, 0% packet loss, time 1001ms # rtt min/avg/max/mdev = 16.549/17.024/17.499/0.475 ms
dig (au lieu de nslookup)
dig est un outil qui permet d'interroger les DNS. Je vous conseille de lire le howto de madboa qui en vaut la peine.les adresse IPv6 ne sont pas des A records mais des AAAA records.
dig AAAA www.google.com +short # www.l.google.com. # 2a00:1450:4001:c01::67
firefox
pour insérer une ipv6 il faut mettre des crochets [ ipv6 ] exemple avec google, dès lors pour atteindre 2a00:1450:4001:c01::67 dans firefox, il faut mettre dans la barre d'adresse[2a00:1450:4001:c01::67]
Diagnostic de pannes
Route par défaut opérationnel ?
Afin de pouvoir sortir de notre sous-réseau LAN, il faut avoir une route par défaut, et cette dernière doit-être accessible. Pour ce faire, faites les tests suivants :- ping du localhost
ping6 ::1 # PING ::1(::1) 56 data bytes # 64 bytes from ::1: icmp_seq=1 ttl=64 time=0.035 ms # 64 bytes from ::1: icmp_seq=2 ttl=64 time=0.043 ms # ^C # --- ::1 ping statistics --- # 2 packets transmitted, 2 received, 0% packet loss, time 999ms # rtt min/avg/max/mdev = 0.035/0.039/0.043/0.004 ms
- ping de notre IP sur le lien-local
# trouvons notre adresse IP en lien-locale ip addr show | grep fe80 # inet6 fe80::250:56ff:fe90:22f4/64 scope link ping6 fe80::250:56ff:fe90:22f4 # connect: Invalid argument # en spécifiant l'interface, tout marche ping6 -I eth0 fe80::250:56ff:fe90:22f4 # PING fe80::250:56ff:fe90:22f4(fe80::250:56ff:fe90:22f4) from fe80::250:56ff:fe90:22f4 eth0: 56 data bytes # 64 bytes from fe80::250:56ff:fe90:22f4: icmp_seq=1 ttl=64 time=0.030 ms # 64 bytes from fe80::250:56ff:fe90:22f4: icmp_seq=2 ttl=64 time=0.052 ms # ^C # --- fe80::250:56ff:fe90:22f4 ping statistics --- # 2 packets transmitted, 2 received, 0% packet loss, time 999ms # rtt min/avg/max/mdev = 0.030/0.041/0.052/0.011 ms
- ping sur notre route par défaut
# trouvons notre route par défaut route -n6 # Kernel IPv6 routing table # Destination Next Hop Flag Met Ref Use If # 2001:620:600:b00::/64 :: UAe 256 0 0 eth0 # fd69:620:600:b00::/64 :: UAe 256 0 0 eth0 # fe80::/64 :: U 256 0 0 eth0 #X# ::/0 fe80::5:73ff:fea0:96 UGDAe 1024 0 0 eth0 # ::/0 :: !n -1 1 2477 lo # ::1/128 :: Un 0 1 174 lo # 2001:620:600:b00:250:56ff:fe90:22f4/128 :: Un 0 11383623 lo # fd69:620:600:b00:250:56ff:fe90:22f4/128 :: Un 0 1 0 lo # fe80::250:56ff:fe90:22f4/128 :: Un 0 1 5669 lo # ff00::/8 :: U 256 0 0 eth0 # ::/0 :: !n -1 1 2477 lo # notre route est celle avec le X en préfixe. On peut aussi la trouver avec un grep route -n6 | grep G # ::/0 fe80::5:73ff:fea0:96 UGDAe 1024 0 0 eth0 # pingons notre route par défaut ping6 -I eth0 fe80::5:73ff:fea0:96 # PING fe80::5:73ff:fea0:96(fe80::5:73ff:fea0:96) from fe80::250:56ff:fe90:22f4 eth0: 56 data bytes # 64 bytes from fe80::5:73ff:fea0:96: icmp_seq=1 ttl=64 time=0.454 ms # 64 bytes from fe80::5:73ff:fea0:96: icmp_seq=2 ttl=64 time=0.572 ms # ^C # --- fe80::5:73ff:fea0:96 ping statistics --- # 2 packets transmitted, 2 received, 0% packet loss, time 999ms # rtt min/avg/max/mdev = 0.454/0.513/0.572/0.059 ms
A-t-on une résolution de nom délivrant des adresse en IPv6
- Pour les impatients:
On remarque que host délivre autant des adresses IPv4 que IPv6.host www.google.com # www.google.com is an alias for www.l.google.com. # www.l.google.com has address 173.194.32.81 # www.l.google.com has address 173.194.32.83 # www.l.google.com has address 173.194.32.84 # www.l.google.com has address 173.194.32.82 # www.l.google.com has address 173.194.32.80 # www.l.google.com has IPv6 address 2a00:1450:4001:c01::63
De plus, je recommande plutôt d'utiliser
getent hosts www.google.com 2a00:1450:4001:c01::63 www.l.google.com www.google.com
qui tiendra compte de la configuration de votre système (/etc/hosts, /etc/nsswitch.conf) pour vous afficher la même réponse retournée à vos applications. Car il arrive parfois que le DNS répondent correctement, mais que la configuration de votre machine fait qu'il ne tiendra pas compte de cette réponse (p.ex: le nom est redéfini dans /etc/hosts)
- Pour les vrais :)
# une requête pour connaître l'enregistrement A (IPv4) de www.google.com dig A www.google.com +short # www.l.google.com. # 173.194.32.84 # 173.194.32.81 # 173.194.32.83 # 173.194.32.80 # 173.194.32.82 # une requête pour connaître l'enregistrement AAAA (IPv6) de www.google.com dig AAAA www.google.com +short # www.l.google.com. # 2a00:1450:4001:c01::69