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... :)
![Validate my Atom 1.0 feed [Valid Atom 1.0]](/valid-atom.png)
![Validate my RSS feed [Valid RSS]](/valid-rss-rogers.png)