Bonjour à tous!
Depuis quelques temps, j'ai entrepris de remplacer ma box par une machine totalement configurée à zéro sous ArchLinux. C'est quelque chose qui me tenait à cœur et dont je voulais vous partager l'avancement jusqu'ici.
Status[OK] NAT + réseau local
[OK] Internet + IP publique
[OK] ipTV avec la Miami

Voilà ma configuration jusqu'ici :
NAT + IP publique VLAN100Je dispose de deux port ethernet sur ma machine :
- eno1 - Mon port externe "WAN"
- enp2s0 - Mon port interne "LAN" relié à un Switch
Pour gérer chaque port, j'utilise
Netctl avec deux profils.
VLAN100Il y a d'abord un profil VLAN 100 utilisé pour résoudre internet avec Bouygues. Le port ethernet eno1 est donc relié au boitier ONT.
/etc/netctl/extern-profileDescription='Public Interface when wired directly on the outside world'
Interface=eno1.100
Connection=vlan
BindsToInterfaces=eno1
VLANID=100
IP=dhcp
DHCPClient='dhcpcd'
DNS=('10.0.0.1')
MACAddress=XX:XX:XX:XX:XX:XX
ForceConnect=yes
SkipNoCarrier=yes
En même temps, j'utilise une configuration sur
dhcpcd pour envoyer le vendor-class-id:
/etc/dhcpcd.conf[...]
# Add the bbox vendorclassid
allowinterfaces eno1.100
vendorclassid byteliad_data
Réseau local + DHCP avec dnsmasqLe DNS 10.0.0.1 est géré par un fork de dnsmasq :
Pi-holeC'est aussi ce fork de dnsmasq qui fait mon serveur DHCP pour le réseau local.
La configuration du réseau local se fait toujours avec netctl:
/etc/netctl/intern-profileDescription='Private Interface'
Interface=enp2s0
Connection=ethernet
IP=static
Address=('10.0.0.1/24')
Associé au DHCP de dnsmasq, cela me fait des addresses IP de la forme 10.0.0.X pour le réseau interne.
J'ai également du 10.6.0.X pour le VPN.
Forwarding + FirewallPour le partage internet, j'ai activé le port forwarding:
/etc/sysctl.d/30-ipforward.confnet.ipv4.ip_forward=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1
Enfin, j'ai mis en place des règles NFTables pour restreindre l'entrée de mon réseau ; et faire le NAT routing:
/etc/nftables.conf#!/usr/bin/nft -f
flush ruleset
# FIREWALL
table inet firewall {
# Dispatcher
chain interface_dispatch {
type filter hook input priority 0; policy drop;
iif lo accept comment "Accept any localhost traffic"
ct state invalid drop comment "Drop invalid connections"
iifname enp2s0 accept comment "Accept any local network traffic"
iifname eno1.100 jump wan_input
reject with icmpx type port-unreachable # refuse traffic from all other interfaces
}
# Rules for the outside world input
chain wan_input {
ct state related,established accept comment "Accept traffic originated from us"
}
chain forward {
type filter hook forward priority 0; policy drop;
iifname enp2s0 accept comment "Forward any local network traffic"
iifname eno1.100 oifname enp2s0 accept comment "Forward traffic that have been nated or port forwarded"
}
chain output {
type filter hook output priority 0; policy accept;
}
}
# NAT
table inet nat {
chain postrouting {
type nat hook postrouting priority 100;
oifname eno1.100 masquerade
}
}
Miami (UPnP + IPTV)UPnPComme j'utilise nftables (plus récent que iptables) ; j'ai dû installer une version compilée pour nftables de miniupnpd !
J'utilise donc
miniupnpd-nft-git que j'ai installé avec pikaur.
Pour la persistence j'ai dû ajouter manuellement le flag de configuration --leasefile
La configuration est la suivante:
/etc/miniupnpd/miniupnpd.confext_ifname=eno1.100
listening_ip=enp2s0
enable_natpmp=yes
min_lifetime=120
max_lifetime=86400
upnp_forward_chain=forwardUPnP
upnp_nat_chain=UPnP
upnp_nat_postrouting_chain=postroutingUPnP
lease_file=/etc/miniupnpd/upnp.leases
system_uptime=yes
notify_interval=60
clean_ruleset_interval=600
# UUID, generate your own UUID with "uuidgen"
uuid=134A453C-CFE4-4516-BE5C-12DFBE1B2A26
allow 1024-65535 10.0.0.0/24 1024-65535
deny 0-65535 0.0.0.0/0 0-65535
Et cela fonctionne comme un charme
IPTVJ'ai installé igmpproxy avec la configuration suivante:
/etc/igmpproxy.confphyint eno1.100 upstream ratelimit 0 threshold 1
altnet 89.86.96.0/24
altnet 89.86.97.0/24
altnet 176.165.8.0/24
altnet 193.251.97.0/24
phyint enp2s0 downstream ratelimit 0 threshold 1
J'ai également modifié l'adresse MAC de mon port ethernet enp2s0 pour simuler ce que j'avais en sortie de ma box.
Concernant NFTables, j'ai ouvert diverses choses spécifiques à la TV, dont ICMP et IGMP:
table inet filter {
[...]
chain wan_input {
[...]
ip protocol igmp accept comment "Accept IGMP"
}
[...]
}
table inet nat {
chain prerouting {
type nat hook prerouting priority -100;
udp dport 20000-30000 ip saddr { 212.195.48.0/24, 212.195.244.0/24, 62.34.201.0/24, 194.158.119.0/24, 195.36.152.0/24 } dnat to 10.0.0.5 comment "Forward bbox miami replay"
}
[...]
}
Le réseau local n'a pas de blocage particulier sur ses ports. Et la Miami a une ip fixe : 10.0.0.5
Dans le diagnostic, la Miami me dit qu'elle ne se considère pas connectée à la box, le champs "Bouygues" est à NON.
Les requêtes IMGP arrivent :
% sudo tcpdump -li eno1.100 igmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eno1.100, link-type EN10MB (Ethernet), capture size 262144 bytes
19:04:10.395593 IP 0.0.0.0 > all-systems.mcast.net: igmp query v2
19:04:12.516605 IP maxwell > 224.0.1.187: igmp v2 report 224.0.1.187
19:04:20.196575 IP maxwell > 239.255.3.22: igmp v2 report 239.255.3.22
19:05:07.646597 IP maxwell > 239.255.255.250: igmp v2 report 239.255.255.250
19:05:07.903257 IP maxwell > 239.255.255.250: igmp v2 report 239.255.255.250
19:05:38.968012 IP maxwell > all-routers.mcast.net: igmp leave 239.255.255.250
19:06:15.395866 IP 0.0.0.0 > all-systems.mcast.net: igmp query v2
19:06:19.663195 IP maxwell > 239.255.3.22: igmp v2 report 239.255.3.22
19:06:22.436584 IP maxwell > 224.0.1.187: igmp v2 report 224.0.1.187
maxwell étant le nom d'hôte de ma machine, c'est le nom que j'ai donné à mon routeur.
Lorsque je reset la Miami aux paramètres d'usine, celui-ci trouve internet, et trouve 404 chaines en iptv.
Si vous souhaitez plus de détails sur ma configuration, ou des retours de commande, je peux probablement vous fournir ça

[EDIT 14/04/2020] Ajout de ICMP en entrée de nftables - Précision de l'erreur F34
11[EDIT 15/04/2020] Ajout de la config UPnP pour la miami ; formattage du post avec des titres et sous-titres
[EDIT 15/04/2020 (2)] Modification des nftables pour plus de compatibilité avec UPnP ; Déplacement des règles TV dans le forward
[EDIT 16/04/2020] UPnP est maintenant *vraiment* fonctionnel ; persistant (avec le leasefile) ; et le forwarding a été modifié dans le nftable pour ne pas bloquer les paquets. Toujours pas d'IPTV ^^
[EDIT 17/04/2020] Victoire ! IPTV fonctionne! J'ai dû simplifier un peu la configuration de IGMPProxy ; et je dois le redémarrer un peu manuellement si je reboot mon routeur. Je vais chercher à améliorer la persistance. Aucune idée de la stabilité pour l'instant, je verrais à l'usage!
[EDIT 17/04/2020 2] Retrait de ICMP — Semble inutile, et donne trop d'informations et de vecteurs d'attaques à être ouvert.