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 , 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