technique:serveurs

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Dernière révisionLes deux révisions suivantes
technique:serveurs [2013/11/27 14:02] – [Routage] gtomtechnique:serveurs [2015/01/17 18:31] silentt
Ligne 421: Ligne 421:
  
 </code> </code>
 +
 +==== Connectiivité IPv6 ====
 +
 +<note>Le but est de fournir une **connectivité IPv6** en sus de celle IPv4 à tous les abonnés du réseau Wifi de Chanteix. Cette documentation est reprise de celle de [[http://doc.rhizome-fai.net |Rhizome]] disponible sous licence 
 +[[https://creativecommons.org/licenses/by-nc-sa/3.0/|Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported (CC BY-NC-SA 3.0)]]. Merci à eux pour le travail et le partage =)</note>
 +
 +
 +=== Ressources et modèle d'adressage ===
 +Sur chaque ligne ADSL est routé par FDN un bloc IPv6 en /48. On veut redistribuer à chaque abonné un /56. 
 +
 +En pratique, l'abonné a donc la possibilité de définir 256 réseaux locaux /64 (taille standard) chez lui. Autrement dit chaque abonné a sa disposition 256 x 2^64 (4,722366483 trilliards) adresses Ipv6 ! 
 +
 +<note tip>**A voir: **Nos amis de [[http://ldn-fai.net/|LDN]] on mis en ligne [[http://ldn-fai.net/adressage-ipv6ipv4/|une conférence]] sur le découpage des blocs IPv4 et IPv6 qui on été mis à leur disposition par Gitoyen. Cette conférence technique revient sur l'adressage IPv4/IPv6 et sur quelques principes de base du fonctionnement d'un réseau IP </note>
 +
 +
 +Exemple avec 1 routeur sur lequel sont reliées 2 box abonnés.
 +<code>
 +
 +                                                     .-, ),-.     
 +                                                  .-(          )-.  
 +                                                 ( FDN -> internet )
 +                                                  '-(          ).-' 
 +                                                      '-.( ).-'     
 +                                                          |                                        
 +                                                          |route 2001:910:111e::/48                < (1*)
 +                                                          |
 +                                                     _____v____ 
 +       ROUTEUR MIASSOU                              [_...__...°]
 +                                                    /           \
 +                                                   /             \
 +      BACKBONE WIFI 5GHz                          /                                              < (2*)
 +      (transparent L2)                           /                                                   
 +                                                /                   \
 +                                               /                     \
 +                                              /route                  \route                  
 +                                             /80.67.180.5              \80.67.180.8           
 +                                            /2001:910:111e:500::/56     \2001:910:111e:800::/56
 +                                           /                             \
 +                                          /                               \
 +                                                                         v
 +        BOX ABONNES                   |_|_| Distribue en autoconf        |_|_| 
 +                                     [____°]2001:910:111e:501::/64     [____°]
 +                                     /    \
 +                                    /      \
 +                                   /        \                                                      < (3*)          
 +                              ____v          v____                                                                                       
 +   MACHINES FINALES          |    |          |    |
 +   (PC,smartphones)          |____|          |____|
 +                             /::::/          /::::/
 +                            
 +                 2001:910:111e:501:       2001:910:111e:501:                     
 +                 c2e7:65ff:fb4e:456b/64    f65e:3cff:feb4:613c/64                  
 +                                                                                   
 +</code>
 +
 +
 +=== Calcul des IPv6 ===
 +
 +
 +Une adresse IPv6 est découpée, pour Ilico, de la manière suivante : 
 +<code>
 + Le préfixe ammené sur chaque routeur par Gitoyen/FDN     <préfixe abonné> f(IPv4)                    laissé à l'abonné
 +|-------------------------------------------------------|-------------------------|---------------------------------------------|
 +                      48 bits                                 8 bits                                 72 bits
 +|-------------------------------------------------------------------------------------------------------------------------------|
 +                                                        Adresse IPv6 128 bits
 +</code>
 +
 +
 +On calcule le numéro du bloc IPv6 de chaque abonné en fonction de son IPv4. 
 +
 +Le bloc IPv6 est calculé depuis l'adresse IPv4 de l'abonné. Si, l'abonné a reçu l'adresse A.B.C.D. Son identifiant sur 8 bits sera D.
 +<note warning>Cela ne fonctionne et permet d'avoir une adresse unique que parce que chaque routeur ne gère que des blocs IPv4 de taille inférieure à un /24 (255 adresses).
 +</note>
 +
 +== Exemple ==
 +
 +  * Un routeur Rhizome gère les ressources suivantes  :
 +    *// 2001:910:111e::/48//
 +    * //1.2.3.0/24//
 +  * Un abonné Ilico reçoit l'adresse //1.2.3.**4**//
 +
 +Le bloc délégué à l'abonné sera donc //2001:910:111e:**04**00::/56//
 +
 +
 +=== Configuration des routes et adresses ===
 +
 +L'objectif ici est de rester dans une facilité que nous avons actuellement avec la configuration IPv4 : les box sont interchangeables et ne possèdent aucune configuration statique spécifique à un routeur en particulier (ce qui permet de déplacer/remplacer les box facilement). Doivent donc être configurés automatiquement : 
 +
 +  * Le bloc attribué à la box
 +  * La route par défaut vers internet
 +  * Les serveurs DNS
 +
 +En IPv6, l'**autoconfiguration sans état** est le maitre mot… Cependant il existe un protocole DHCPv6 pouvant réaliser de l'attribution de préfixes (blocs) et d'adresses.
 +
 +|                         ^ Attribution d'adresse                                                                        ^ Délégation de préfixe (bloc)  ^ Anonce de route par défaut((ou de route tout court d'ailleurs…))  ^
 +^  Autoconfiguration IPv6 |                       ✔ ((calculé depuis l'adresse mac  ou aléatoire))                                     ✔                                               ✘                                 |
 +^                  DHCPv6 |  ✔ ((aléatoire, dans un pool ou associé à l'@mac comme en DHCPv4… Bref, selon le bon vouloir de l'administrateur, le bloc étant géré côté serveur DHCPv6 et non de manière décentralisée comme avec l'autoconfiguration))  |               ✘                                               ✔                                 |
 +
 +
 +
 +Si on veut faire de la délégation de préfixe, il nous faut soit utiliser une configuration statique soit **utiliser l'autoconfiguration et DHCPv6**. C'est ce que nous faisons.
 +
 +
 +=== Assignation d'une adresse à l'interface ===
 +
 +On assigne une adresse simplement à l'interface eth0 (côté abonné). On utilise l'adresse [[http://www.ietf.org/rfc/rfc2526.txt| IPv6-subnet-anycast]].
 +
 +<note tip>**L'adresse IPv6-subnet-anycast est la "zéroième" adresse d'un bloc**
 +
 +Par exemple, pour le bloc //2001:910:111e:800::/56//. Il s'agit de l'adresse //2001:910:111e:800:://. En IPv4, utiliser la zéroième adresse d'un bloc est interdit. En IPv6. C'est une adresse particulière //anycast// : elle peut-être attribuée à plusieurs machines : l'ensemble des routeurs du bloc concerné.</note>
 +
 +<file conf /etc/network/interfaces (extrait)>
 +# Reseau abonnes IPv6
 +iface eth0 inet6 static
 +        address 2001:910:111e::
 +        netmask 48
 +        # Configuration du pare-feu
 +        pre-up ip6tables-restore < /etc/ip6tables.up.rules # ipv6
 +        post-up IPv6_routes --enable # On crée les routes après que l'interface ait eu son IP
 +
 +</file>
 +
 +On redémarre l'interface :
 +<code bash>
 +ifdown eth0 ; ifup eth0
 +</code>
 +
 +=== Réception du préfixe via PPP ===
 +Il faut négocier le préfixe IPv6 avec [[http://en.wikipedia.org/wiki/Point-to-point_protocol#Automatic_self_configuration|IPv6CP]] (par défaut, PPP ne négocie qu'une adresse IPv4 avec [[http://en.wikipedia.org/wiki/Internet_Protocol_Control_Protocol|IPCP]]) et son routage avec le [[http://en.wikipedia.org/wiki/L2TP|LNS]] de FDN qui négocie la connexion.
 +
 +Rajouter la ligne suivante en fin de fichier : 
 +<file conf /etc/ppp/options (extrait)>
 +
 +# Support IPv6 (IPv6CP)
 +ipv6 ,
 +
 +</file>
 +
 +Puis redémarrer la connexion PPP :
 +<code>
 +poff dsl-provider ; pon dsl-provider
 +</code>
 +
 +=== Activation du routage ===
 +
 +En IPv6, une machine a soit un rôle d'//host//, soit un rôle de //routeur//, selon la valeur de la variable //net.ipv6.conf.all.forwarding//.
 +Avant tout, le routeur doit-être configuré, comme en IPv4 pour router les paquets IPv6 : 
 +
 +<file conf /etc/sysctl.conf>
 +  net.ipv6.conf.all.forwarding=1
 +</file>
 +
 +Puis pour recharger la conf sysctl
 +
 +<code bash>
 +sysctl -p
 +</code>
 +
 +=== Serveur DHCPv6 : dhcp6d ===
 +
 +Le serveur DHCPv6 s'occupe donc
 +  * **D'attribuer son bloc** à chaque box ([[http://tools.ietf.org/html/rfc3769|prefix-delegation]]) ;
 +  * **D'attribuer une adresse** à chaque routeur : l'adresse [[http://www.ietf.org/rfc/rfc2526.txt| IPv6-subnet-anycast]]
 +
 +<note tip>**L'adresse IPv6-subnet-anycast est la "zéroième" adresse d'un bloc**
 +
 +Par exemple, pour le bloc //2001:910:111e:800::/56//. Il s'agit de l'adresse //2001:910:111e:800:://. En IPv4, utiliser la zéroième adresse d'un bloc est interdit. En IPv6. C'est une adresse particulière //anycast// : elle peut-être attribuée à plusieurs machines : l'ensemble des routeurs du bloc concerné.</note>
 +
 +
 +== Installation  ==
 +On utilise le serveur WIDE-DHCPv6 du projet [[http://www.kame.net|kame]].
 +
 +<code bash>apt-get install wide-dhcpv6-server</code>
 +
 +== Configuration ==
 +Le fichier de configuration est à créer : 
 +
 +<file bash /etc/wide-dhcpv6/dhcp6s.conf>
 +# DNS, on refile l'IP des DNS de FDN
 +option domain-name-servers 2001:910:800::12;
 +
 +# Les attributions de blocs/adresses sont générées dans un fichier à part
 +# Ce fichier est généré automatiquement par un script "genDHCPv6conf"
 +include "/etc/wide-dhcpv6/ethers-v6";
 +
 +</file>
 +
 +Le fichier inclus ///etc/wide-dhcpv6/ethers-v6.conf// est généré par la commande "genDHCPv6conf" (disponible dans /opt/ilico-sysadmin/script/router/). Il est de la syntaxe suivante : 
 +
 +<file /etc/wide-dhcpv6/ethers-v6.conf/>
 +host 80.67.180.3 {
 +        duid 00:03:00:06:00:18:84:88:ac:63;
 +        prefix 2001:910:111e:300::/56 infinity;
 +        address 2001:910:111e:300:: infinity;
 +
 +};
 +</file>
 +
 +<note tip>Le [[http://tools.ietf.org/html/rfc6355|DUID (DHCPv6 Unique Identifier)]] identifie une machine de manière unique auprès du serveur IPv6.
 +
 +Une convention (utilisée pour nous) est de la dériver de l'adresse MAC ex : MAC //18:84:88:ac:63// -> DUID //00:03:00:06:**18:84:88:ac:63**//. ((//00:03:00:06// est une constante dépendant du type de medium sous-jacent à IP. Voir [[http://www.ietf.org/rfc/rfc3315.txt|RFC3315 section 6]])).
 +
 +On peut aussi bien entendu choisir des DUID arbitraires.
 +</note>
 +
 +<code bash>
 +# Mise à jour de la configuration de DHCPv6 :
 +genDHCPv6conf
 +service wide-dhcpv6-server restart
 +</code>
 +
 +=== Démon d'autoconfiguration (radvd) ===
 +
 +Le démon //radvd// installé sur le routeur a pour but de **distribuer la route par défaut**. Et c'est tout !
 +=== Installation ===
 +<code bash>
 +apt-get install radvd
 +</code>
 +
 +== Configuration ==
 +
 +Le fichier de configuration est simple : 
 +
 +<file conf /etc/radvd.conf>
 +interface eth0
 +{
 +# On envoie des RA (Router-Announce) en multicast
 +AdvSendAdvert on;
 +# Les RA sont envoyées avec une période comprise entre 3 et 5 secondes.
 +MaxRtrAdvInterval 5;
 +MinRtrAdvInterval 3;
 +AdvDefaultLifetime 60;
 +};
 +
 +</file>
 +
 +Dans notre fonctionnement, la box ne demande pas explicitement d'annonce de routeur, elle attend une annonce de la part du routeur qui **broadcast** périodiquement sa route. Aussi, on force des délais assez courts dans le fichiers de configuration précédent..
 +
 +On redémarre le service :
 +<code bash>
 +service radvd restart
 +</code>
 +
 +=== Firewall ===
 +Les règles de firewall sont les mêmes que pourla configuration IPv4.
 +
 +<file bash /etc/ip6tables.up.rules>
 +# /etc/ip6tables.up.rules
 +# Script qui démarre les règles de filtrage IPv6
 +# Formation Debian GNU/Linux par Alexis de Lattre
 +# http://formation-debian.via.ecp.fr/
 +
 +# iptables-restore(8) remet implicitement à zéro toutes les règles
 +# Les instructions qui suivent concernent la table « filter »,
 +# c'est-à-dire... le filtrage.
 +*filter
 +
 +#########################
 +# Politiques par défaut #
 +#########################
 +# Les politiques par défaut déterminent le devenir d'un paquet auquel
 +# aucune règle spécifique ne s'applique.
 +
 +# Les connexions entrantes sont bloquées par défaut
 +-P INPUT DROP
 +# Les connexions destinées à être routées sont refusées par défaut
 +-P FORWARD DROP
 +# Les connexions sortantes sont acceptées par défaut
 +-P OUTPUT ACCEPT
 +
 +######################
 +# Règles de filtrage #
 +######################
 +# Nous précisons ici des règles spécifiques pour les paquets vérifiant
 +# certaines conditions.
 +
 +# Pas de filtrage sur l'interface de "loopback"
 +-A INPUT -i lo -j ACCEPT
 +
 +## Règles relatives au routage ##
 +-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
 +-A FORWARD -i eth0 --source 2001:910:111e::/48 -j ACCEPT
 +-A FORWARD --destination 2001:910:111e::/48 -j ACCEPT
 +
 +## Règles relatives aux services ##
 +
 +# Accepter le protocole ICMPv6 (notamment le ping)
 +-A INPUT -p icmpv6 -j ACCEPT
 +
 +# Accepter les packets entrants relatifs à des connexions déjà
 +# établies : cela va plus vite que de devoir réexaminer toutes
 +# les règles pour chaque paquet.
 +-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
 +
 +# Accepter SSH de partout
 +-A INPUT -p tcp --dport ssh -j ACCEPT
 +-A INPUT -p tcp --dport http -j ACCEPT
 +
 +# Interface aircontrol en HTTPS
 +-A INPUT -p tcp --dport 9443 -j ACCEPT
 +-A INPUT -p tcp --dport 9080 -j ACCEPT
 +
 +# Webservices Ilico
 +-A INPUT -p tcp --dport 8080 -j ACCEPT
 +
 +# Accepter DNS depuis les IPs abonnés Ilico
 +-A INPUT -i eth0 -p tcp --dport domain --source 2001:910:111e::/48 -j ACCEPT
 +-A INPUT -i eth0 -p udp --dport domain --source 2001:910:111e::/48 -j ACCEPT
 +
 +# Accepter les requêtes/réponses DHCPv6
 +-A INPUT -i eth0 -p udp --dport dhcpv6-server --sport dhcpv6-client -j ACCEPT
 +
 +COMMIT
 +</file>
 +
 +Comme pour IPv4, on charge ces règles au démarrage de l'interface 
 + :
 +
 +<file conf /etc/network/interfaces (extrait)>
 +
 +# Reseau abonnes IPv6
 +iface eth0:abo6 inet6 static
 +        address 2001:910:111e::
 +        netmask 48
 +        # Configuration du pare-feu pour l'IPv6
 +        pre-up ip6tables-restore < /etc/ip6tables.up.rules # ipv6
 +        
 +
 +</file>
 +
 +Et pour les activer immédiatement (sans redémarrer) :
 +
 +<code>
 +sudo iptables-apply /etc/ip6tables.up.rules
 +</code>
 +
 +=== Routage des préfixes abonnés ===
 +
 +On a la route par défaut de la box vers le reste d'internet. Reste l'autre partie du routage : du routeur vers chaque box. Il faut indiquer vers quel routeur envoyé les paquets destinés à tel ou tel préfixe /56. **Cette partie n'est pas automatisée par la prefix-delegation**.
 +
 +Il faut donc générer un fichier de règles de routages à appliquer. 
 +
 +Le script est "IPv6_routes". Pour activer les routes, on fait "IPv6_routes --enable".
 +
 +Le script active les routes. On peut verifier la prise en compte des routes par la comande : 
 +
 +<code>route -A inet6</code>
 +
 +<code>
 +root@miassou:~# route -A inet6
 +Table de routage IPv6 du noyau
 +Destination                    Next Hop                   Flag Met Ref Use If
 +2001:910:111e:200::/56         2001:910:111e:200::        UG   1024 0     0 eth0
 +2001:910:111e:300::/56         2001:910:111e:300::        UG   1024 0     0 eth0
 +2001:910:111e:400::/56         2001:910:111e:400::        UG   1024 0     0 eth0
 +2001:910:111e:500::/56         2001:910:111e:500::        UG   1024 0     0 eth0
 +2001:910:111e:600::/56         2001:910:111e:600::        UG   1024 0     0 eth0
 +2001:910:111e:700::/56         2001:910:111e:700::        UG   1024 0     0 eth0
 +2001:910:111e:800::/56         2001:910:111e:800::        UG   1024 0     0 eth0
 +2001:910:111e:a00::/56         2001:910:111e:a00::        UG   1024 0     0 eth0
 +2001:910:111e::/48             ::                            1024 0     8 eth0
 +fe80::/64                      ::                            256 0     0 eth1
 +fe80::/64                      ::                            256 0     0 eth0
 +fe80::/64                      ::                            256 0     0 ppp0
 +fe80::/10                      ::                            1       0 ppp0
 +fe80::/10                      ::                            256 0     0 ppp0
 +::/0                           ::                            1024 0     0 ppp0
 +::/0                           ::                         !n   -1  1 24251 lo
 +::1/128                        ::                         Un      7568 lo
 +2001:910:111e::/128            ::                         Un        94 lo
 +fe80::/128                     ::                         Un         0 lo
 +fe80::/128                     ::                         Un         0 lo
 +fe80::/128                     ::                         Un         0 lo
 +fe80::225:22ff:fee4:6feb/128   ::                         Un         0 lo
 +fe80::5043:b11e:0:0/128        ::                         Un         0 lo
 +fe80::fad1:11ff:fe10:9001/128  ::                         Un      1346 lo
 +ff00::/                      ::                            256 0     0 eth1
 +ff00::/                      ::                            256 0     0 eth0
 +ff00::/                      ::                            256 0     0 ppp0
 +::/0                           ::                         !n   -1  1 24251 lo
 +
 +</code>
 +
 +Ne pas oublier de le rendre exécutable
 +
 +De même, il faut indiquer que la route par défaut est ppp0 :
 +
 +<code bash>
 +echo '#!/bin/bash' > /etc/ppp/ipv6-up.d/01-enable_ipv6_route
 +echo 'ip -6 route add default dev ppp0' >> /etc/ppp/ipv6-up.d/01-enable_ipv6_route
 +echo 'exit 0' >> /etc/ppp/ipv6-up.d/01-enable_ipv6_route
 +chmod +x /etc/ppp/ipv6-up.d/01-enable_ipv6_route
 +</code>
 +
 +Redémarrer la connexion pour que la route soit activée ou tapez "ip -6 route add default dev ppp0".
 +
 +
 +=== Nameserver ===
 +À ce niveau de la configuration, le ping vers une IPv6 devrait fonctionner (ex: "ping6 2001:910:800::12"). Par contre, les DNS ne fonctionnent pas encore (ping6 google.com ne fonctionne pas).
 +
 +On ajoute donc à /etc/resolv.conf :
 +<file conf /etc/resolv.conf>
 +...
 +# IPv6
 +nameserver 2001:910:800::12 # Serveur DNS IPv6 de FDN
 +</file>
 +
 +=== Vérification ===
 +Pour faire des tests, on peut vérifier que la table de routage IPv6 est bonne :
 +<code bash>ip -6 route</code> elle doit ressembler à :
 +<code>
 +root@miassou:~# ip -6 route
 +2001:910:111e:200::/56 via 2001:910:111e:200:: dev eth0  metric 1024 
 +2001:910:111e:300::/56 via 2001:910:111e:300:: dev eth0  metric 1024 
 +2001:910:111e:400::/56 via 2001:910:111e:400:: dev eth0  metric 1024 
 +2001:910:111e:500::/56 via 2001:910:111e:500:: dev eth0  metric 1024 
 +2001:910:111e:600::/56 via 2001:910:111e:600:: dev eth0  metric 1024 
 +2001:910:111e:700::/56 via 2001:910:111e:700:: dev eth0  metric 1024 
 +2001:910:111e:800::/56 via 2001:910:111e:800:: dev eth0  metric 1024 
 +2001:910:111e:a00::/56 via 2001:910:111e:a00:: dev eth0  metric 1024 
 +2001:910:111e::/48 dev eth0  metric 1024 
 +fe80::/64 dev eth1  proto kernel  metric 256 
 +fe80::/64 dev eth0  proto kernel  metric 256 
 +fe80::/64 dev ppp0  proto kernel  metric 256 
 +fe80::/10 dev ppp0  metric 1 
 +fe80::/10 dev ppp0  proto kernel  metric 256 
 +default dev ppp0  metric 1024 
 +</code>
 +
 +Ping d'une IP:
 +<code bash>
 +ping6 2001:910:800::12 # dns fdn
 +</code>
 +
 +Ping & résolution DNS:
 +<code bash>
 +ping6 google.com
 +</code>
 +
 +Se faire féliciter par Google :
 +http://ipv6test.google.com/