GuiguiAbloc

linux

Qui c’est qu’a la plus grosse ?…

par guiguiabloc le 01 sept, 2010, sous architecture, linux

Ah ah ah, ce titre racoleur :D

Non, rassurez-vous, dans ce billet je vous parlerai plutôt d’optimisation de site Web et non de ce à quoi vous pensez petit canaillou.

Récemment, je suis tombé sur un outil online permettant de réaliser un benchmark de votre site web.

Le site http://gtmetrix.com/ vous propose donc d’évaluer votre site grâce à des outils bien connus des développeurs : Yslow et PageSpeed.

Je n’ai jamais fait très attention au code de mon blog (bah oui, je ne suis pas du tout développeur :-) ), mais cet outil proposé par Gossamer (rien a voir avec les préservatifs hein… (ok, elle est très capilotractée cette blague :-p ) ) est assez intéressant pour plusieurs choses.
Tout d’abord connaître les « faiblesses » de votre site web, en apprendre un peu plus sur les choses à optimiser pour qu’il soit un tantinet plus rapide (surtout à forte charge) et bien sûr, améliorer son référencement. Car Google référencera plus facilement et devant les autres un site web dont le « Page Speed » est important.

Il y a plusieurs mois, je vous avez déjà parler de l’optmisation de mon blog via eAccelerator et Memcached dont les résultats comblaient toutes mes attentes.
Serein, je me suis donc empressé de « benchmarker » mon blog et oh surprise, c’était plutôt pas terrible du tout (yslow C et Page speed D).

En fait, a y regarder de plus près, et en passant d’autres blogs/sites à la moulinette, c’est un peu un cas général…

Ni une, ni deux, me sentant grandement motivé par ce challenge (oui gros challenge pour moi quand il s’agit de plonger dans du code php :-) ) je me suis attelé à suivre les conseils de Gtmetrix (via les liens Yahoo et Google).

Rien de bien difficile, et les résultats après quelques heures de travail sont surprenant.

D’ailleurs on se rend compte de pas mal d’erreur de conception dans Wordpress et l’une des difficultés rencontrée était de positionner les codes javascript en pied de page.

Heureusement, Lyza Gardner nous a écrit un excellent tuto pour résoudre ce problème :

http://www.cloudfour.com/getting-all-javascript-into-the-footer-in-wordpress-not-so-fast-buster/

Tout cela c’est super, bien sympa, et puis on se dit, pourquoi pas plus ?…

Professionnellement, nous utilisons des CDN, des Content Delivery Network, dont le leader est Akamaï.

Il y a bien sur Amazon ou d’autres qui proposent ce genre de service, mais j’ai un gros faible pour Akamaï pour plusieurs raisons personnelles.

D’abord j’ai travaillé avec Akamaï lors de leur arrivée sur le marché français à la fin des années 90 (oui oui, j’ai eu une formation d’ intégrateur Akamaï :-p) et j’y ai cotoyé des gens formidables et très enrichissants professionnellement, qui plus est avec une techno révolutionnaire a cette époque (les membres de l’équipe de cette époque se rappeleront sans doute avec nostalgie le fameux coup de génie M6 Loft Story ;-) )

J’y ai perdu également une personne que j’aimais beaucoup, Daniel Lewin, un homme extrémement enrichissant que j’appréciais énormément et qui a eu le malheur de se trouver au mauvais endroit le 11 septembre 2001.

Bref, j’ai toujours était très attaché a cette entreprise (d’ailleurs mon premier site Web était gracieusement « akamaïsé » :D ), mais cela reste une offre professionnelle et pour un particulier disposant d’un simple blog, c’est un peu « too much » (et « too expensive » surtout..)

J’ai regardé du côté des CDN « gratuit » du genre CoralCDN dont le but est clairement intéressant mais ne semble plus suivi. Pourtant cela marche toujours et vous pouvez vous essayer à votre premier « CDN » avec eux.

Le CDN par soi-même, simple a mettre en oeuvre, il demande toutefois que vous disposiez de serveurs géographiquement distants et comble de la perfection, attachés a des points de peering intéressants.

Bref, j’avais un peu laisser tomber tout cela jusqu’a ce que je tombe la dessus :

http://code.google.com/p/cirruxcache/

« CirruxCache provides a software solution to dynamically cache HTTP objects on Google Appengine (using the Datastore and the Memcache services). »

En traduction demi-molle « CirruxCache vous permet de faire du cache HTTP via l’infrastructure Google Appengine ».

WTF ??? Alors ça, ca me semblait bien fun :D

Je fouille un peu le site et oh surprise, Antoine Libert, sur son blog, nous offre un excellent tuto pour sa mise en oeuvre !!!

Tout d’abord, merci Antoine pour cet excellent article et le lien qu’il vous faut absolument lire :

http://a-l.fr/blog/2009/11/28/how-to-use-cirruxcache-and-google-app-engine-to-cache-static-content-of-your-wp-blog/

Rajoutez a cela, un superbe plugin Wordpress pour les CDN :

http://mark.ossdl.de/2009/08/rewriting-urls-for-wordpress-and-cdn/

Le résultat est flagrant :

PageSpeed avec un score de 98….

Reste la comparaison avec d’autres sites pris au hasard ;)   :

Ok, on écrase google.com, free.fr ou ovh.fr (même si google se charge plus vite, forcément :) )

On peut se la péter grave en société avec ça :mrgreen:

Donc tout cela pour vous dire que cette phase de travail a été enrichissante pour moi, que bien sûr il reste du boulot pour monter encore un c’hti peu (pas PageSpeed  hein, je crois qu’on ne peut pas monter plus haut, du moins, je n’ai trouver aucun site Web avec un tel niveau ou supérieur), mais comprendre un peu mieux une partie que je déteste d’habitude, le code :( .

Bilan surtout sur CirruxCache et Google Appengine qui me parait une excellente solution de CDN dans des infras HA, permettant de soulager un peu vos serveurs, dans la limite, du moins, de ce que Google vous offre gratuitement comme ressource (après c’est payant bien sûr, faut pas déconner non plus…)

Amusez-vous bien :D

9 Commentairess :, , , , plus...

Domotique : synthèse vocale, Pulseaudio en unicast, Zoneminder et xAP, avec un soupçon de Sec…

par guiguiabloc le 24 août, 2010, sous domotique, geekerie, linux

En voila du titre bien décousu :-)

En fait, j’ai passer quelques semaines a mettre en place différentes solutions dans mon environnement domotique et plutôt que d’en faire plein de petits billets, j’ai décidé de tout regrouper en un, à vous de piocher dedans :D

Pour résumer la situation, je voulais d’abord que mon serveur Domotique « parle » (ça c’est plutôt simple), que lorsque j’allume mon portable au sous-sol, j’entende les messages audio du serveur (la ça se complique, si comme moi, vous ne souhaitez pas faire du multicast dans votre LAN), et enfin, comble du geekissime domotique, je voulais récupérer en temps réel les alarmes Zoneminder dès la détection d’un mouvement dans le champ de la caméra et que mon serveur Domotique me l’annonce de sa douce voix (la, ça se complique beaucoup, vous verrez…)

Bref, après plusieurs semaines, tout cela fonctionne, voyons comment.

  • SYNTHESE VOCALE ou comment faire parler une machine

Pour l’installation d’un synthèse vocale sur un serveur Linux, rien de plus simple.

Plutôt que de refaire un énième billet a ce sujet, je vous renvoie vers le blog de Christophe Nowicki dont je vous avez déjà parler, qui explique très bien la façon de le faire :

http://www.csquad.org/2009/08/27/text-to-speech-avec-espeak-mbrola-et-speech-dispatcher/

Il existe bien sûr d’autre tutos, mais Christophe a beaucoup travailler sur le « son » en Domotique et son blog regorge d’infos intéressantes.

Bilan après installation, un système de synthèse vocale installé sous /opt/mbrola

et bien sûr, les commandes essentielles à la création et gestion des « voix » :

(ps : fr4 est une voix française féminine, bizarrement je préfère :-p )

(NB: a l’attention de Fred, je n’arrive pas a reproduire la voix de Karen Cheryl… Désolé… (ou tant mieux pour nous…)

- Convertir le texte écrit dans le fichier « texte » en un phonème compréhensible par Mbrola

espeak -x -v mb/mb-fr4 -f texte > texte.pho

- Faire parler le serveur en lisant le phonème

mbrola -t 1.0 -e -C « n n2″ /opt/mbrola/fr4/fr4 texte.pho -.au | aplay

- Convertir la phrase lue par mbrola en un fichier Wav

mbrola -e -C « n n2″ /opt/mbrola/fr4/fr4 texte.pho texte.wav

(pour les options mbrola que j’utilise, t = la vitesse de lecture, voir la doc officielle)

Pour lire le wav en ligne de commande, mplayer est votre ami.

  • PULSEAUDIO ou le son en réseau

Voila la partie où j’ai passer le plus de temps.

Je souhaitais récupérer le son émis par mon serveur sur mon portable connecté en Wi-Fi.

Le premier serveur de son qui m’est venu a l’esprit fut bien sur Pulseaudio.

C’est là que les complications sont arrivées…

Pulseaudio peut fonctionner en multicast, comprendre que le son est diffusé dans tout le LAN, il peut même s’intégrer a Avahi (le mDNS type « Bonjour »).

Sauf que moi le multicast, j’aime pas ça (va comprendre Charles…) et qui plus est, j’ai un LAN segmenté par VLAN et centralisé par du Cisco, et la conf multicast sous Cisco, ca me fait mal au crâne :-)

Donc, out le multicast, je veux de l’unicast TCP (bah oui, j’aime bien les trames réseaux bien proprettes :-D )

L’installation de Pulseaudio sous Debian Lenny passe par un apt-get install tout simple (n’oubliez pas pulseaudio-utils)

Côté configuration sur le serveur Domotique :

srvdomotique:/etc/pulse# cat default.pa
#!/usr/bin/pulseaudio -nF
.nofail
load-sample-lazy pulse-hotplug /usr/share/sounds/startup3.wav
.fail
.ifexists module-hal-detect.so
load-module module-hal-detect
.else
load-module module-detect
.endif
### Load several protocols
.ifexists module-esound-protocol-unix.so
load-module module-esound-protocol-unix socket="/tmp/.esd/socket"
.endif
load-module module-native-protocol-unix
load-module module-esound-protocol-tcp auth-anonymous=1
load-module module-native-protocol-tcp listen=192.168.43.100 auth-anonymous=1
load-module module-tunnel-sink server=192.168.8.201 sink_name=copie
load-module  module-combine sink_name=combined master="copie" slaves="alsa_output.pci_10de_3f0_alsa_playback_0"
.ifexists module-gconf.so
.nofail
#load-module module-gconf
.fail
.endif
### Automatically restore the volume of playback streams
load-module module-volume-restore
load-module module-default-device-restore
load-module module-rescue-streams
load-module module-suspend-on-idle
.ifexists module-x11-publish.so
.nofail
load-module module-x11-publish
.fail
.endif
set-default-sink combined

Petite explication.

La ligne : « load-module module-native-protocol-tcp listen=192.168.43.100 auth-anonymous=1″ signifie que vous écoutez sur l’ip 102.168.43.100 et que vous autorisez les connexions anonymes (on va filter au niveau ACL du cisco)

La ligne : « load-module module-tunnel-sink server=192.168.8.201 sink_name=copie »

désigne le « client » qui va écouter les sons émis par le serveur domotique (en fait le client est le serveur domotique qui va émettre le son vers un serveur pulseaudio distant à l’ip 192.168.8.201…)

La ligne : « load-module  module-combine sink_name=combined master= »copie » slaves= »alsa_output.pci_10de_3f0_alsa_playback_0″ »

génère un « sink » (une destination audio si vous préférez), qui comprend ET le pc a l’adresse 192.168.8.201 (alias copie) ET la carte son du serveur Domotique.

Flux par défaut : set-default-sink combined

Ce qui veut dire que tout son émis doit être diffusé simultanément sur la carte son du serveur Domotique (je peux donc l’entendre par les enceintes branchées dessus) et sur les enceintes du PC client.

C’est clair ?

Sur le serveur Domotique, dont le système de son est géré par ALSA, je spécifie que tout les sons doivent être envoyés au démon PulseAudio grace au fichier /etc/asound.conf

srvdomotique:/etc# more asound.conf
pcm.pulse {
type pulse
}
 
ctl.pulse {
type pulse
}
 
pcm.!default {
type pulse
}
 
ctl.!default {
type pulse
}

Reste à lancer pulsaudio (ou par la commande pulseaudio -Cvvv pour voir ce qui se passe ou par la commande pulseaudio -D pour le daemoniser en arrière plan).

Les sons émis par votre serveur doivent être audible sur les enceintes de celui-ci.

Sur le PC client (mon portable en l’occurence), installation de pulseaudio normale, puis un default.pa comme suit :

#!/usr/bin/pulseaudio -nF
.ifexists module-hal-detect.so
load-module module-hal-detect
.else
load-module module-detect
.endif
.ifexists module-esound-protocol-unix.so
.endif
load-module module-native-protocol-unix
load-module module-esound-protocol-tcp auth-anonymous=1
load-module module-native-protocol-tcp listen=192.168.8.201 auth-anonymous=1
.ifexists module-gconf.so
.nofail
.fail
.endif
load-module module-volume-restore
load-module module-default-device-restore
load-module module-rescue-streams
load-module module-suspend-on-idle
.ifexists module-x11-publish.so
.nofail
load-module module-x11-publish
.fail
.endif

Rien d’autre (pas de fichier /etc/asound.conf, pas de données dans client.conf)

Lancer pulseaudio sur le client puis lancer pulseaudio sur le serveur Domotique. Les sons émis par le serveur domotique arrive sur le pc portable (même dans KDE pour ma part…)

Oui, MAIS !!!

Le gros problème est que si le PC portable se connecte APRES le démarrage de PulseAudio sur le serveur Domotique et bien, cela ne fonctionne plus !!!!

J’ai passé des jours a chercher et je n’ai pas réussi a comprendre pourquoi le serveur Domotique ne voyait pas le portable se connecter… J’ai tourner dans tout les sens, impossible de le faire marcher comme cela donc si vous avez une solution, je suis preneur !!!

Mais je n’allais pas en rester la et donc pour réussir ce tour de force, j’ai décider de forcer l’enregistrement du pc portable sur le serveur son Domotique via quelques scripts.

Alors, un peu de compassion pour moi, je ne suis pas développeur et c’est sûrement très crado comme code mais au moins ça marche :-p

- Technique d’enregistrement d’un client PulseAudio via socket en Python.

Sur le serveur Domotique, on va faire tourner un petit serveur codé en Python qui écoute sur le port tcp 12345 :

srvdomotique:~# cat pulseserver.py
#!/usr/bin/python
import socket
import subprocess
import sys
import os
servsock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 
try:
    servsock.bind(('',12345))
 
except socket.error:
        print "Relance Pulse"
        pidpulse = subprocess.Popen("ps acx | grep pulseaudio | awk '{print $1}'", shell=True, stdout=subprocess.PIPE)
        pid = pidpulse.stdout.read()
        print pid
        os.kill(int(pid), 9)
        pidpulse.stdout.close()
        subprocess.call(["pulseaudio -D"],shell=True)
        servsock.bind(('',12345))
 
servsock.listen(1)
while True:
sock,addr = servsock.accept()
echo = sock.recv(1024)
subprocess.call(["/home/scripts/enregistrement_station.sh"],shell=True)
sock.send(echo)
sock.close()

Quand le client se connecte, le serveur domotique lance le script enregistrement_station.sh :

#!/bin/bash
PIDPULSE=` ps acx | grep pulseaudio | awk '{print $1}'`
kill -9 $PIDPULSE
pulseaudio -D
sleep 2
mplayer /opt/sound/notify.wav
mbrola -t 1.1 -e -C "n n2" /opt/mbrola/fr4/fr4 /opt/mbrola/enregistrement_station.pho -.au | aplay

Dans /etc/rc.local, vous n’avez plus qu’a rajouter la ligne :
/cheminduscript/pulseserver.py &
pour le lancer au boot du serveur.

Côté PC portable, le script de connexion.sh :

#!/bin/bash
PIDPULSE=` ps acx | grep pulseaudio | awk '{print $1}'`
# On allume le haut-parleur a 80%
amixer -q set Master 80%,80%  unmute
if  test -n "$PIDPULSE"
then
echo "pulseaudio actif"
else
pulseaudio -D
fi
sleep 1
python /home/guiguiabloc/pulseclient.py
exit 0

Et le client en python (pulseclient.py)

#!/usr/bin/python
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host = 'srvdomotique'
port = 12345
print 'Connexion sur ', host, port
client.connect((host, port))
client.close

Je vous le conçois, c’est bourrin…
Quand le portable lance le script « connexion.sh », il lance pulseaudio en local, se connecte au serveur domotique sur le port 12345 qui kill son pulseaudio et le relance, puis fait dire au serveur domotique une phrase annonçant l’enregistrement de la station.
Mais au moins ça marche…

Donc si vous avez d’autres solutions, je suis à votre écoute :D

  • ZONEMINDER et xAP (avec un soupçon de SEC)

Dernière étape de mon travail, mon zoneminder.

ZoneMinder, c’est « vachement » bien, ça fait plein de truc par défaut mais il me manquait une fonction essentielle.

Quand l’on positionne ses caméras en mode « Modect », il détecte les mouvements dans la zone que vous avez définie et enregistre la séquence. Une fois achevée, il vous envoie un email pour vous prévenir d’un mouvement et vous donne le lien vers le « film ».

Super, mais entre le moment où ZoneMinder déclenche l’enregistrement, l’achève après un temps pré-défini (j’utlilise un buffer de 10 secondes avant et 30 secondes après), et vous envoie le mail, bah il se passe plusieurs secondes, voir minutes.

Ce que je voulais c’est que dès qu’un mouvement était détecté par la caméra, ZoneMinder me prévienne d’une manière ou d’une autre. Dans mon cas, en me l’annonçant de sa douce voix (via mbrola).

Ce n’est pas natif dans les fonctions de ZoneMinder et mon bonheur je l’ai trouvé (après moults recherches je vous l’avoue), chez xAP.

Pour résumer, xAP est un protocole open dédié a l’automatisation. C’est la première fois que j’en entendais parler et les fonctionnalités sont nombreuses et puissantes.

Et l’une de ses nombreuses fonctionnalités justement, c’est sa possibilité d’intégration avec ZoneMinder, via un script perl nommé ZMXAP.

En fait, au fin fond du WiKi Zoneminder, on trouve un article dessus :

http://www.zoneminder.com/wiki/index.php/Zmxap

Ni une ni deux, on se télécharge le bazar ici :

http://www.limings.net/xap/zmxap/zmxap-v0.9.tar.gz

La conf est trivial, juste a spécifier nohub=1 dans le zmxap.conf et surtout, pour le besoin que j’avais, générer un fichier de log avec la variable log_file = /tmp/zmxap.log

Car  zmxap est capable d’intéragir directement avec Zoneminder et donc de recevoir en temps réel les informations qui en découlent.

Petit test pour le vérifier :

On lance Zmxap.pl avec la variable du path :

/opt/scripts/zmxap/zmxap.pl -path=/opt/scripts/zmxap &

On passe la caméra en mode « Modect », on passe devant elle et on regarde ce qui se passe dans le fichier /tmp/zmxap.log

24.08.2010 19:32:08 [INFO] (main::loadMonitors): Loading monitors
######## in sendAlarmEvent
####### state=2 and cause=Motion
###### starting fetch of event_data
###### completed fetch of event_data
######## completed sendAlarmEvent
24.08.2010 19:36:03 [INFO] (checkState) Sous_Sol - initiating alarm state
######### completed sendTrackingEvent
24.08.2010 19:36:18 [INFO] (checkState) Sous_Sol - resuming idle state
######## in sendAlarmEvent
####### state=0 and cause=Motion
###### starting fetch of event_data
###### completed fetch of event_data

Magique !!!

ZMXAP a détecté immédiatement le passage (initiating alarm state) puis on voit l’enregistrement se faire.

Ne reste plus qu’a analyser ce fichier de log en temps réel pour remonter l’info.

Et qui a-t-il de mieux pour analyser un fichier de log temps réel ? hein ? Pourtant je vous en avez déjà parler :

http://blog.guiguiabloc.fr/index.php/2009/03/18/interception-des-erreurs-applicatives-dans-nagios-avec-sec-et-prelude-lml/

SEC bien sûr !!!

Allez hop, on se configure notre sec.conf :

type=single
ptype=RegExp
pattern=Sous_Sol(.+)alarm
desc=$0
action=shellcmd  /opt/scripts/AUDIO_alarme_soussol.sh

le script AUDIO_alarme_soussol.sh ne fait que lire une phrase disant « attention y’a un méchant monsieur au sous-sol » (ou autre chose hein…)

Ne reste qu’a lancer tout cela ensemble :

#!/bin/bash
/opt/scripts/zmxap/zmxap.pl -path=/opt/scripts/zmxap &
/usr/local/bin/sec/sec.pl -conf=/usr/local/bin/sec/etc/sec.conf -input=/tmp/zmxap.log -log /var/log/sec.log &

Et voilà, désormais, en plus d’enregistrer les mouvements détectés, ZoneMiner vous prévient immédiatement dès qu’il détecte un mouvement !

C’est pas beau ça ?

Voila un tour de ce que j’ai mis en oeuvre ses dernières semaines, j’avoue que pulseaudio m’a beaucoup coûter en temps, essayant de lui faire recharger sa configuration quand il voyait le portable mais sans succès.

En tout cas, désormais, tout fonctionne à merveille et après tout, c’est tout ce que l’on en attend.

Amusez vous bien :D

7 Commentairess :, , , , plus...

Mise à jour dynamique d’entrée DNS

par guiguiabloc le 01 juin, 2010, sous geekerie, linux, réseau

Petit billet rapide suite à la sortie de l’offre MiniCloud d’OVH http://www.kimsufi.com/cloud/

Bien évidemment, cette technique ne s’applique pas seulement à cette offre, elle est juste… bien utile.

En effet, les MiniCloud d’OVH changent d’adresse IP quand on les éteints et qu’on les rallument. C’est assez gênant de courir après la nouvelle adresse ip du cloud n°24, mais heureusement, afin d’éviter ceci, le DNS est notre ami.

Vous connaissez tous DynDNS, un service gratuit, très utilisé par les gens qui disposent d’une adresse IP dynamique chez eux, et qui permet, lors du changement d’adresse, de mettre a jour une entrée DNS de type chezmoi.dyndns.com.

Ce que je vous propose, c’est de faire la même chose sur vos serveurs DNS, et donc de changer dynamiquement une entrée de type A en cas de changement d’adresse IP (de votre MiniCloud par exemple).

Je considère déjà que vous savez comment fonctionne un DNS et que le votre est fonctionnel et opérationnel pour votre ou vos domaines.

  • BIND

Pré-requis, les packages dns-utils et bind9  (pour les distributions Debian)

Première étape, créer une paire de clés pour permettre de mettre à jour le DNS à distance en toute sécurité :

dnssec-keygen -a HMAC-MD5 -b 512 -n USER -r /dev/urandom dnscloud.guiguiabloc.fr
Kdnscloud.guiguiabloc.fr.+157+06250

Vous avez désormais 2 clés, 1 privée et 1 publique (comme pour ssh)

serveur:~# ll K*
-rw------- 1 root root 130 jun  1 09:41 Kdnscloud.guiguiabloc.fr.+157+06250.key
-rw------- 1 root root 156 jun  1 09:41 Kdnscloud.guiguiabloc.fr.+157+06250.private

On récupère la clé :

serveur:~# cat Kdnscloud.guiguiabloc.fr.+157+06250.private | grep Key
Key: GaC4ezsL0c/gWqG7nzH4iYyWPqYS2tC3H78ZYkyuvj5LJyq6JZjh4f+KKhuL/A5gTnc1K0rRw2u/3z+eXA76XA==

Ajouter la clé dans le fichier named.conf (ou named.conf.local tout dépend de votre façon de travailler ;-) ) :

key "dnscloud.guiguiabloc.fr." {
   algorithm hmac-md5;
   secret "GaC4ezsL0c/gWqG7nzH4iYyWPqYS2tC3H78ZYkyuvj5LJyq6JZjh4f+KKhuL/A5gTnc1K0rRw2u/3z+eXA76XA==";
   };

Ensuite, nous allons autoriser cette clé a mettre à jour notre domaine (ou sous-domaine si vous avez séparé vos entrées)

zone "guiguiabloc.fr" {
type master;
file "/etc/bind/zone.guiguiabloc.fr";
allow-update { key dnscloud.guiguiabloc.; };
allow-query { any; };
};

Dans votre fichier de zone, ajouter votre entrée de type A :

$TTL 180        ; 3 minutes
cloud01                 A       91.12.34.56

Vous remarquerez que je force un TTL a  180 secondes (important, par défaut les entrées sont valables 24h…)

On reload Bind et on tente une mise à jour à distance :

serveur# nsupdate -d -k ./Kdnscloud.guiguiabloc.fr.+157+06250.private
   Creating key...
   > server ns.guiguiabloc.org.
   before getaddrinfo()
   > update delete cloud01.guiguiabloc.org.
   > update add cloud01.guiguiabloc.org. 180 A 212.56.43.21
   > send
...
Reply from update query:
;; ->>HEADER<<- opcode: UPDATE, status: NOERROR, id:  60872
;; flags: qr ; ZONE: 0, PREREQ: 0, UPDATE: 0, ADDITIONAL: 1
;; TSIG PSEUDOSECTION:
cloud1.guiguiabloc.fr.     0       ANY     TSIG    hmac-md5.sig-alg.reg.int. 1275379509 300 16 X3gUWw/uLyIJL4RykJbp24w== 60872 NOERROR 0

Et dans les logs de votre serveur Bind :

Jun  1 10:05:09 NS named[2224]: client 82.247.168.242#26928: signer "dnscloud.guiguiabloc.fr" approved
Jun  1 10:05:09 NS named[2224]: client 82.247.168.242#26928: updating zone 'guiguiabloc.fr.fr/IN': delete all rrsets from name 'cloud01.guiguiabloc.fr'
Jun  1 10:05:09 NS named[2224]: client 82.247.168.242#26928: updating zone 'guiguiabloc.fr/IN': adding an RR at 'cloud01.guiguiabloc.fr' A

Magique :-D

Ne reste qu’a scripter tout cela.

2 techniques pour récuperer l’ip (a vous de choisir celle qui vous convient ) :

  1. On se créer une petite page php sur un de nos serveurs web qui nous donne l’ip depuis la laquelle nous nous présentons :
cat index.php
 
<?PHP
echo $_SERVER["REMOTE_ADDR"];
?>

On l’héberge sur un nom style ip.guiguiabloc.fr et il suffit d’appeler (via Curl) l’adresse ip.guiguiabloc.fr pour récuperer notre ip fixe.

  1. On récupère l’adresse IP via ifconfig
ifconfig eth0 | egrep 'inet adr:'| cut -d: -f2 | awk '{ print $1}'

Le script :

cloud# cat update_cloud.sh
#!/bin/bash
IP=`curl -s ip.guiguiabloc.fr`
 
# Si ifconfig
 
# IP=`ifconfig eth0 | egrep 'inet adr:'| cut -d: -f2 | awk '{ print $1}'`
 
# check si changement
ACTUALIP=`/usr/bin/dig +short cloud01.guiguiabloc.fr @ns.guiguiabloc.fr | /usr/bin/tail -n1 `
 
if test "$ACTUALIP" = "$IP"
then exit 0
else
 
cat > /var/scripts/majdnscloud.txt << EOF
server ns.guiguiabloc.fr
zone guiguiabloc.fr
update delete cloud01.guiguiabloc.fr. A
update add cloud01.guiguiabloc.fr. 180 A $IP
show
send
EOF
 
nsupdate -k /var/scripts/Kdnscloud.guiguiabloc.fr.+157+06250.private -v /var/scripts/majdnscloud.txt
fi

Et hop, on se met a au démarrage du cloud (genre a la fin et rc.local) et au reboot du cloud, le dns sera mis automatiquement à jour.

  • DJBDNS

Si vous n’utilisez pas Bind mais l’excellent DJBDNS, il existe un tutorial très bien fait pour appliquer la même technique :

http://qmail.jms1.net/djbdns/dyndns.shtml

Voilà, j’espère que cette technique vous servira, non seulement pour vos serveurs amenés à changer d’adresse IP, mais également chez vous, si vous avez une IP dynamique et vous souhaitez utiliser vos propres noms de domaines.

Amusez vous bien :-)

5 Commentairess :, , plus...

Déploiement d’IPv6… A bloc…

par guiguiabloc le 11 mai, 2010, sous architecture, cisco, linux, réseau

Tout le monde le sait, on ne cesse de nous rabâcher la même prophétie, bientôt c’est la fin du monde !!!

Enfin, outre la fameuse année 2012, qui a déjà pris de l’avance sur le site http://www.2012fin.com (n’y aller pas !! en plus il est vérolé !!!) si j’en crois le résultat suivant :

C’est surtout la diminution constante des adresses IPv4 publiques disponibles qui continue son oeuvre.

Bien évidemment, depuis quelques années déjà, IPv6 est la réponse a ce problème, mais bon, cela ne sera pas en place partout avant bien longtemps, donc pas de cris paniqués, de viols incongrus, d’immolations inconsidérées ou de bitures monumentales (euh quoique…), IPv4 a encore de beaux jours devant lui.

Quoi qu’il en soit, il était temps de me dépoussiérer un peu et de replonger dans les méandres d’IPv6 et de remettre cela en oeuvre dans mon architecture.

Mes connaissances en IPv6 étant plus qu’anciennes, je me suis donc remis à niveau à coup de lecture multiples sur des sites divers et variés, allant des RFC aux blogs.

La liste étant particulièrement imposante, je vous laisse plutôt vous promener sur Google.

Un des sites les plus amusants pour se remettre a niveau est Hurricane Electric, un provider Internet et également Tunnel Broker IPv6, qui vous propose de passer votre Certification IPv6 à travers une série de questionnaire et d’exercices pratiques a mettre en place (exemple vous rendre sur le site via une connexion IPv6, monter un MX IPv6, des DNS IPv6 etc…), bref des étapes amusantes qui vous permettent de progresser dans votre apprentissage/remise à niveau, tout en maquettant votre future architecture.

Pour la Certification, cela se passe la : http://ipv6.he.net/certification/

Au fur et a mesure vous changez de niveau (newbie, explorer, enthusiast, administrator, professional, guru et enfin sage). Validé bien sûr par un « zoli » diplôme et un lien vers vos résultats a mettre sur votre site :

ah ah ah :-D

Bref, très instructif et amusant pour bosser IPv6 (je sais, les geeks ont des jeux bizarres…)

Fort de ma remise à niveau, il était temps de déployer IPv6 tout autour de ma sphère personnelle.

Un petit panaché donc des différents environnements et situations que j’ai rencontré et dont, je pense, l’un d’entre eux répondra à vos attentes.

RAPPEL DES FAITS

Non, je ne vous ferais pas un cours sur IPv6, mais il faut bien évidemment revoir nos classiques et surtout la façon dont fonctionne l’adressage IPv6.

Pour commencer, je vous invite a lire la page Wikipédia.

Maintenant, vous savez qu’une adresse IPv6 est longue de 128 bits contre 32 en IPv4.

De plus, l’écriture est au format hexadécimal et non décimal.

Pour résumer :

Espace d’allocation Fournisseur d’accès Client Réseau Identifiant
Bits 0-15 16-31 32-47 48-63 64-127
Exemple 2001: 0660: 315f: c242: 20d:60ff:fe38:6d16

Mais s’il y a un « schéma » qui m’a permit de tout comprendre, c’est celui la :

2001:12d3:4:56 00: 0000:0000:0000:0000
\____________/ \_/ \..._/
partie réseau  s/s  partie pour l'identifiant
(56)           (8)    (64)

Si vous avez un /64, vous avec donc les 56 premiers bits+ les 8 bits de sous réseau + 64 bits pour vos machines (en gros cela nous fait 18 milliards de milliards d’adresses IP à votre disposition…)

Si vous avez un /56, vous avez donc les 56 premiers bits + 2^8 (256) sous réseaux X 2^64 adresses IP (18 446 744 073 709 551 616)…

Donc avec un /56 vous avec 256 sous-réseaux de 18 milliards de milliards d’adresses IP chacun… (un peu too much, non ?… ;-) )

Et bien sur, vous pouvez encore redécouper (/126, /120, /112 etc…).

Plus clair :mrgreen: ?

ATTENTION : Une remarque importante, iptables ne contrôle pas les flux IPv6 sur vos interfaces. Il faut utiliser ip6tables pour protéger vos accès. N’oubliez donc pas de configurer en plus d’iptables, un ip6tables sur vos serveurs/pc… (et de, surtout, laisser l’icmp6 autorisé…)

CONNECTIVITE IPv6

Si vous êtes dégroupé chez Free (ou chez Nerim), vous avez la chance d’avoir un adressage IPv6 disponible rien que pour vous.

Malheureusement, étant non-dégroupé, je n’ai pas cette option, comme de nombreuses personnes chez d’autres FAI (quand je vous disais que vous avez de beaux jours en IPv4, les FAI ne sachant pas eux même faire fonctionner leurs architectures en IPv6 de bout en bout…).

La solution est le tunnel « 6to4″.

Un tunnel « 6to4″ permet de relier un réseau Ipv4 au réseau IPv6.

Les principaux fournisseurs de tunnels 6to4 sont :

-Hurricane Electric http://www.tunnelbroker.net

-Gogo6 (Freenet6) http://www.gogo6.com

-Sixxs http://www.sixxs.net

Je ne me lancerais pas dans un comparatif mais pour avoir utiliser les trois, j’ai un faible pour Gogo6 dont la facilité d’installation et la stabilité du tunnel m’ont bien plu.

Une fois enregistré chez eux, il en vous reste qu’a télécharger le source d’installation pour Linux (ou autre hein…) la : http://gogonet.gogo6.com/page/download-1

Compilation basique (make, make installdir=/usr/local/bin/gogoc install) et configuration des plus simples (userid, mot de passe et server=authenticated.freenet6.net bref lire le fichier de conf)

Il ne reste qu’a lancer l’executable (/usr/local/gogoc/bin/gogoc par exemple) pour voir un nouveau tunnel se monter dans vos interfaces réseaux :

tun       Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
adr inet6: 2001:5c0:1400:b::5b43/128 Scope:Global

et voila, vous avez un accès IPv6 :

server:/usr/local/gogoc/bin# ping6 ipv6.google.com
PING ipv6.google.com(2a00:1450:8007::6a) 56 data bytes
64 bytes from 2a00:1450:8007::6a: icmp_seq=1 ttl=55 time=60.4 ms

simple non ?

Par votre navigateur Internet, a vous la joie de voir la tortue Kame gigoter pour prouver que vous utilisez une connexion IPv6.

SERVEURS DEDIES OVH

Ayant des serveurs chez OVH, ce dernier vous attribue une plage d’adresses IPv6 a utiliser sur votre serveur.

Pour cela rien de plus simple, se rendre dans son « Manager », sur la page « serveur dédié », et récupérer le /64 qui vous est attribué.

Le guide est dispo ici : http://guides.ovh.com/Ipv4Ipv6

Rien de bien compliquer mais personnellement, j’en voulais un peu plus et donc utiliser aussi l’IPv6 dans mes machines virtuelles VMWare…

La cela se complique un peu plus mais la réponse je l’ai trouvé sur le blog Linux Attitude, grâce à un excellent tuto écrit par StalkR.

En fait, OVH ne vous attribue pas un simple /64 mais un /56… Ce qui fait que vous pouvez subnetter vos adresses IPv6 :-D

Donc pour le /64 qui m’était par exemple attribué : 2001:12D3:4:5678::/64 j’ai donc à ma disposition le bloc suivant : 2001:12D3:4:5600::/56.

Ni une, ni deux, on se prend un petit subnet pour les VMs :

  • 2001:12D3:4:5678::/64 pour les serveurs physiques
  • 2001:12D3:4:5681::/64 pour les VMs.

(vous suivez toujours ? 2001:12D3:4:56.. est le bloc réseau que m’attribue OVH et j’ai pour moi 256 sous-réseaux (les 8 bits après le chiffre 56, pour créer mes subnets. Dans le cas présent …78.. et ..81.. (a vous de choisir dans la plage hexadecimal de 00 a FE).

A cet effet, une page web intéressante pour visualiser d’un coup tout cela : TABLE ASCII

Chaque sous-réseau disposant de 18 milliards de milliards d’adresses pour mes serveurs (honnêtement, je n’en ai pas autant…)

Un peu de tuning Kernel parce que je ne veux pas d’autoconfiguration.

Ah oui, j’ai oublié de vous parler de cela…

IPv6 a parmi ses facultés, celle d’autoconfigurer les interfaces réseaux et les routes dynamiquement grâce au « Router Advertisement« . En gros, cela permet a Mme Michu de ne pas se prendre la tête et d’avoir une configuration automatique (genre dhcp) annoncé par le routeur IPv6 en amont de sa connexion.

Je ne rentrerais pas dans le détail, (RADVD étant une excellente solution pour l’autoconfiguration de votre parc), car personnellement je tenais a maîtriser chaque étape de mon déploiement.

serveur:~# cat /etc/sysctl.conf
...
net.ipv6.conf.eth0.autoconf=0
net.ipv6.conf.eth0.accept_ra=0
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.all.router_solicitations=1
net.ipv6.conf.default.proxy_ndp=1
net.ipv6.conf.all.proxy_ndp=1
net.ipv6.conf.all.forwarding=1

Sur le serveur physique :

ip route add 2001:12d3:4:56ff:ff:ff:ff:ff/128 dev eth0 (1)
ip route add default via 2001:12d3:4:56ff:ff:ff:ff:ff (2)
ip route add 2001:12d3:4:5678::/64 dev vmnet1 (3)
ip neigh add proxy 2001:12d3:4:56ff:ff:ff:ff:ff dev vmnet1 (4)
ip neigh add proxy 2001:12d3:4:5681::1 dev eth0 (5)

A ajouter dans votre /etc/rc.local par exemple pour que cela soit effectif à chaque reboot (sans les (1),(2) etc..) ;-) )

Explication :

(1) J’ajoute la route vers la passerelle sur l’interface eth0

(2) J’ajoute la passerelle IPv6 comme route par défaut

(3) J’ajoute une route vers mon subnet /64 dédié a mes VMs sur l’interface VMware

(4) Je demande a l’interface vmnet1 de répondre aux requêtes à destination de l’ip de la passerelle

(5) Je demande a l’interface eth0 de répondre aux requêtes à destination de l’ipv6 de ma VM.

On attribue l’IPv6 2001:12d3:4:5681::1/64 dans notre VM.

# IPV6
iface eth0 inet6 static
address 2001:12D3:4:5681::1/64
netmask 64

On rajoute les routes dans /etc/rc.local

ip route add 2001:12d3:4:56ff:ff:ff:ff:ff/128 dev eth0
ip route add default via 2001:12d3:4:56ff:ff:ff:ff:ff

Pas la peine de toucher au kernel pour la VM.

On reboot tout le bouzin (physique et virtuel) et hop, magique, la VM est accessible en IPv6 de l’extérieur :-D

SITE WEB

Les serveurs sont en IPv6, reste à rendre accessible votre site web.

Que votre serveur http soit Nginx, Apache ou autre, pas de grandes différences. (Attention, pour Nginx il faut compiler avec l’option –with-ipv6).

Juste se rappeler que les adresses IPv6 s’écrivent entre crochets.

On fait écouter le serveur sur l’IPv6 :

Listen [2001:41d0:2:67a::150]:80

Et on configure un vhost en conséquence :

NameVirtualHost [2001:41d0:2:67a::150]:80
 
...

Il ne vous reste plus qu’a ajouter une entrée de type AAAA dans votre DNS.

dig -t AAAA blog.guiguiabloc.fr
 
;; QUESTION SECTION:
;blog.guiguiabloc.fr.           IN      AAAA
 
;; ANSWER SECTION:
blog.guiguiabloc.fr.    86400   IN      AAAA    2001:41d0:2:67a::150

Et voila, le blog est accessible en IPv6 (j’ai même mis un joli logo en bas de la page :mrgreen: ), et vérifié par ipv6forum.

IPv6 AVEC OPENVPN

Utilisant des tunnels openvpn entre mon domicile et mes serveurs OVH, bien entendu, l’idée de me servir du bloc d’adresses IPv6 d’OVH chez moi m’a tout de suite interpellé.

Comme pour les VMs, c’est assez triviale et plutot que de vous expliquez la procédure, je vous invite a lire les excellents tutos de GeekFault ou de  Vincent Riquer.

La seule différence notable est que j’utilise Vyatta comme client Openvpn chez moi (en tant que routeur d’interconnexion VPN).

Pour la spécificité Vyatta, j’ai modifié l’interface de cette façon :

openvpn-option « –dev-type tap –dev vtap0″

Ce qui me permet d’avoir une interface de type TAP et non TUN pour mon tunnel.

Vous pouvez ou utiliser RADVD comme décrit dans les tutos cités, ou utiliser le push ipv6 via le patch de Gert Döring , ou la même technique que pour les VMs.

CISCO et ADRESSAGE PRIVE IPv6

La on se spécifie un peu…

Si comme moi, vous avez monter un gros LAN des familles, l’idée d’utiliser des adresses IPv6 publiques vous enchantent moyennement.

Après tout, vous avez déjà un adressage privé IPv4, pourquoi ne pas continuer en IPv6.

Oyé, Oyé, l’adressage privé IPv6 existe.

Il a pour nom ULA (Unique Local Address) (a lire) et répond a la RFC 4193 (ex 3879).

Son plan d’adressage est le suivant : FC00::/7

( /7 ca fait un peu de monde… en fait /8 si l’on veut être propre)

Lire cet article également, et pour les connexions site à site et la technique pour générer des plans d’adressages ULA basés sur les MAC, lire : http://www.bortzmeyer.org/4193.html (ah ah ah, est-ce la fin des conflits des domaines d’encryption VPN :-D (les habitués des tunnels ipsec comprendront…))

Bien, trêve de plaisanterie, passons a la pratique.

On se réserve un /48 pour la maison.

fd44:4ff0:adda::/48

Mise en place de la passerelle sur le routeur Cisco pour le vlan concerné :

Vlan concerné : 10

Adressage IPv6 : fd44:4ff0:adda:10::/64

cisco#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
cisco(config)#ipv6 unicast-routing
cisco(config)#int fa 0/0.10
cisco(config-subif)#ipv6 enable
cisco(config-subif)#ipv6 address FD44:4FF0:ADDA:10::1/64
cisco(config-subif)#
cisco#ping FD44:4FF0:ADDA:10::1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to FD44:4FF0:ADDA:10::1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 0/0/0 ms

Sur un pc du vlan :

ifconfig eth0 inet6 add FD44:4FF0:ADDA:10::5/64
 
pc:# ping6 FD44:4FF0:ADDA:10::1
PING FD44:4FF0:ADDA:10::1(fd44:4ff0:adda:10::1) 56 data bytes
64 bytes from fd44:4ff0:adda:10::1: icmp_seq=1 ttl=64 time=1.09 ms
64 bytes from fd44:4ff0:adda:10::1: icmp_seq=2 ttl=64 time=1.10 ms

Et voila, rien de bien compliqué.

Si vous souhaitez ajouter une route statique ou par défaut, par exemple vers FD44:4FF0:ADDA:33::5

cisco(config)#ipv6 route ::/0 FD44:4FF0:ADDA:33::5

Pour vos ACL même genre (ipv6 access-list)

Un petit blog a lire avec quelques trucs et astuces Cisco et IPv6 : http://www.gho.no/tag/ipv6/

Vous pouvez donc déployer IPv6 dans votre LAN sans être routé sur Internet.

Bien évidemment, rien ne vous interdit d’utiliser les adresses IPv6 publiques dont vous disposez.

Voila pour une approche tout en douceur de l’IPv6, j’espère que ce billet vous a donner envie de manipuler un peu IPv6 et de vous préparer à la Fin du Monde :-D

Amusez-vous bien ;-)

18 Commentairess :, , , plus...

Vous cherchez quelque chose ?

Utilisez le formulaire ci-dessous:

Vous ne trouvez pas ce que vous voulez ? Laisser un Commentaire sur un Billet !