20/04/2010
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
Où 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.
27/06/2009
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=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=2808<VLAN_MTU,WOL_UCAST,WOL_MAGIC>
ether 00:15:f2:5d:cc:a0
inet6 2001:41d0:1:34b6::17 prefixlen 128
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
lo1: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
inet 172.16.0.17 netmask 0xffffffff
pflog0: flags=141<UP,RUNNING,PROMISC> 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<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=2808<VLAN_MTU,WOL_UCAST,WOL_MAGIC>
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 <full-duplex>)
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
lo1: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
inet 172.16.0.17 netmask 0xffffffff
pflog0: flags=141<UP,RUNNING,PROMISC> 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'à:
- 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
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 http://www.pouf.org/categories/3-IPv6 et plus précisément http://www.pouf.org/archives/95-Public-IPv6-NTP-Server.html
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:
- 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.
Pages : 1
Rss