31/03/2013
201303311315 arpaname reverse ipv6
arpaname et la résolution de nom inverse
C'est à la lecture d'un article de sieur iMil 'master prosel NetBSD' himself, paru dans le Gnu Linux Magazine France n° 159 que j'ai découvert la commande arpaname. Faisant partie du projet Bind, livrée de base avec FreeBSD et NetBSD (les utilisateurs d'OpenBSD peuvent installer net/isc-bind), cette commande traduit une adresse ip en version arpa:
$ dig ipv6.l.google.com AAAA +short 2a00:1450:4007:804::1011 $ arpaname 2a00:1450:4007:804::1011 1.1.0.1.0.0.0.0.0.0.0.0.0.0.0.0.4.0.8.0.7.0.0.4.0.5.4.1.0.0.A.2.IP6.ARPA
Mais dites donc, ça ne ressemblerait pas aux enregistrements PTR des fichiers de résolution de nom inverse ipv6 ? Vous savez, les trucs super chiants où au mieux on oublie un zéro et au pire on le place mal ? Je ne sais pas si des outils existent pour faciliter la création de ces fichiers et je n'ai pas beaucoup cherché, je l'avoue :). Aussi je me suis fendu d'un petit script sans prétention que je vous livre :
1 #!/bin/sh
2
3 DEFAULT_DOMAIN=example.com
4 LOWER=0
5 NETMASK="/48"
6 VERBOSE=0
7
8 DEFAULT_HOSTS="www mail imap"
9 SCRITP_NAME=$(basename $0)
10
11 usage() {
12 echo "Usage: ${SCRITP_NAME} [-d domain.tld] [-l] [-n (/48 | /64)] [-v] [host | host.domain.tld ...]
13 -d domain.tld add domain.tld if needed
14 -l lower form
15 -n /netmask netmask (default /48)
16 -v verbose mode
17 "
18 }
19
20 ARPANAME=$(/usr/bin/which arpaname)
21 if [ $? -ne 0 ]; then
22 echo "Can't find arpaname"
23 exit 1
24 fi
25
26 args=$(getopt d:ln:hv $*)
27 if [ $? -ne 0 ]; then
28 usage
29 exit 2
30 fi
31
32 set -- $args
33 while [ $# -ge 0 ]; do
34 case "$1" in
35 -d)
36 DEFAULT_DOMAIN="$2"; shift; shift;;
37 -l)
38 LOWER=1; shift;;
39 -n)
40 NETMASK="$2"; shift; shift;;
41 -h)
42 usage; exit;;
43 -v)
44 VERBOSE=1; shift;;
45 --)
46 shift; break;;
47 esac
48 done
49
50 LEN=
51 case "${NETMASK}" in
52 *48)
53 LEN=39; break;;
54 *64)
55 LEN=29; break;;
56 *)
57 echo "'${NETMASK}': invalid value"; usage; exit 1;;
58 esac
59
60 for host in ${DEFAULT_HOSTS} $@; do
61
62 case ${host} in
63 *.*.*) ;;
64 *)
65 host="${host}.${DEFAULT_DOMAIN}";;
66 esac
67
68 IPV6=$(dig ${host} AAAA +short)
69 if [ "X${IPV6}" = "X" ]; then
70 echo ";Can't resolv '${host}'"
71 continue
72 fi
73
74 if [ $VERBOSE -eq 1 ]; then
75 echo ";${host} ${IPV6}"
76 fi
77 IPV6=$(${ARPANAME} ${IPV6} | cut -c 1-${LEN})
78 if [ $LOWER -eq 1 ]; then
79 IPV6=$(echo ${IPV6} | tr '[A-Z]' '[a-z]')
80 fi
81 printf "%s\tIN\tPTR\t%s.\n\n" ${IPV6} ${host}
82
83 done
Pour utiliser ce script, il faut:
- le télécharger
- renseigner la variable DEFAULT_DOMAIN (ligne 3) ou utiliser l'option -d
- définir le masque de réseau utilisé en renseignant la variable NETMASK (ligne 5) ou utiliser l'option -n
- éventuellement forcer la présence d'hôte(s) en renseignant la variable DEFAULT_HOSTS (ligne 8).
Un exemple pour la route:
$ ./reverse_ipv6.sh -d google.com -n /64 ipv6.l 1.1.0.1.0.0.0.0.0.0.0.0.0.0.0 IN PTR ipv6.l.google.com. $ .reverse_ipv6.sh -d google.com -n /48 -v ipv6.l blog.bsdsx.fr ;ipv6.l.google.com 2a00:1450:4007:803::1011 1.1.0.1.0.0.0.0.0.0.0.0.0.0.0.0.3.0.8.0 IN PTR ipv6.l.google.com. ;blog.bsdsx.fr 2a02:27d0:100:f205:a642::80 0.8.0.0.0.0.0.0.0.0.0.0.2.4.6.A.5.0.2.F IN PTR blog.bsdsx.fr.
Si vous avez des enregistrements AAAA dans vos fichiers de zone, plus d'excuse pour ne pas faire le reverse :)
20/04/2010
201004202206 openwrt xen route ipv6
OpenWRT, Xen et ipv6
Dans un précédent billet, je décrivais ma configuration xen. Il ne me manquait qu'une seule chose: l'ipv6. Je dois bien avouer que ça ne s'est pas fait en un jour.
J'ai commencé par configurer mon routeur:root@fonera# route -A inet6 add 2001:470:ca75:100::/64 gw 2001:470:ca75:20:224:1ff:fe0f:f84cOù 2001:470:ca75:100::/64 est le réseau dédié aux hosts xen et 2001:470:ca75:20:224:1ff:fe0f:f84c l'ipv6 du dongle wifi du portable. Qui dit routage dit forwarding:
root@d531# grep forwarding= /etc/sysctl.conf net.ipv6.conf.all.forwarding=1Et pour éviter un message désagréable au boot:
root@d531# echo 'ipv6' >> /etc/modulesJ'ai cru avoir une bonne idée en utilisant eth0 (qui me sert très peu) mais c'est vraiment une très mauvaise idée:
root@d531# tail -n 8 /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.1.116
netmask 255.255.255.0
iface eth0 inet6 static
address 2001:470:ca75:100::1
netmask 64
root@d531# ifconfig eth0 | grep inet6
adr inet6: 2001:470:ca75:100::1/64 Scope:Global
root@d531# ping6 -c 1 -W 1 2001:470:ca75:100::1
PING 2001:470:ca75:100::1(2001:470:ca75:100::1) 56 data bytes
--- 2001:470:ca75:100::1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
L'absence d'adresse lien-local ne doit pas être innocente dans cette affaire. Une (lllooonnnggggguuuuueeee)
série de ping, reboot, man, google, ifup/ifdown plus tard, une idée me traverse la tête: pourquoi ne pas
utiliser une interface virtuelle ?
root@d531# tail -n 8 /etc/network/interfaces
auto dummy0
iface dummy0 inet static
address 10.0.0.1
netmask 255.255.255.0
iface dummy0 inet6 static
address 2001:470:ca75:100::1
netmask 64
root@d531# ifconfig dummy0 | grep inet6
adr inet6: 2001:470:ca75:100::1/64 Scope:Global
adr inet6: fe80::9082:a4ff:fe06:92bc/64 Scope:Lien
root@d531# ping6 -c 1 -W 1 2001:470:ca75:100::1
PING 2001:470:ca75:100::1(2001:470:ca75:100::1) 56 data bytes
64 bytes from 2001:470:ca75:100::1: icmp_seq=1 ttl=64 time=0.030 ms
--- 2001:470:ca75:100::1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.030/0.030/0.030/0.000 ms
root@linuto# ping6 -n -c 1 2001:470:ca75:100::1
PING6(56=40+8+8 bytes) 2001:470:ca75:10:214:bff:fe80:337b --> 2001:470:ca75:100::1
16 bytes from 2001:470:ca75:100::1, icmp_seq=0 hlim=63 time=7.855 ms
--- 2001:470:ca75:100::1 ping6 statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 7.855/7.855/7.855/nan ms
It works! Passons à la configuration de xen. Le script vif-route ne prend pas en compte l'ipv6. Heureusement, je ne suis pas seul: http://notes.benv.junerules.com/all/software/xen-and-routed-ipv6/.
J'en profite pour proposer une version perless ici. On précise à xen qu'on utilise une autre interface qu'eth0:root@d531# grep '\-route' /etc/xen/xend-config.sxp (network-script 'network-route netdev=dummy0') (vif-script 'vif-route netdev=dummy0')Un dernier reboot pour vérifier que le tout survit à un redémarrage et c'est parti:
root@d531# grep vif /etc/xen/openwrt.bsdsx.fr.cfg
vif = [ 'ip=10.0.0.33 2001:470:ca75:100::33,mac=00:16:3E:6D:BB:94' ]
root@d531# xm create -c openwrt.bsdsx.fr.cfg
[ snip boot ]
root@OpenWrt:/# ifconfig br-lan|grep inet6
inet6 addr: 2001:470:ca75:100::33/64 Scope:Global
inet6 addr: fe80::ac65:afff:fed8:dcc4/64 Scope:Link
Et ça marche ?
root@linutop# traceroute6 -n 2001:470:ca75:100::33 traceroute6 to 2001:470:ca75:100::33 (2001:470:ca75:100::33) from 2001:470:ca75:10:214:bff:fe80:337b, 64 hops max, 12 byte packets 1 2001:470:ca75:10::1 1.761 ms 1.73 ms 1.324 ms 2 2001:470:ca75:20:224:1ff:fe0f:f84c 4.317 ms 9.467 ms 10.127 ms 3 *^CHum, pas trop. Un coup de tcpdump plus tard et je me rends compte qu'il manque une route par défaut sur l'invité:
root@OpenWrt:/# ip -6 ro add default via 2001:470:ca75:100::1 root@OpenWrt:/# ping6 -c 1 www.kame.net PING www.kame.net (2001:200:0:8002:203:47ff:fea5:3085): 56 data bytes 64 bytes from 2001:200:0:8002:203:47ff:fea5:3085: seq=0 ttl=52 time=314.763 ms --- www.kame.net ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 314.763/314.763/314.763 msUn dernier tour sur http://wiki.openwrt.org/doc/uci/network pour enregistrer la route:
root@OpenWrt:/# tail -n 4 /etc/config/network
config 'route6'
option 'interface' 'lan'
option 'target' 'default'
option 'gateway' '2001:470:ca75:100::1'
Et voilà, c'est bon, servez chaud. Bon appétit.
27/06/2009
200906271840 jail ipv6
Jail et ipv6
Depuis FreeBSD 7.2, les jails peuvent avoir aucune, une ou des adresses ipv4 et/ou ipv6. Si l'utilisation d'une jail sans ip peut s'apparenter à un chroot, que faire de plusieurs ipv4/ipv6 ? Allons faire un tour au pays des jails.
/etc/rc.conf mono ip
jail_essai_rootdir=/zfs/jail/essai jail_essai_hostname=essai.bsdsx.fr jail_essai_ip=172.16.0.42 jail_essai_interface=lo1 jail_essai_devfs_enable="YES" jail_essai_devfs_ruleset="devfsrules_jail"
Pour une jail à l'ancienne, il nous faut:
- une interface (ici lo1, clone de lo0)
- une ipv4 (172.16.0.42)
La configuration des services tournant dans cette jail est assez simple: tous les démons doivent écouter 172.16.0.42 (sshd -> ListenAddress, lighttpd -> server.bind, nginx -> listen ...)
/etc/rc.conf v4 + v6
jail_essai_rootdir=/zfs/jail/essai jail_essai_hostname=essai.bsdsx.fr jail_essai_devfs_enable="YES" jail_essai_devfs_ruleset="devfsrules_jail" jail_essai_ip="lo1|172.16.0.42,vr0|2001:41d0:1:34b6::42"La syntaxe de l'option 'ip' a évolué. On peut désormais préciser l'interface d'une adresse ip. Ici, lo1 est notre interface privée et vr0 l'interface ipv6 publique.
# ifconfig vr0: flags=8843On remarquera l'apparition d'un lo0 (son absence dans les anciennes jails pouvait géner certains services). Les démons peuvent écouter sur toutes les interfaces, sans configuration particulière:metric 0 mtu 1500 options=2808 ether 00:15:f2:5d:cc:a0 inet6 2001:41d0:1:34b6::17 prefixlen 128 media: Ethernet autoselect (100baseTX ) status: active lo0: flags=8049 metric 0 mtu 16384 lo1: flags=8049 metric 0 mtu 16384 inet 172.16.0.17 netmask 0xffffffff pflog0: flags=141 metric 0 mtu 33160
# grep ListenAddress /etc/ssh/sshd_config #ListenAddress 0.0.0.0 #ListenAddress :: # netstat -an -f inet netstat: kvm not available: /dev/mem: No such file or directory Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp4 0 0 172.16.0.42.22 *.* LISTEN # netstat -an -f inet6 netstat: kvm not available: /dev/mem: No such file or directory Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) tcp6 0 48 2001:41d0:1:34b6.22 2a01:e35:2ee9:f6.35888 ESTABLISHED tcp6 0 0 2001:41d0:1:34b6.22 *.* LISTEN
/etc/rc.conf v4 + multi v6
jail_essai_ip_multi0="vr0|2001:41d0:1:34b6::43" jail_essai_ip_multi1="vr0|2001:41d0:1:34b6::44"Simple non ? Attention à ne pas faire de trou dans la numérotation des multi car sinon le script /etc/rc.d/jail ne les prendra pas en compte.
# ifconfig vr0: flags=8843metric 0 mtu 1500 options=2808 ether 00:15:f2:5d:cc:a0 inet6 2001:41d0:1:34b6::42 prefixlen 128 inet6 2001:41d0:1:34b6::43 prefixlen 128 inet6 2001:41d0:1:34b6::44 prefixlen 128 media: Ethernet autoselect (100baseTX ) status: active lo0: flags=8049 metric 0 mtu 16384 lo1: flags=8049 metric 0 mtu 16384 inet 172.16.0.17 netmask 0xffffffff pflog0: flags=141 metric 0 mtu 33160
Utilisation
L'accès aux services des anciennes jails se faisait en ipv4 uniquement. A nous les joies des redirections/translations (mais pf est notre ami :)nat on $ext_if from !($ext_if) -> ($ext_if:0) rdr pass on $ext_if proto tcp from <ssh_ok> to port 65080 -> 172.16.0.1 port ssh rdr pass on $ext_if proto tcp from <ssh_ok> to port 65081 -> 172.16.0.41 port sshMais maintenant que nos jails sont ipv6 ready:
pass quick on $ext_if inet6 proto tcp from <ssh6_ok> to any port ssh
hostname et jail
Petite précision: le nom d'une jail peut contenir un underscore mais pas de tiret. Un nom d'hôte ne peut pas contenir d'underscore.
Et maintenant
Il ne me reste plus qu'à:
- renseigner mon dns (enregistrement AAAA)
- configurer mes reverses dns (que ovh propose, n'est-ce pas messieurs de chez free)
- générer des certificats SSL
- m'amuser avec nginx, sendmail, ldap, bind et j'en passe
En effet, avec toutes ces adresses disponibles, on peut vraiment affecter une ipv6 à un service et/ou un domaine virtuel (virtual host, ssl, wildcard, toussa... :)
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)