mars 05, 2009 Archives

jeudi 5 mars 2009, 17:18:28 (UTC+0100)

Tunnel v6v4 et IPv4 dynamique

Suite à tous mes petits joujoux avec IPv6, voici que j'essaie de mettre en place à la maison un point d'accès WiFi complètement v6.

Pour réaliser cela rien de tel qu'un Unix :-)

Il me faut donc implémenter un routeur capable de répondre aux RA (Router Advertisement), un serveur DHCPv6, et un serveur de nom v6.
Ce dernier fera simplement forwarder vers du v4, mais bon on verra à faire mieux plus tard.

Mon seul problème, c'est qu'à la maison quid d'adresse IPv4 publique __statique__.
Il me faut donc mettre à jour mon tunnel chez Hurricane Electric, lorsque le BAS me coupe la session ou bien que ma livebox reboote. Pour ce faire, rien de tel qu'un petit script :
[...]
function whatismyip {
        curl -s "http://whatismyip.com/automation/n09230945.asp"
}
[...]
${IP} tunnel add ${TUNNEL_IFACE} mode sit remote ${INET_REMOTE_ENDPOINT} \
	local ${INET_LOCAL_ENDPOINT} ttl 255
${IP} link set ${TUNNEL_IFACE} up
${IP} addr add ${INET6_LOCAL_ENDPOINT} dev ${TUNNEL_IFACE}
${IP} route add ::/0 dev ${TUNNEL_IFACE}
[...]
TMPFILE=`mktemp -q -t ${SCRIPT_NAME}.XXXXX`

INET_LOCAL_ENDPOINT=`whatismyip`

${WGET} -O /dev/null --keep-session-cookies \
	"--post-data=f_user=${USER}&f_pass=${PASSWORD}&clearpass=" \
	--save-cookies=${TMPFILE} \
	http://ipv4.tunnelbroker.net/login.php 2>/dev/null
${WGET} -O /dev/null --load-cookies=${TMPFILE} \
	"--post-data=ipv4b=${INET_LOCAL_ENDPOINT}&tunnel_id=${TUNNEL_ID}&update=Submit" \
	http://ipv4.tunnelbroker.net/ipv4_update.php 2>/dev/null
${RM} -f ${TMPFILE}
Le script complet est disponible ici. Ce script provient du billet ci.
Néanmois, j'ai un peu modifié le script original. En effet, pour pouvoir faire des choses intéressantes en dehors du NAT, j'ai dû mettre une machine sur une DMZ depuis ma livebox.
Donc l'adresse IP à mettre dans le 'ip tunnel...' en tant que 'local' est l'adresse IP privée de votre machine, et non l'adresse IP publique de votre accès à Internet (Logique, mais bon...).
Les dernières lignes avec ${WGET} permettent de mettre à jour l'adresse IPv4 publique de fin du tunnel sur le site de HE.
Mon fichier de configuration :
vmsplice:/etc/bind# cat ~/.tunnelconfig 
IFACE=br0
# User
USER=clucas
# MD5 Password (echo -n 'votre pass' | openssl md5 
PASSWORD=XXXXXXXXXXXXXXXXXXX 
TUNNEL_ID=22215
PREFER_SUDO=
TUNNEL_IFACE=he-ipv6
INET_REMOTE_ENDPOINT=216.66.84.42
INET6_REMOTE_ENDPOINT=2001:470:1f12:6bc::1/64
INET6_LOCAL_ENDPOINT=2001:470:1f12:6bc::2/64
INET_LOCAL_ENDPOINT=br0
Et un script Shell dans le crontab pour voir si le tunnel se casse la tronche :
vmsplice:~# crontab -l
# m h  dom mon dow   command
*/5 * * * * /root/bin/cron_tunnel.sh
vmsplice:~# cat /root/bin/cron_tunnel.sh 
#!/bin/bash

ping -6 -c 3 www.crihan.fr > /dev/null 2>&1 
if [ $? -ne 0 ]; then
# On ne pingue pas en v6
	ping -c 3 www.mcom.fr > /dev/null 2>&1
        if [ $? -eq 0 ]; then
		# Ok on pingue en v4. Donc suremnet endpoint pas bon
	        ip link set he-ipv6 down
	        ip tunnel del he-ipv6 
	        /bin/bash /root/bin/setup-he.sh
	fi
fi
Passons maintenant à nos amis nommés bind9, radvd et wide-dhcpv6-server.
Un petit apt-get install plus tard...
Mes fichiers de configurations :
vmsplice:~# cat /etc/radvd.conf
interface ath0
{
        # (Send advertisement messages to other hosts)
        AdvSendAdvert on;
        #(Fragmentation is bad(tm))
        AdvLinkMTU 1280;
        MaxRtrAdvInterval 300;
        #(IPv6 subnet prefix we've been assigned by our PoP)
	prefix 2001:470:1F12:6BC::/64
        {
                AdvOnLink on;
                AdvAutonomous on;
        };
};
vmsplice:~# cat /etc/bind/named.conf.options 
options {
        directory "/var/cache/bind";

	forwarders {
		192.168.1.1;
	};

	auth-nxdomain no;    # conform to RFC1035
	listen-on-v6 { any; };
};	
vmsplice:~# cat /etc/wide-dhcpv6/dhcp6s.conf
option domain-name-servers 2001:470:1f13:6bc::1;

interface ath0 {
        address-pool pool1 3600;
};

pool pool1 {
        range 2001:470:1f13:6bc::1000 to 2001:470:1f13:6bc::2000;
};
vmsplice:~#
La suite un peu plus tard...