Tags

arm arpaname bin_sh blocage blosxom bsd bsdfrance cblog certification chroot cluster dg834 dhcp dns dnsmasq domU dovecot fail-over fail2ban firefox freebsd ftp git guruplug install ipv6 jail kernel kimsufi lex libre linutop makefile ml150 mohawk netbook netbsd nginx ntp ntp.org openbsd openntpd openrd openwrt orke pkgng poudriere proxy python rescue reverse rmll route rrdcgi sendmail sieve sl2009 ssd symon update usb var_empty vimperator world xen yacc zfs

Powered by

blOg
maRkdown
awK
shEll

31/03/2013

[ arpaname reverse ipv6 ]

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:

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 :)


Lien vers ce billet

20/04/2010

[ openwrt xen route ipv6 ]

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:f84c
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=1
Et pour éviter un message désagréable au boot:
root@d531# echo 'ipv6' >> /etc/modules
J'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  *^C
Hum, 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 ms
Un 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.


Lien vers ce billet

27/06/2009

[ jail ipv6 ]

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:

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=8843 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
On 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:
# 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=8843 metric 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 ssh
Mais 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'à:

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... :)


Lien vers ce billet

14/11/2008

[ ntp ipv6 ntp.org ]

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 et plus précisément

J'ai donc décidé de monter mon(es) serveur(s) de temps.

6tèmes

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 ip
Dans 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-server
Serveur ntp:
# opkg install openntpd
# cat /etc/ntp.conf
server ntp6.bsdsx.fr
server ntp6.space.net
server ntp.via.ecp.fr
server ntp2.cines.fr
C'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 loss
Et 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 ms
Reste à 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:

A venir:

Merci à toute l'équipe d'OpenWRT pour leur fantastique travail et à www.pouf.org qui m'a incité à rejoindre ntp.org.


Lien vers ce billet