Remplacer la livebox fibre par une machine OpenBSD
Si vous avez l’offre fibre orange avec internet by orange la première chose à faire est de se débarrasser de la boite noire qu’est la livebox. On trouve des tutoriels complets pour Linux ici ou là, voilà la manip pour OpenBSD (testé sur 5.1). Ma machine est une Alix 2D3 (avec 3 interfaces réseau) et j’ai installé OpenBSD 5.1 avec flashrd.
Comme expliqué sur les liens ci-dessus, il faut se connecter en PPPoE sur le vlan 835 qui sort du convertisseur fibre/rj45. J’ai choisi d’utiliser pppoe(4) qui est l’implémentation kernel d’un client PPPoE. J’ai 3 interfaces réseau, une branchée au réseau local (vr0) et une qui va servir à PPPoE (vr1):
$ cat /etc/hostname.vr0
inet 192.168.31.254 255.255.255.0 NONE
$ cat /etc/hostname.vr1
up
$ cat /etc/hostname.vlan835
vlan 835 vlandev vr1 up
# L'interface pppoe. Vous trouverez IDENTIFIANT et PASSWORD dans un des
# courrier d'Orange.
$ cat /etc/hostname.pppoe0
inet 0.0.0.0 255.255.255.255 NONE pppoedev vlan835 authproto chap authname 'fti/IDENDIFIANT' authkey 'PASSWORD' up
dest 0.0.0.1
!/sbin/route add default -ifp pppoe0 0.0.0.1
# Ne pas oublier de forward (à décommenter dans /etc/sysctl.conf)
$ sysctl net.inet.ip.forwarding=1
# On lance tout ça
$ sh /etc/netstart
Maintenant on fait une config pf minimale qui fait du NAT pour notre réseau local.
int_if = "vr0"
ext_if = "pppoe0"
set skip on { lo vlan835 vr1 }
# Pour fixer le problème de MTU/MSS, cf pppoe(4)
match on $ext_if scrub (max-mss 1440)
block log all
pass inet proto icmp all icmp-type { echoreq unreach }
pass in on $int_if from $int_if:network to !$int_if:0
pass in on $int_if proto tcp from $int_if:network to $int_if:0 port ssh
pass out on $ext_if from ($ext_if:0)
pass out on $ext_if from $int_if:network to any nat-to ($ext_if:0)
# By default, do not permit remote connections to X11
block in on ! lo0 proto tcp to port 6000:6010
Et la cerise sur le gâteau, voilà mon script qui met à jours mon IP (qui est dynamique, merci Orange) sur mon serveur DNS avec nsupdate qui implémente la RFC 2136, le tout est monitoré par ifstated(8)
# La config ifstated(8)
$ cat /etc/ifstated.conf
init-state auto
# On check toutes les 30 secondes
ip_check = '( "/root/pppoe.sh check" every 30)'
state auto {
if ! $ip_check {
run "/root/pppoe.sh update"
}
}
# Et le script magique
$ cat /root/pppoe.sh
#!/bin/sh
# IP sur l'interface pppoe0
pppoe0_addr=$(ifconfig pppoe0 | awk '$1 == "inet" && $3 == "-->" { print $2 }')
if [ "$1" = "check" ]; then
# L'ip déclarée sur le serveur DNS.
old_addr=$(dig @178.33.42.27 +short ns0.philpep.org)
test "$pppoe0_addr" = "$old_addr"
exit $?
elif [ "$1" = "update" ]; then
# Met à jours l'IP sur le serveur DNS (avec un ttl de 5 minutes)
cat << EOF | nsupdate -k /root/K0root.philpep.org.+157+00000.private
server 178.33.42.27
update delete ns0.philpep.org A
update add ns0.philpep.org 300 A $pppoe0_addr
send
EOF
exit 0
else
echo "Usage $0 (check|update)"
exit 64
fi