29/07/2009
200907292215 openwrt cluster dhcp dns ntp makefile
Openwrt et haute dispo
Le nombre d'openwrt dans mon bureau ne cesse d'augmenter (et les promos sur http://shop.fon.com n'arrange rien :) je me suis demandé comment mettre en oeuvre un peu de haute-dispo (histoire de faire hype).
Principaux services concernés:
- dhcp
- dns
- ntp
J'ai pour ce faire un Netgear DG834, une Fonera et une Fonera+, tous sous Kamikaze (8.09 et 8.09.1).
Le dhcp
Ayant désactivé le dhcp de ma box, c'est donc une de mes fonera qui a pris le relai. A force de google et de wiki openwrt, je suis arrivé à la configuration suivante:
[ extrait /etc/config/dhcp ]
config dhcp lan
option interface lan
option start 100
option limit 150
option leasetime 60h
list dhcp_option '3,192.168.0.254' # gateway
list dhcp_option '6,192.168.0.251,192.168.0.230,192.168.0.250' # dns
list dhcp_option '42,ntp.localdomain.tld' # ntp-server
option force 1 # pas de test si un autre serveur dhcp est sur le reseau
J'ai recopié cette config sur les deux autres openwrt. J'ai donc 3 serveurs dhcp et au niveau client, c'est le serveur qui répond le plus vite qui gagne.
ntp
Un round-robin dns fait l'affaire. Chaque openwrt a un alias "ntp".
dns
Le sujet de ce billet. Afin que mes 3 dnsmasq me répondent tous la même chose, il me faut synchroniser 2 fichiers: /etc/config/luci_ethers et /etc/config/luci_hosts. /etc/config/luci_ethers pour faire du dhcp à baux permanents (une adresse mac aura toujours la même adresse ip) et /etc/config/luci_host qui s'occupe de la conversion ip <-> host.
dnsmasq n'a pas de notion maitre/esclave et je ne vais pas installer rsync pour 2 fichiers. De plus, l'ordre d'arrêt/démarrage des 3 services (luci_ethers, luci_host, dnsmasq) a son importance. Un petit script perl, un Makefile et le tour est joué:
dsx@linutop>vim dns.pl (ajout d'une adresse {mac, ipv4, ipv6} ou un alias)
dsx@linutop>make
./dns.pl luci_hosts > luci_hosts
./dns.pl luci_ethers > luci_ethers
dsx@linutop>make update
scp -q luci_hosts luci_ethers openwrt1:/etc/config/
scp -q luci_hosts luci_ethers openwrt2:/etc/config/
scp -q luci_hosts luci_ethers openwrt3:/etc/config/
dsx@linutop>make restart
ssh openwrt1 ' /etc/init.d/dnsmasq stop; /etc/init.d/luci_hosts stop; /etc/init.d/luci_ethers stop; /etc/init.d/luci_ethers start; /etc/init.d/luci_hosts start; /etc/init.d/dnsmasq start; '
Terminated
ssh openwrt2 ' /etc/init.d/dnsmasq stop; /etc/init.d/luci_hosts stop; /etc/init.d/luci_ethers stop; /etc/init.d/luci_ethers start; /etc/init.d/luci_hosts start; /etc/init.d/dnsmasq start; '
Terminated
ssh openwrt3 ' /etc/init.d/dnsmasq stop; /etc/init.d/luci_hosts stop; /etc/init.d/luci_ethers stop; /etc/init.d/luci_ethers start; /etc/init.d/luci_hosts start; /etc/init.d/dnsmasq start; '
Terminated
Le tout est disponible ici. Toute remarque est la bienvenue :)
08/12/2008
200812080800 ntp openntpd
OpenNTPD
Hier
J'utilisais le ntpd livré avec FreeBSD 7.0. Dernièrement, un petit tour dans les logs:Nov 16 21:00:00 kimsufi ntpd[82662]: too many recvbufs allocated (40) Nov 16 21:00:00 kimsufi ntpd[82662]: last message repeated 29 times
Répété plein de fois. Moyen.
Aujourd'hui
compil> cd /usr/port/net/openntpd && sudo make package kimsufi# pkg_add /zfs/jail/compil/usr/ports/packages/All/openntpd-3.9p1_2,2.tbzLa configuration est basique:
listen on * server ntp.ovh.net server ntp.via.ecp.fr server 0.fr.pool.ntp.org server 2.fr.pool.ntp.frReste à logguer l'activité de notre démon. Petite astuce sous FreeBSD uniquement: nous avons à notre disposition une facility NTP.
kimsufi# echo 'ntp.* /var/log/ntp.log' >> /etc/syslog.conf kimsufi# touch /var/log/ntp.log kimsufi# echo '/var/log/ntp.log 640 7 * @T00 JN' >> /etc/newsyslog.conf kimsufi# pkill -HUP syslogd kimsufi# /usr/local/etc/rc.d/openntpd start
Demain
Un petit tour dans notre fichier de log:Dec 8 20:03:38 kimsufi ntpd[83742]: malformed packet received from @IP
Cela sent le scan à plein nez, des nouveaux clients pour la table spammers de mon pf.conf !
14/11/2008
200811140800 ntp ipv6 ntp.org
NTP et IPV6
6tuation
Je faisais mumuse avec de l'ipv6 sur une Fonera 2200 / OpenWRT lorsque le besoin s'est fait sentir
d'un serveur de temps ipv6 ready. Mon ami google m'a fait (justement) connaitre
J'ai donc décidé de monter mon(es) serveur(s) de temps.
6tèmes
- freebsd
- openwrt
Kimsufi / FreeBSD 7.0
Rien de particulier, le système de base comprenant un ntpd:kimsufi# grep ntpd /etc/rc.conf ntpd_enable="YES" ntpd_sync_on_start="YES" ntpd_flags="-L -p /var/run/ntpd.pid -f /var/db/ntpd.drift" kimsufi# cat /etc/ntp.conf server ntp.ovh.net server ntp.via.ecp.fr server 0.fr.pool.ntp.org server 2.fr.pool.ntp.fr driftfile /var/db/ntp.drift
ntp.ovh.net est un serveur de niveau 1 (GPS).
Extrait du pf.conf:
kimsufi# grep ntp /etc/pf.conf
pass quick on $ext_if inet proto { udp,tcp } from any to any port ntp
pass quick on $ext_if inet6 proto { udp,tcp } from any to any port ntp
Une fois le dns correctement renseigné on peut ajouter notre serveur à pool.ntp.org. La procédure se résume à la création d'un compte et un formulaire vous permet d'ajouter votre(vos) serveur(s) au pool (vérifiez votre pf.conf avant, vous gagnerez du temps :)
Fonera 2200 / OpenWRT (snapshot du 20081104)
Connectivité ipv6:# opkg install kmod-ipv6 # opkg install ip6tables # opkg install kmod-ip6tables # opkg install ipDans le but d'avoir une machine ipv6 only, je remplace dropbear par openssh. Cette manipulation ne peut se faire qu'avec une console série:
# opkg install openssh-client # opkg install openssh-serverServeur ntp:
# opkg install openntpd # cat /etc/ntp.conf server ntp6.bsdsx.fr server ntp6.space.net server ntp.via.ecp.fr server ntp2.cines.frC'est parti:
# /etc/init.d/ntp start
ip6tables
En simplifiant, ipv6 affecte au moins deux adresses ip à chaque interface: une limitée au réseau local (fe80.....) et une autre publique, routable et accessible depuis n'importe où.
Il faut donc filtrer les accès aux machines ipv6:
# cat /etc/init.d/firewall6
#!/bin/sh /etc/rc.common
# Copyright (C) 2008 OpenWrt.org
START=46
PRIVATE=fe80::aaaa:bbbb:cccc:dddd
start() {
# raz des regles
ip6tables -F
ip6tables -X
# on DROP tout le traffic entrant
ip6tables -P INPUT DROP
# pas de filtre sur l'interface lo
ip6tables -A INPUT -i lo -j ACCEPT
# pas de filtre sur l'adresse lien-local
ip6tables -A INPUT -d $PRIVATE -j ACCEPT
# on laisse entrer icmpv6
ip6tables -A INPUT -p icmpv6 -j ACCEPT
# les reponses NTP
ip6tables -A INPUT -p udp --sport ntp -j ACCEPT
}
stop() {
ip6tables -F
ip6tables -X
ip6tables -P INPUT ACCEPT
}
Les puristes d'ip[6]tables me pardonneront (je l'espère :) ce script un peu trop simpliste.
La Fonera est désormais accessible uniquement sur son adresse privée. Si on tente,
depuis une machine située sur le même lien:
dsx@mini>ping6 -c 1 fe80::aaaa:bbbb:cccc:dddd PING6(56=40+8+8 bytes) fe80::1%lo0 --> fe80::aaaa:bbbb:cccc:dddd ping6: sendmsg: Network is unreachable ping6: wrote fe80::aaaa:bbbb:cccc:dddd 16 chars, ret=-1 ^C --- fe80::aaaa:bbbb:cccc:dddd ping6 statistics --- 1 packets transmitted, 0 packets received, 100.0% packet lossEt là, c'est le drame. Notre ami google nous apprend rapidementt qu'avec ipv6, en cas d'utilisation d'adresse locale il faut préciser l'interface de sortie:
dsx@mini>ping6 -c 1 fe80::aaaa:bbbb:cccc:dddd%ne3 PING6(56=40+8+8 bytes) fe80::wwww:xxxx:yyyy:zzzz%ne3 --> fe80::aaaa:bbbb:cccc:dddd%ne3 16 bytes from fe80::aaaa:bbbb:cccc:dddd%ne3, icmp_seq=0 hlim=64 time=1.566 ms --- fe80::aaaa:bbbb:cccc:dddd%ne3 ping6 statistics --- 1 packets transmitted, 1 packets received, 0.0% packet loss round-trip min/avg/max/std-dev = 1.566/1.566/1.566/NaN msReste à vérifier notre serveur ntp:
# /etc/init.d/ntp stop # ntpd -d reply from 2001:41d0:1:34b6::1: offset -0.011423 delay 0.082885, next query 9s reply from 2001:660:6301:f13::2:1: offset -0.005595 delay 0.092083, next query 7s reply from 2002:8ac3:802d:1243::71: offset -0.014533 delay 0.096260, next query 5s reply from 2001:608::1000:1: offset 0.001858 delay 0.100866, next query 5s reply from 2002:8ac3:802d:1243::71: offset -0.010519 delay 0.086758, next query 8s reply from 2001:608::1000:1: offset -0.199183 delay 0.498697, next query 6s reply from 2001:660:6301:f13::2:1: offset 0.003043 delay 0.070645, next query 6s
Mer6
Possédant plusieurs Fonera, j'ai décidé d'utiliser ces mini routeurs wifi pour découvrir ipv6. Cette démarche a été riche d'enseignements:
- participation au pool ntp.org
- ipv6
- ip6tables
A venir:
- dnmasq (ipv6 compliant :)
- ipv6 + ipsec sur le lien wifi
- un antique routeur adsl Netgear supporté par OpenWRT
- passer le réseau local en ipv6 only (pas facile avec un iPhone :)
Merci à toute l'équipe d'OpenWRT pour leur fantastique travail et à www.pouf.org qui m'a incité à rejoindre ntp.org.
![Validate my Atom 1.0 feed [Valid Atom 1.0]](/valid-atom.png)
![Validate my RSS feed [Valid RSS]](/valid-rss-rogers.png)