Hello,
Je vais récapituler ici ce que j'ai fait, et qui est fonctionnel pour une machine OpenBSD 7.2+ (il y a eu des changements impactants dans la 7.2, entre autres la simplification de
dhclient qui nous est dorénavant inutile).
Si vous êtes ici, vous avez probablement une bonne idée de ce que vous faites (chers collègues barbus au chapeau d'alu) ; et si non, lisez le manuel, c'est surtout pour ça qu'on utilise OpenBSD.
Mon article original est en anglais.
Paquets nécessaires :
dhcpcd(8) (une version qui inclut
ce patch : fin mai 2023, il s'agit donc de la version
dhcpcd-10.0.1pl20230518v0 du paquet,
disponible dans les ports ou paquets) ;
igmpproxy(8) pour la TV.
(Pour info,
dibbler est mort en 2017)
On crée les fichiers
hostname.if(5) qui vont bien pour le VLAN832 (Internet).
# /etc/hostname.vlan832
# llprio c'est pour les paquets DHCP
parent em1 vnetid 832 llprio 6
description "ISP uplink"
up
# /etc/hostname.em1
# lladdr c'est la véritable MAC de la Livebox
lladdr "xx:xx:xx:xx:xx:xx"
up
Les tokens d'authentification à envoyer à Orange périment, donc on doit : générer régulièrement un token, l'intégrer dans
dhcpcd.conf(5) et demander à
dhcpcd(8) de MAJ la lease.
# cat /etc/dhcpcd.conf.head
# dual-stack IPv4 et IPv6
noipv4ll
nohook hostname ntp.conf
allowinterfaces vlan832
debug
# based on https://blog.brimbelle.org/index.php/2018/04/30/fibre-orange-ipv6-et-dhcpcd/
interface vlan832
# 00030001<MAC_ADDRESS_LIVEBOX_SANS_DEUXPOINTS> dans /var/db/dhcpcd/duid
# iaid below = 4 derniers octets de la MAC de la livebox
iaid 01234567
# on demande une route IPv6 par défaut -- pas besoin de hook spécifique
ipv6rs
# delegation de /64s à d'autres interfaces. rad(8) s'en occupera
# les interfaces ci-dessous dépendent bien sûr de votre config... j'ai un VLAN pour les invités, les enfants, l'IoT...
ia_pd 01234567 vlan49//64 vlan50//64 vlan51//64 em0//64
option auth
userclass FSVDSL_livebox.Internet.softathome.Livebox4
vendclass 1038 sagem
authprotocol token 0x123/0x456
# Le token 0x456 ci-dessous est un magic string (dhcplivebox250) qu'Orange renvoie
authtoken 0x456 "" forever 64:68:63:70:6c:69:76:65:62:6f:78:66:72:32:35:30
# TRÈS IMPORTANT, PAS DE RETOUR À LA LIGNE, JUSTE UNE ESPACE
# TRÈS IMPORTANT, FONCTIONNEL UNIQUEMENT AVEC dhcpcd > 9.4.1
authtoken 0x123 "" forever 🚫
Pour effacer le retour à la ligne à la fin du fichier, on utilise :
dest=/etc/dhcpcd.conf.head
dd if=/dev/null of="$dest" obs="$(( $(wc -c < "$dest") -1 ))" seek=1
Orange ne délivre pas d'IPv6 pour le routeur dans la lease DHCPv6, c'est pour ça qu'on a le
ipv6rs.
Pour générer le token d'authentification (option 90, etc.) :
un script largement inspiré du présent forum# cat /usr/local/bin/orange_hexauth
#!/bin/sh
# Heavily inspired by https://lafibre.info/remplacer-livebox/tuto-remplacer-la-livebox-par-un-routeur-dd-wrt-internet-tv/
__usage(){
cat << EOH
$0 [-h]
$0 creates a hex stream (that is not \\n terminated) that can be used in DHCP
clients (v4 and v6) to authenticate to Orange France's network. The hex stream
is intended to be cat(1)-ed with configuration parts to create a complete file
(such as dhclient.conf(5)).
-h : display this help text
ENVIRONMNENT VARIABLES
You MUST specify FTI_USER and FTI_PASS as written in your (paper) contract with
Orange.
EXAMPLES
In crontab:
FTI_USER=fti/...
FTI_PASS=...
~ 1 * * 0 $0 > /etc/orange_auth_string
~ 2 * * 0 cat /etc/dhclient.conf.head /etc/orange_auth_string /etc/dhclient.conf.tail > /etc/dhclient.conf
~ 3 * * 0 dhclient vlan832
CAVEATS
Only tested on OpenBSD
EOH
}
while getopts ':h' _opt; do
case "$_opt" in
h) __usage ; exit 0 ;;
*) __usage >&2 ; exit 1 ;;
esac
done
shift "$((OPTIND-1))"
: "${FTI_USER?"Missing mandatory variable, see $0 -h"}"
: "${FTI_PASS?"Missing mandatory variable, see $0 -h"}"
if ! command -v openssl >/dev/null 2>&1; then
echo "openssl(1) was no found. WTF?" >&2
exit 2
fi
if ! command -v md5 >/dev/null 2>&1; then
md5() {
openssl md5 | cut -d' ' -f2
}
fi
# translates individual characters to their hex counterpart and prefixes each
# with `:`
# __tohex foo
# > :66:6f:6f
__tohex() {
printf '%s' "$1" | hexdump -ve '1/1 ":%.2x"'
}
case "$FTI_USER" in
fti/*) : ;;
*) FTI_USER="fti/$FTI_USER" ;;
esac
# random strings
# let's hope this never changes, because if Orange starts using "predictable"
# strings, we're in deep (think: TOTP)
: "${_r:="$(openssl rand -base64 12)"}"
: "${_c:="$(openssl rand -base64 1 | cut -c 1)"}"
# "header"
_o90="1a:09:00:00:05:58:01:03:41"
_o90="$_o90:01:0d$(__tohex "$FTI_USER")"
_o90="$_o90:3c:12$(__tohex "$_r")"
_o90="$_o90:03:13$(__tohex "$_c")"
_o90="$_o90$(printf '%s' "$_c$FTI_PASS$_r" | md5 | sed 's/\(..\)/:\1/g')"
cat << EOM >&2
Generated on $(date) with _r=$_r and _c=$_c
EOM
echo -n "${_o90}"
Avant de vérifier que ça fonctionne, on doit s'occuper des priorités de paquets dans
pf.conf(5) :
# cat /etc/pf.conf
# martians also includes IPv6 martians
table <martians> { ... }
...
# tous les paquets ont priorité 1 et TOS 0x00
# (la priorité 0 limitait l'upload à 3Mbps alors que prio 1 : 300Mbps+)
match out log on egress set prio 1 tos 0x00
# pas de règle pour DHCPv4, c'est priorité 6 car llprio dans /etc/hostname.vlan832
# https://lafibre.info/remplacer-livebox/durcissement-du-controle-de-loption-9011-et-de-la-conformite-protocolaire/
# DHCPv6 COS 6
match out log on egress inet6 from (self) to ff02::1:2 set prio 6
match out log on egress inet6 proto icmp6 from (self) to fe80::ba0:bab icmp6-type { neighbrsol neighbradv } set prio 6
# peut-être n'est-ce pas nécessaire d'être aussi stricte dans les règles ci-dessus ? ce qui donne...
#match out log on egress inet6 proto icmp6 from (self) set prio 6
...
pass in quick log inet6 from fe80::ba0:bab to (self)
...
# NAT interieur -> extérieur pour les invités
match out log on egress inet from ($guest_if:network) to ! (self:network) nat-to (egress)
pass in quick log on $guest_if to ! (self:network)
# Martians should never be a source on packets going out
block out quick log on egress from <martians>
pass out quick log
# pfctl -vf /etc/pf.conf
Et maintenant on peut faire un premier test de
dhcpcd:
# FTI_PASS="..." FTI_USER="fti/..." /usr/local/bin/orange_hexauth > /etc/orange_auth_string
# cat !$
1a:09:00:00:05:58........
# cat /etc/dhcpcd.conf.head !$ > /etc/dhcpcd.conf
# dhcpcd -V
....
# ifconfig vlan832
vlan832: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
lladdr xx:xx:xx:xx:xx:xx
description: ISP link
index 11 priority 0 llprio 3
encap: vnetid 832 parent em1 txprio packet rxprio outer
groups: vlan egress
media: Ethernet autoselect (1000baseT full-duplex)
status: active
inet6 fe80::xxxx:xxff:fexx:xxxx%vlan832 prefixlen 64 scopeid 0xb
inet 90.xx.xx.xx netmask 0xfffffc00 broadcast 90.xx.xx.255
# netstat -nrfinet
Routing tables
Internet:
Destination Gateway Flags Refs Use Mtu Prio Iface
default 90.xx.xx.1 UG 6 123631 - 56 vlan832
...
# netstat -nrfinet6
Routing tables
Internet6:
Destination Gateway Flags Refs Use Mtu Prio Iface
default fe80::ba0:bab%vlan832 UGS 1 101587 - 8 vlan832
...
Et on automatise dans
crontab(5):
# retrouvez les valeurs dans votre contrat papier
FTI_USER=fti/...
FTI_PASS=...
~ 1 * * 0 /usr/local/bin/orange_hexauth > /etc/orange_auth_string
~ 2 * * 0 cat /etc/dhcpcd.conf.head /etc/orange_auth_string > /etc/dhcpcd.conf
# dhcpcd rebind
~ 3 * * 0 dhcpcd -n
Et pour lancer le service dhcpcd avec le reste, on va piquer
directement dans les sources du port : dhcpcd.rcVoilà, une machine OpenBSD connectée au réseau Orange. Reste plus qu'à configurer
dhcpd(8) pour servir les clients en IPv4 dans les réseaux locaux et
rad(8) pour l'IPv6, le firewall, etc.
Pour la TV : lire cet article.# cat /etc/pf.conf
# interface interne
tv_in_if = "vlan52"
# uplink TV... à définir dans /etc/hostname.vlan840 bien sûr
tv_if = "vlan840"
# NAT pour le boîtier TV qui a besoin d'accéder un peu à internet
match out log on egress inet from ($tv_in_if:network) to ! (self:network) nat-to (egress)
pass in quick log on $tv_in_if proto { tcp udp } to ! (self:network) port { ntp domain https http 1443 2443 3443 5443 6443 7443 8443 9443 }
# je suis pas trop sûr pour les ports non standards... j'ai un peu bâclé
# IGMP et flux TV
pass in quick log on $tv_in_if to 224.0.0.0/4 allow-opts
pass out quick log on $tv_if to 224.0.0.0/4 allow-opts
pass in quick log on $tv_if inet proto udp from any to 224.0.0.0/4 port { 8200 8202 }
pass quick log on { $in_phy_if $tv_if $tv_in_if } proto igmp allow-opts
# grep -vE '^[$#]' /etc/igmpproxy.conf
chroot /var/empty
user _igmpproxy
quickleave
phyint vlan840 upstream ratelimit 0
altnet 0.0.0.0/0
phyint vlan52 downstream ratelimit 0
phyint em1 disabled
phyint em2 disabled
Et bien sûr, le boîtier TV réclame une option DNS bizarre... certaines infos sont à récupérer dans
/var/db/dhcpcd/vlan832.lease# cat /etc/dhcpd.conf
[snip]
# TV
subnet 10.207.52.1 netmask 255.255.255.0 {
option routers 10.207.52.1;
# DNS fournis par Orange dans la lease DHCP 2023-03-01
option domain-name-servers 80.xx.xx.xx, 81.xx.xx.xx;
range 10.207.52.100 10.207.52.200;
host decodeur-tv {
hardware ethernet 44:d4:54:48:72:03;
# https://forums.framboise314.fr/viewtopic.php?f=57&t=5960
option option-125 00:00:0D:E9:24:04:06:xx:xx:xx:xx:xx:xx:05:0F:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:06:0d:4C:69:76:65:62:6F:78:20:34;
# ............^^.......^^^^^^^^^^^^^^^^^.......^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^....^^..L..i..v..e..b..o..x.. ..4
# `length `hex(first 3 bytes of Livebox MAC) `hex(serial Livebox) `length of next item
option domain-name "orange.fr";
option domain-search "XXX.access.orange-multimedia.net";
# ^^^- vérifier la lease DHCP, c'est dedans aussi
}
}
Et j'ai juste des problèmes avec
l'accès aux chaînes HD+, mais l'ensemble des chaînes reste fonctionnel (dont TF1, M6, replay, etc.)
Édit 2023-04-15 : dans les réponses DHCPv6 du serveur Orange, j'ai une option 17 ; et selon
les indications de levieuxatorange, ça indiquerait que je suis "migré" et donc mes propositions de configuration sont fonctionnelles.
Aussi, avec les sorties de dhcpcd-9.5.0 et 10.0.0 (11 avril 2023 et 13 avril 2023), et OpenBSD 7.3 (10 avril 2023), j'ai pu tester et valider que toute la conf fonctionnait encore (commit
257259dd sur OpenBSD 7.3).
2024-04-30 : je vous confirme que tout est encore parfaitement fonctionnel sur OpenBSD 7.4 et 7.5.