Wednesday, June 11, 2014

Telenet modem-only met werkende DLNA op de digiboxen

TL;DR; Deze post legt uit hoe DLNA op de Digibox werkende te krijgen in een modem-only installatie van Telenet met een Mikrotik router. Zie deel 3 als de blah blah u geen moer interesseert.


1. Telenet HGW of modem-only?

Telenet, de snelste internet provider van ons landje (België). No sarcasm intended :)

Sinds een paar jaar krijgen klanten standaard de zogenaamde HGW 3.0 modem geïnstalleerd. De HGW, wat staat voor Home Gateway Wireless (of whatever), is typisch een DOCSIS 3 kabelmodem van Compal Broadband Networks (CBN, type CH6643E). Op zich een degelijk toestel wat de functionaliteiten betreft. De HGW heeft het grote voordeel dat deze, IPv4 NAT routing, IPv6 routing en Wifi (2.4 en 5 Ghz) in één toestel aanbiedt. Dit is voor de meeste mensen, die gewoon op het internet willen surfen, perfect. Anderzijds, betekent dit ook dat het externe IP adres van de klant wordt toegekend aan de HGW en dat er intern een privaat subnet (192.168.x.0/24), instelbaar via Mijn Telenet, wordt gebruikt.

Totaal irrelevant: Motorola heeft in 2010 hun EMEA DOCSIS divisie verkocht aan CBN (link). Daarom bestaat er soms verwarring tussen kabelmodem types en het merk Motorola vs CBN. It's all the same (shit) now.

Sommige mensen vinden het blijkbaar een obstakel dat ze geen rechtstreeks extern IP adres meer te verkrijgen. Waarom? Geen (echt) idee. Ik heb ook twijfels gehad bij de recentste installatie thuis. Bijvoorbeeld: Dubbele NAT heeft geen invloed op de snelheid van het netwerk of de connecties, VPN zou geen enkel probleem mogen zijn, etc. Ik kan zelf eigenlijk maar heel moeilijk een situatie vinden waarbij er iets absoluut niet werkt met een HGW opstelling.

Mijn persoonlijke redenen om toch een modem-only te vragen waren:
  1. De onmogelijkheid om de interne DHCP van de HGW uit te schakelen. Dit is de enige echte reden om een modem-only te vragen. Waarom? Ik gebruik PXE booting en de opties worden via mijn DHCP meegegeven, wat niet mogelijk is met de HGW DHCP.
  2. Dynamic DNS updating wordt bemoeilijkt. Maar, met behulp van IGD (Interior Gateway Device Protocol) is het mogelijk om het externe IP adres van de HGW op te vragen. Dit heb ik getest en werkt.)
  3. Mogelijkheid tot eigen firewalling. Niet dat ik ze niet vertrouw, maar via de HGW is het voor Telenet technisch heel gemakkelijk om op een LAN segment van een klant te geraken. Bij een HGW + eigen router kan je de wifi van de HGW niet filteren. Telenet kan bijvoorbeeld nagaan hoeveel devices er in de LAN zitten (again, who actually cares?).
  4. Elke configuratie gebeurt via Mijn Telenet. Best wel in orde, als alles werkt.
  5. De ingebouwde Wifi is dikwijls niet bruikbaar omdat de HGW in de garage, de kelder of het waskot hangt. Daardoor is er vaak toch nog nood aan een eigen access point.
  6. En zageventen die mopperen over de HomeSpot/HotSpot moeten zwijgen. Uw wifi staat daar toch te draaien, en verbruikt niet (veel) meer stroom door die extra service.
Enfin, modem-only heeft dan weer enkele nadelen:
  1. Je moet alles zelf regelen, wat in mijn geval deel van de fun is.
  2. Digiboxen moeten afzonderlijk behandeld worden (via VLANs of aparte bekabeling).
  3. De, op papier mooie, DLNA functie van de Digiboxen wordt niet ondersteund.

Puntjes 1 en 2 zijn eenvoudig. Puntje 3 is de reden voor deze post. Aanvankelijk hoopte ik op een oplossing te vinden op één van de Telenet-gebruikers forums. Maar, na wat vruchteloos zoeken naar een oplossing om DLNA op de Digiboxen werkende te krijgen in combinatie met een eigen router en een modem-only installatie, heb ik besloten om er zelf aan te beginnen. Ook peer-pressure van vrienden helpt soms als motivator.

Elke Digibox krijgt via DHCP een intern IPv4 adres van Telenet toegewezen (ergens in een 10.0.0.0/8 blok) voor de interactiviteit en streaming diensten. Daarnaast zal de Digibox ook zelf zoeken naar een 192.168.x.1/24 adres in het netwerk (meer details vind je in de forum post van NuKeM -- waarvoor dank en credits), en vervolgens ook automatisch een In Home IPv4 adres instellen bij het opstarten (zonder DHCP dus). Het lastige aan dit systeem is dat er maar één MAC adres wordt gebruikt voor de twee IP adressen van de Digibox (anders was het mogelijk om via VLAN's het verkeer te scheiden). Met een In Home IP adres is het mogelijk om de DLNA functies van de box te gebruiken. Dat is wat we willen bereiken met de voorgestelde oplossing.

2. "Transparent bridge with filtering"

Dit deel legt de technische kant uit van een werkende oplossing. Ik beweer niet dat dit de enige methode is, dus als iemand een beter of eenvoudiger alternatief kan geven, dan hoor ik het graag.

De oplossing waar ik voor gekozen heb, werkt met behulp van een bridge (dus layer 2 packet forwarding). Eenvoudig gezegd, stel ik de router volledig in als switch, zodat Digiboxen gewoon met Telenet kunnen communiceren en omgekeerd. De bridge filter scheidt vervolgens het interne LAN verkeer met dat van de buitenwereld.

Ik ben uitgegaan van een block-all principe en zet open wat noodzakelijk is voor een correcte werking van de apparaten op het netwerk. Het functioneel scheiden van enerzijds eigen apparaten en anderzijds de Digiboxen, wordt gedaan met behulp van de MAC adres-vendor-ID, welke voor de Digiboxen 00:03:91:XX:XX:XX en 68:63:59:XX:XX:XX zijn. Alle datapakketten met een passend MAC adres worden in de bridge filter gemarkeerd als "Digibox" (zowel op de Input, Forward als Output chains). De volgende filter regels kunnen deze marker dan gebruiken om concrete beslissingen te nemen. Ethernet poort 1 wordt gereserveerd voor de kabelmodem van Telenet.

De router splitst IPv4 traffiek tussen het klassieke LAN-WAN verkeer en het Digibox-Telenet verkeer. Digibox-Telenet verkeer mag via layer 2 door de bridge, terwijl het klassieke verkeer via layer 3 NAT gaat.

Concreet bestaan dus volgende regels in de bridge filter (in volgorde):
  • Forward (verkeer dat door de router loopt)
    1. Accept: Alles van en naar Digiboxen
    2. Drop: Alles afkomstig van Telenet kant
    3. Drop: Alles naar Telenet kant
    4. Accept: Al het overige verkeer (nodig om tussen interne poorten verkeer toe te laten)
  • Input (verkeer met de router als bestemming)
    1. Drop: DHCP IP aanvragen, afkomstig van Digiboxen (want, deze krijgen IP via DHCP van Telenet zelf)
    2. Drop: DHCP IP aanvragen afkomstig van Telenet kant (dit komt enkel voor als je meerdere apparaten extern hangt, ook hier willen we DHCP van Telenet niet verstoren)
    3. Accept: Alle verkeer dat niet afkomstig is van de Telenet kant (alle protocollen)
    4. Accept: ARP pakketten van Telenet kant
    5. Drop: IPv4 verkeer van Telenet kant met als doel 192.168.0.0/16, 172.16.0.0/16, 10.0.0.0/8 of 169.254.0.0/16
    6. Accept: IPv4 verkeer, naar de router
    7. Drop: alle overige verkeer naar de router
  • Output (verkeer dat de router zelf genereert)
    1. Drop: DHCP IP antwoorden naar Digiboxen
    2. Drop: DHCP IP antwoorden naar Telenet kant
    3. Accept: Alle verkeer dat niet naar de Telenet kant gaat (dus alles naar LAN, ook ARP)
    4. Drop: ARP verkeer naar Telenet kant waar informatie van 192.168.0.0/16 in staat (dit voorkomt lekken naar buiten)
    5. Accept: ARP verkeer naar Telenet kant
    6. Drop: IPv4 verkeer naar Telenet kant met als bron 192.168.0.0/16, 172.16.0.0/16, 10.0.0.0/8 of 169.254.0.0/16
    7. Accept: Alle overige IPv4 verkeer
    8. Drop: Alle overige verkeer van de router
De layer 3 filters voor IPv4 ga ik hier niet expliciet uitleggen. Deze zijn immers identiek aan de standaard IPv4 NAT regels van elke standaard router. Nothing new, dus.

3. Configuratie van de Mikrotik RB2011UiAS-2HnD-IN

De implementatie van de bridge filter regels kan gebeuren met gelijk welk besturingssysteem of embedded router die zoiets ondersteunt. Op Linux kan je hiervoor ebtables gebruiken. Ikzelf heb de praktische uitwerking op een router van Mikrotik gedaan, omdat deze toestellen gewoon extreem veel mogelijkheden aanbieden en zeer betaalbaar zijn.
Hieronder volgt de configuratie, zoals bekomen via het export commando in een terminal. De configuratie bevat enkel de relevante zaken voor deze post (geen wifi of advanced IPv4 firewall dus). Het LAN netwerk zit op 192.168.42.0/24, met een LAN DHCP server die vanaf 128 en hoger leases geeft. De Telenet kabelmodem moet via poort 1 aangesloten worden. De Digiboxen en eigen apparaten kunnen op gelijk welke poort ingestoken worden (zelfs met extra switches ertussen).
/interface bridge
add l2mtu=1598 name=br protocol-mode=none
/interface ethernet
set [ find default-name=ether1 ] name=ether1-gateway
set [ find default-name=ether2 ] name=ether2-master-lan
set [ find default-name=ether3 ] master-port=ether2-master-lan name=\
    ether3-slave-lan
set [ find default-name=ether4 ] master-port=ether2-master-lan name=\
    ether4-slave-lan
set [ find default-name=ether5 ] master-port=ether2-master-lan name=\
    ether5-slave-lan
set [ find default-name=ether6 ] name=ether6-master-dmz
set [ find default-name=ether7 ] master-port=ether6-master-dmz name=\
    ether7-slave-dmz
set [ find default-name=ether8 ] master-port=ether6-master-dmz name=\
    ether8-slave-dmz
set [ find default-name=ether9 ] master-port=ether6-master-dmz name=\
    ether9-slave-dmz
set [ find default-name=ether10 ] master-port=ether6-master-dmz name=\
    ether10-slave-dmz
set [ find default-name=sfp1 ] disabled=yes
/ip neighbor discovery
set ether1-gateway discover=no
set sfp1 discover=no
/ip pool
add name=lan-pool ranges=192.168.42.128-192.168.42.254
/ip dhcp-server
add address-pool=lan-pool disabled=no interface=br name=lan
/port
set 0 name=serial0
/interface bridge filter
add action=mark-packet chain=forward comment=\
    "Tag Advanced Digital Broadcast devices" new-packet-mark=digibox \
    src-mac-address=00:03:91:00:00:00/FF:FF:FF:00:00:00
add action=mark-packet chain=forward comment=\
    "Tag Advanced Digital Broadcast devices" new-packet-mark=digibox \
    src-mac-address=68:63:59:00:00:00/FF:FF:FF:00:00:00
add action=mark-packet chain=forward comment=\
    "Tag Advanced Digital Broadcast devices" dst-mac-address=\
    00:03:91:00:00:00/FF:FF:FF:00:00:00 new-packet-mark=digibox
add action=mark-packet chain=forward comment=\
    "Tag Advanced Digital Broadcast devices" dst-mac-address=\
    68:63:59:00:00:00/FF:FF:FF:00:00:00 new-packet-mark=digibox
add action=mark-packet chain=input comment=\
    "Tag Advanced Digital Broadcast devices" new-packet-mark=digibox \
    src-mac-address=00:03:91:00:00:00/FF:FF:FF:00:00:00
add action=mark-packet chain=input comment=\
    "Tag Advanced Digital Broadcast devices" new-packet-mark=digibox \
    src-mac-address=68:63:59:00:00:00/FF:FF:FF:00:00:00
add action=mark-packet chain=output comment=\
    "Tag Advanced Digital Broadcast devices" dst-mac-address=\
    00:03:91:00:00:00/FF:FF:FF:00:00:00 new-packet-mark=digibox
add action=mark-packet chain=output comment=\
    "Tag Advanced Digital Broadcast devices" dst-mac-address=\
    68:63:59:00:00:00/FF:FF:FF:00:00:00 new-packet-mark=digibox
add chain=forward comment="Forward anything marked as Digibox" packet-\
    mark=digibox
add action=drop chain=forward comment=\
    "Do not forward if originating from Telenet side" in-interface=\
    ether1-gateway
add action=drop chain=forward comment=\
    "Do not forward if destined to Telenet side" out-interface=ether1-\
    gateway
add action=passthrough chain=forward comment=\
    "Bridge everything that gets here" disabled=yes
add action=drop chain=input comment=\
    "Block DHCP client requests from Digiboxes" dst-port=67 ip-protocol=\
    udp mac-protocol=ip packet-mark=digibox src-port=68
add action=drop chain=input comment=\
    "Block DHCP client requests coming from Telenet side" dst-port=67 \
    in-interface=ether1-gateway ip-protocol=udp mac-protocol=ip src-port\
    =68
add chain=input comment=\
    "Accept anything to the router that is NOT originating from Telenet"\
    in-interface=!ether1-gateway
add chain=input comment="Accept ARP from everywhere" in-interface=\
    ether1-gateway mac-protocol=arp
add action=drop chain=input comment=\
    "Block this subnet when originating from Telenet side" dst-address=\
    192.168.0.0/24 in-interface=ether1-gateway mac-protocol=ip
add action=drop chain=input comment=\
    "Block this subnet when originating from Telenet side" dst-address=\
    172.16.0.0/12 in-interface=ether1-gateway mac-protocol=ip
add action=drop chain=input comment=\
    "Block this subnet when originating from Telenet side" dst-address=\
    10.0.0.0/8 in-interface=ether1-gateway mac-protocol=ip
add action=drop chain=input comment=\
    "Block this subnet when originating from Telenet side" dst-address=\
    169.254.0.0/16 in-interface=ether1-gateway mac-protocol=ip
add chain=input comment=\
    "Any IPv4 traffic to the router that gets here is allowed" in-inter\
    face=ether1-gateway mac-protocol=ip
add action=drop chain=input comment=\
    "Drop anything else (other protocols) destined to the router"
add action=drop chain=output comment=\
    "Drop DHCP server answers to Digiboxes" dst-port=68 ip-protocol=\
    udp mac-protocol=ip packet-mark=digibox src-port=67
add action=drop chain=output comment=\
    "Drop DHCP server answers to Telenet side" dst-port=68 ip-protocol=\
    udp mac-protocol=ip out-interface=ether1-gateway src-port=67
add action=drop arp-src-address=!192.168.0.0/16 chain=output comment=\
    "Drop ARP stuff not from 192.168.0.0/16 and internal" mac-protocol=\
    arp out-interface=!ether1-gateway
add chain=output comment=\
    "Allow the router to send anything to non-Telenet side" out-inter\
    face=!ether1-gateway
add action=drop arp-src-address=192.168.0.0/16 chain=output comment=\
    "Drop ARP stuff from 192.168.0.0/16 to Telenet side" mac-protocol=\
    arp out-interface=ether1-gateway
add chain=output comment="Accept ARP to everywhere" mac-protocol=arp \
    out-interface=ether1-gateway
add action=drop chain=output comment=\
    "Block this subnet when destined to Telenet side" mac-protocol=ip \
    out-interface=ether1-gateway src-address=192.168.0.0/16
add action=drop chain=output comment=\
    "Block this subnet when destined to Telenet side" mac-protocol=ip \
    out-interface=ether1-gateway src-address=172.16.0.0/12
add action=drop chain=output comment=\
    "Block this subnet when destined to Telenet side" mac-protocol=ip \
    out-interface=ether1-gateway src-address=10.0.0.0/8
add action=drop chain=output comment=\
    "Block this subnet when destined to Telenet side" mac-protocol=ip \
    out-interface=ether1-gateway src-address=169.254.0.0/16
add chain=output comment=\
    "Any IPv4 traffic from the router that gets here is allowed" \
    mac-protocol=ip out-interface=ether1-gateway
add action=drop chain=output comment=\
    "Drop anything else (other protocols) originating from the router"
/interface bridge port
add bridge=br interface=ether2-master-lan
add bridge=br interface=ether6-master-dmz
add bridge=br interface=wifi
add bridge=br interface=ether1-gateway
/ip address
add address=192.168.42.1/24 interface=br network=192.168.42.0
/ip dhcp-client
add comment="Connection with Telenet Modem" dhcp-options=hostname,\
    clientid disabled=no interface=br
/ip dhcp-server network
add address=192.168.42.0/24 dns-server=192.168.42.1 gateway=\
    192.168.42.1
/ip dns
set allow-remote-requests=yes
/ip dns static
add address=192.168.42.1 name=router
/ip firewall filter
add chain=input connection-state=established
add chain=forward connection-state=established
add chain=input connection-state=related
add chain=forward connection-state=related
add chain=input connection-state=new in-bridge-port=!ether1-gateway
add chain=forward connection-state=new in-bridge-port=!ether1-gateway
add action=drop chain=input
add action=drop chain=forward
/ip firewall nat
add action=masquerade chain=srcnat dst-address=!192.168.0.0/16 out-\
    interface=br src-address=192.168.0.0/16 to-addresses=0.0.0.0
/ip upnp
set allow-disable-external-interface=no
/ipv6 nd
set [ find default=yes ] disabled=yes

Hopelijk heeft iemand iets aan deze post. Dit alles zou eigenlijk niet nodig zijn, als Telenet het zou mogelijk maken om de LAN DHCP server uit te schakelen. Commentaar is welkom :)