Multicast IPTV über VPN

Dieser Post beschreibt einen Versuch zu beweisen, dass ein Multicast IPTV Service über ein Site-to-Site VPN übertragen werden kann und auch die zusätzlich verwendeten Unicast Dienste auf der Set-Top-Box funktionieren.

1. Einführung

Ich habe mich selbst gefragt, ob es möglich ist einen SSM-Multicast IPTV Dienst über VPN zu übertragen. Mein Anbieter stellt seinen IPTV Dienst mittels SSM (Source-specific Multicast) zur Verfügung. Das bedeutet wir benötigten IGMPv3.

Wir haben zwei Internetverbindungen bei zwei verschiedenen Anbietern. Einer stellt IPTV zur Verfügung. Um Multicast über VPN übertragen zu können benötigen wir anders als meist üblich ein Routing-basiertes VPN.

Für den Aufbau habe ich folgendes aus der Bastelkiste geholt bzw. den bestehenden Aufbau umgebaut:

Site 1

  • Modem: Draytek Vigor 165
  • Router: UBNT EdgeRouter Lite (v2.0.8 hotfix1)

Site 2 with IPTV

  • Modem: Draytek Vigor 165
  • Router: UBNT Edgerouter 4 (v2.0.8 hotfix1)

Soweit ich weiß sollte dies übrigends auch mit Unifi Geräten wie dem Unifi Security Gateway funktionieren. Ausnahme ist hier die Dream Machine (Pro), da diese anscheinend nicht mehr auf EdgeOS/VyOS basiert und damit auch kein Laden der Konfiguration mittels JSON Datei möglich ist.

EDIT: Getestet wurde nun auch mit einem Unifi Security Gateway Pro (USG-Pro-4). Auch darauf ist es möglich mittels eines JSON Konfigurationsfiles einen Multicast fähigen GREoIPsec Tunnel aufzubauen.

Ich bin bei meinem Versuch nicht in der Lage ein VTI (Virtual Tunnel Interface) zu verwenden, weil hier die Konfiguration von dyndns peer Adressen nicht unterstützt wird. Alternativ greife ich daher auf einen GRE over IPsec Tunnel zurück. Hier habe ich die Möglichkeit statische Routen oder dynamisches Routing zu verwenden. Ich entscheide mich im Laufenden für OSPF.

2. Konfiguration Site 1 – Konfigurieren des Multicast fähigen VPN für IPTV

Wir beginnen unsere Konfiguration auf der Site 1. Ihr soll später der IPTV Dienst zur Verfügung gestellt werden.

2.1 Firewall and Interfaces

Wir konfigurieren das MSS-Clamping, um sicher zu sein, dass TCP Pakete eine reduzierte MSS erhalten. Da IPv4-TCP 40 Bytes benötigt setzen wir den Wert 40 Byte geringer als die MTU unseres GRE-Interfaces. Hier ist der Wert auf 1354 gesetzt, da unsere MTU abzüglich des benötigten Overheads bei 1394 liegt.

set firewall options mss-clamp interface-type all
set firewall options mss-clamp mss 1354

Alternativ können wir die unterschiedlichen Interfaces auch verschiedene MSS Werte definiert werden. Dies kann man durch Anlegen von Modify-Regeln erreichen und diese anschließend den Interfaces in/out zuordnen. Da unser IPTV Service IPv4 only ist, benötigen wir keinen Wert für IPv6 zu setzen. Für die PPPoE Verbindung macht es bei einem Dual-Stack Anschluss natürlich sinn und sollte 60 Bytes geringer angesetzt werden als die MTU des PPPoE Interfaces.

set firewall modify MSS_TUN rule 1 action modify
set firewall modify MSS_TUN rule 1 modify tcp-mss 1354
set firewall modify MSS_TUN rule 1 protocol tcp
set firewall modify MSS_TUN rule 1 tcp flags 'SYN,!RST'
set firewall modify MSS_WAN rule 1 action modify
set firewall modify MSS_WAN rule 1 modify tcp-mss 1452
set firewall modify MSS_WAN rule 1 protocol tcp
set firewall modify MSS_WAN rule 1 tcp flags 'SYN,!RST'
set interfaces tunnel tun0 firewall in modify MSS_TUN
set interfaces tunnel tun0 firewall out modify MSS_TUN
set interfaces ethernet eth0 pppoe 0 firewall in modify MSS_WAN
set interfaces ethernet eth0 pppoe 0 firewall out modify MSS_WAN

Danach konfigieren wir eine Loopback Adresse für unseren Tunnel und geben den Interfaces wiederum eine IP-Adresse für das dynamische Routing.

set firewall name WAN_LOCAL rule 11 action accept 
set firewall name WAN_LOCAL rule 11 description 'allow tunnel'
set firewall name WAN_LOCAL rule 11 log disable
set firewall name WAN_LOCAL rule 11 protocol all
set firewall name WAN_LOCAL rule 11 source address 10.10.254.2/32
set interfaces loopback lo address 10.10.254.1/32
set interfaces tunnel tun0 address 10.10.200.1/30
set interfaces tunnel tun0 description <your description>
set interfaces tunnel tun0 encapsulation gre
set interfaces tunnel tun0 ip ospf dead-interval 40
set interfaces tunnel tun0 ip ospf hello-interval 10
set interfaces tunnel tun0 ip ospf network point-to-point
set interfaces tunnel tun0 ip ospf priority 1
set interfaces tunnel tun0 ip ospf retransmit-interval 5
set interfaces tunnel tun0 ip ospf transmit-delay 1
set interfaces tunnel tun0 local-ip 10.10.254.1
set interfaces tunnel tun0 mtu 1394
set interfaces tunnel tun0 multicast enable
set interfaces tunnel tun0 remote-ip 10.10.254.2
set interfaces tunnel tun0 ttl 255

2.2 IGMP Proxy

Anschließend können wir den IGMP Proxy vorbereiten und setzen unseren Downstream auf die gewünschten LAN-Interfaces und unseren Upstream auf das Tunnel-Interface.

set protocols igmp-proxy interface eth1 alt-subnet 0.0.0.0/0 
set protocols igmp-proxy interface eth1 role downstream
set protocols igmp-proxy interface eth1 threshold 1
set protocols igmp-proxy interface eth1 whitelist 232.0.0.0/8
set protocols igmp-proxy interface eth1 whitelist 239.0.0.0/8
set protocols igmp-proxy interface tun0 alt-subnet 0.0.0.0/0
set protocols igmp-proxy interface tun0 role upstream
set protocols igmp-proxy interface tun0 threshold 1

2.3 Dynamic Routing

Ist das erledigt können wir mit dem Aufsetzen des dynamischen Routings fortfahren und OSPF konfigurieren. Hierfür verwenden wir das Netzwerk 10.10.200.0/30 um die Informationen auszutauschen und unser eigenes Netzwerk zu announcen.

set protocols ospf area 0 area-type normal 
set protocols ospf area 0 network 10.10.200.0/30
set protocols ospf area 0 network <site1networkaddress>/<site1networkmask>
set protocols ospf log-adjacency-changes
set protocols ospf parameters router-id 0.0.0.1

2.4 IPsec

Nun sind wir soweit noch den IPsec Tunnel zu konfigurieren der auch die GRE Tunnel Informationen beinhaltet.

set vpn ipsec allow-access-to-local-interface disable
set vpn ipsec auto-firewall-nat-exclude disable
set vpn ipsec esp-group esp-tunnel compression disable
set vpn ipsec esp-group esp-tunnel lifetime 3600
set vpn ipsec esp-group esp-tunnel mode tunnel
set vpn ipsec esp-group esp-tunnel pfs enable
set vpn ipsec esp-group esp-tunnel proposal 1 encryption aes256
set vpn ipsec esp-group esp-tunnel proposal 1 hash sha1
set vpn ipsec ike-group ike-tunnel dead-peer-detection action restart
set vpn ipsec ike-group ike-tunnel dead-peer-detection interval 15
set vpn ipsec ike-group ike-tunnel dead-peer-detection timeout 60
set vpn ipsec ike-group ike-tunnel ikev2-reauth no
set vpn ipsec ike-group ike-tunnel key-exchange ikev1
set vpn ipsec ike-group ike-tunnel lifetime 28800
set vpn ipsec ike-group ike-tunnel proposal 1 dh-group 2
set vpn ipsec ike-group ike-tunnel proposal 1 encryption aes256
set vpn ipsec ike-group ike-tunnel proposal 1 hash sha1
set vpn ipsec ipsec-interfaces interface eth0
set vpn ipsec site-to-site peer <site2FQDN> authentication mode pre-shared-secret
set vpn ipsec site-to-site peer <site2FQDN> authentication pre-shared-secret <yoursecret>
set vpn ipsec site-to-site peer <site2FQDN> connection-type initiate
set vpn ipsec site-to-site peer <site2FQDN> default-esp-group esp-tunnel
set vpn ipsec site-to-site peer <site2FQDN> description hh-lan
set vpn ipsec site-to-site peer <site2FQDN> ike-group ike-tunnel
set vpn ipsec site-to-site peer <site2FQDN> ikev2-reauth inherit
set vpn ipsec site-to-site peer <site2FQDN> local-address 0.0.0.0
set vpn ipsec site-to-site peer <site2FQDN> tunnel 1 allow-nat-networks disable
set vpn ipsec site-to-site peer <site2FQDN> tunnel 1 allow-public-networks disable
set vpn ipsec site-to-site peer <site2FQDN> tunnel 1 local prefix 10.10.254.1/32
set vpn ipsec site-to-site peer <site2FQDN> tunnel 1 remote prefix 10.10.254.2/32

Wir sind auf Site 1 fast fertig, aber wir werden erstmal mit Site 2 weitermachen und diese vorbereiten, bevor wir hier weitermachen.

3. Configuration Site 2 – Setting up the Multicast enabled VPN for IPTV

3.1 Firewall and Interfaces

Wir beginnen nun erneut mit den Firewall Einstellungen und dem Loopback Interface sowie dem Tunnel Interface. Wie auf Site 1 müssen wir auch hier den MSS Wert konfigurieren und können wie zuvor auswählen welche Variante wir bevorzugen. Hier ist Variante 1 zu sehen, ich bevorzuge aber Variante 2.

set firewall options mss-clamp interface-type all
set firewall options mss-clamp mss 1354
set firewall name WAN_LOCAL rule 11 action accept
set firewall name WAN_LOCAL rule 11 description 'allow tunnel'
set firewall name WAN_LOCAL rule 11 log disable
set firewall name WAN_LOCAL rule 11 protocol all
set firewall name WAN_LOCAL rule 11 source address 10.10.254.1/32
set interfaces loopback lo address 10.10.254.2/32
set interfaces tunnel tun0 address 10.10.200.2/30
set interfaces tunnel tun0 description <yourdescription>
set interfaces tunnel tun0 encapsulation gre
set interfaces tunnel tun0 ip ospf dead-interval 40
set interfaces tunnel tun0 ip ospf hello-interval 10
set interfaces tunnel tun0 ip ospf network point-to-point
set interfaces tunnel tun0 ip ospf priority 1
set interfaces tunnel tun0 ip ospf retransmit-interval 5
set interfaces tunnel tun0 ip ospf transmit-delay 1
set interfaces tunnel tun0 local-ip 10.10.254.2
set interfaces tunnel tun0 mtu 1398
set interfaces tunnel tun0 multicast enable
set interfaces tunnel tun0 remote-ip 10.10.254.1
set interfaces tunnel tun0 ttl 255

3.2 IGMP Proxy

Ich gehe davon aus, dass bereits ein IGMP-Proxy konfiguriert wurde, da wir ja am Anschluss mit IPTV Service sind. Deshalb fügen wir nun nur ein weiteres Downstream-Interface hinzu.

set protocols igmp-proxy interface tun0 alt-subnet 0.0.0.0/0 
set protocols igmp-proxy interface tun0 role downstream
set protocols igmp-proxy interface tun0 threshold 1
set protocols igmp-proxy interface tun0 whitelist 232.0.0.0/8
set protocols igmp-proxy interface tun0 whitelist 239.0.0.0/8

3.3 Dynamic Routing

Wir fahren nun mit der OSPF Konfiguration fort und announcieren hier ebenfalls unser Netz. 

set protocols ospf area 0 area-type normal 
set protocols ospf area 0 network 10.10.200.0/30
set protocols ospf area 0 network <site2-networkaddress>/<site2-subnetmask>
set protocols ospf log-adjacency-changes
set protocols ospf parameters router-id 0.0.0.2

3.4 IPsec

Schließlich fehlt auch hier nurnoch die IPsec Konfiguration.

set vpn ipsec allow-access-to-local-interface disable 
set vpn ipsec auto-firewall-nat-exclude disable
set vpn ipsec esp-group esp-tunnel compression disable
set vpn ipsec esp-group esp-tunnel lifetime 3600
set vpn ipsec esp-group esp-tunnel mode tunnel
set vpn ipsec esp-group esp-tunnel pfs enable
set vpn ipsec esp-group esp-tunnel proposal 1 encryption aes256
set vpn ipsec esp-group esp-tunnel proposal 1 hash sha1
set vpn ipsec ike-group ike-tunnel dead-peer-detection action restart
set vpn ipsec ike-group ike-tunnel dead-peer-detection interval 15
set vpn ipsec ike-group ike-tunnel dead-peer-detection timeout 60
set vpn ipsec ike-group ike-tunnel ikev2-reauth no
set vpn ipsec ike-group ike-tunnel key-exchange ikev1
set vpn ipsec ike-group ike-tunnel lifetime 28800
set vpn ipsec ike-group ike-tunnel proposal 1 dh-group 2
set vpn ipsec ike-group ike-tunnel proposal 1 encryption aes256
set vpn ipsec ike-group ike-tunnel proposal 1 hash sha1
set vpn ipsec ipsec-interfaces interface eth0
set vpn ipsec site-to-site peer <site1FQDN> authentication mode pre-shared-secret
set vpn ipsec site-to-site peer <site1FQDN> authentication pre-shared-secret <yoursecret>
set vpn ipsec site-to-site peer <site1FQDN> connection-type initiate
set vpn ipsec site-to-site peer <site1FQDN> default-esp-group esp-tunnel
set vpn ipsec site-to-site peer <site1FQDN> ike-group ike-tunnel
set vpn ipsec site-to-site peer <site1FQDN> ikev2-reauth inherit
set vpn ipsec site-to-site peer <site1FQDN> local-address 0.0.0.0
set vpn ipsec site-to-site peer <site1FQDN> tunnel 1 allow-nat-networks disable
set vpn ipsec site-to-site peer <site1FQDN> tunnel 1 allow-public-networks disable
set vpn ipsec site-to-site peer <site1FQDN> tunnel 1 local prefix 10.10.254.2/32
set vpn ipsec site-to-site peer <site1FQDN> tunnel 1 remote prefix 10.10.254.1/32

Unser Tunnel sollte nun bereits in den Status Up gehen und wir können dies mit ’sudo ipsec status‘  und show ip route ospf‘ überprüfen. Wenn die Ausgabe gut aussieht sollte bereits ein Ping in das gegenüberliegende Netz funktionieren. Ich habe VLC verwendet um testweise eine Multicast-Adresse eines Senders des IPTV Services aufzurufen. Dies sollte nämlich bereits funktionieren. Damit wir auch verschlüsselte Kanäle und weitere Dienste wie VOD/Replay/… nutzen können, müssen wir aber noch etwas Arbeit investieren, denn derzeit läuft dieser Verkehr über mein default Gateway 0.0.0.0/0 und die Set-Top-Box bekommt damit keine Verbindung, da diese abgelehnt wird.

4. Additional static Routing

Wir müssen also noch ein paar statische Routen hinzufügen, um den entsprechenden Unicast Verkehr für die Set-Top-Box auch über Site 2 laufen zu lassen. Um herauszufinden welche Adressen dafür notwendig sind verwenden wir das Packet Capturing des EdgeRouters während wir die Set-Top-Box zurücksetzen und neustarten. Das Packet Capturing starten wir mit ’sudo tcpdump -i settopboxinterface host settopboxIP -w iptv.pcap‘ und holen uns die Datei anschließend per SCP um sie in Wireshark zu öffnen. Ich habe einige Aufrufe gefunden und habe diese auch zusammengefasst in größere Netze, um weniger Arbeit zu haben. Letztenendes sieht es bei mir ungefähr so aus:

set protocols static route 1.2.3.4/32 next-hop 192.168.5.1 description iptv - ntp 
set protocols static route 5.6.7.8/22 next-hop 192.168.5.1 description iptv
set protocols static route 9.0.1.2/20 next-hop 192.168.5.1 description iptv
set protocols static route 3.4.5.6/32 next-hop 192.168.5.1 description iptv
set protocols static route 7.8.9.1/32 next-hop 192.168.5.1 description iptv - tftp
...

Um sicher zu sein, dass ich alle relevanten Adressen erfasst habe, habe ich durch das Zurücksetzen auch den erneuten Download der Firmware erzwungen und einen Verbindungstest mitgeschnitten. Anschließend konnte die Set-Top-Box starten und ich konnte auf die Dienste zugreifen. In 1080p werden ungefähr 9MBit benötigt. Mit HW Offloading ist die Auslastung auf dem Router zu vernachlässigen. Mit einem EdgeRouter X auf Site 2 hat es leider nicht flüssig funktioniert. Ein Wechsel auf den EdgeRouter 4 hat dann aber ein flüssiges Bild ergeben.

Es ist also mit relativ wenig Aufwand möglich einen Multicast IPTV Dienst über VPN zu übertragen und auch die dazugehörige Set-Top-Box mit den benötigten Unicast Diensten zu verwenden.

5. QoS

Um auch bei voll genutzter Bandbreite ein flüssiges Fernsehbild zu gewährleisten haben wir mehrere Werkzeuge zur Verfügung. Zum einen können wir SQM oder einfaches QoS verwenden. Ersteres verbraucht sehr viel Performance und limitiert den ER-3-Lite z.B. auf 50Mbit. Dies ist auch nur sinnvoll, wenn man bufferbloat vermeiden möchte (Reaktionsschnelle Online-Games). Beim einfachen QoS sind dann ungefhr Bandbreiten von bis zu 80Mbit möglich auf einem ER-3-Lite.

Die dritte von mir bevorzugte Variante ist der Einsatz von Traffic-Shaping und damit sind auch 100Mbit auf einem ER-3-Lite möglich bei 90% CPU Auslastung, wenn diese abgerufen werden. Es ist also für eine gute Belüftung des Routers zu sorgen. Grund für die Einschränkungen ist das Fehlen des Hardware-Offloadings beim Einsatz von QoS Mechanismen. In diesem Fall werden 40Mbit für jegliche Verkehre garantiert die mit DSCP CS4 (100000 / Flash-Override) übermittelt werden. Um festzustellen mit welchem Wert diese übertragen werden kann man die Pakete nach der Anleitung im vorherigen Kapitel mitscheiden und reinschauen.

set traffic-policy shaper download bandwidth 90mbit
set traffic-policy shaper download class 10 bandwidth 40%
set traffic-policy shaper download class 10 burst 15k
set traffic-policy shaper download class 10 match iptv ip dscp <flash-override / cs4>
set traffic-policy shaper download class 10 queue-type fair-queue
set traffic-policy shaper download default bandwidth 60%
set traffic-policy shaper download default burst 15k
set traffic-policy shaper download default ceiling 95%
set traffic-policy shaper download default queue-type fair-queue
set interfaces ethernet ethX traffic-policy out download

Dieser Shaper hilft auf der Empfängerseite. Zusätzlich sollten entsprechende Shaper auf der Senderseite konfiguriert werden in die Upload Richtung. Für den Download sollte dies ja auf der Senderseite ohne empfehlenswerterweise bereits konfiguriert sein. Hier Ein Beispiel:

set traffic-policy shaper download bandwidth 110mbit
set traffic-policy shaper download class 10 bandwidth 20%
set traffic-policy shaper download class 10 burst 15k
set traffic-policy shaper download class 10 ceiling 60%
set traffic-policy shaper download class 10 match iptv ip dscp CS4
set traffic-policy shaper download class 10 queue-type fair-queue
set traffic-policy shaper download default bandwidth 50%
set traffic-policy shaper download default burst 15k
set traffic-policy shaper download default ceiling 70%
set traffic-policy shaper download default queue-type fair-queue
set traffic-policy shaper tunnel bandwidth 40mbit
set traffic-policy shaper tunnel class 10 bandwidth 95%
set traffic-policy shaper tunnel class 10 burst 15k
set traffic-policy shaper tunnel class 10 ceiling 100%
set traffic-policy shaper tunnel class 10 match iptv ip dscp CS4
set traffic-policy shaper tunnel class 10 queue-type fair-queue
set traffic-policy shaper tunnel default bandwidth 5%
set traffic-policy shaper tunnel default burst 15k
set traffic-policy shaper tunnel default ceiling 100%
set traffic-policy shaper tunnel default queue-type fair-queue
set traffic-policy shaper upload bandwidth 40mbit
set traffic-policy shaper upload class 10 bandwidth 90%
set traffic-policy shaper upload class 10 burst 15k
set traffic-policy shaper upload class 10 ceiling 100%
set traffic-policy shaper upload class 10 match iptv ip dscp CS4
set traffic-policy shaper upload class 10 queue-type fair-queue
set traffic-policy shaper upload default bandwidth 10%
set traffic-policy shaper upload default burst 15k
set traffic-policy shaper upload default ceiling 90%
set traffic-policy shaper upload default queue-type fair-queue

5. Sonstiges

Da hier eine Menge UDP Pakete laufen kann und seit der Version 2.0.0 reordering bei UDP Verkehren auftritt, hilft möglicherweise das Setzen des Packet Prrocessing auf einen CPU Kern mit dem Befehl:

set system packet-rx-core-num 1

Dieser Befehl wurde mit der 1.9.7 eingeführt bevor er mit der 1.10 behoben wurde. Seit der 2.0.0 tritt er allerdings erneut auf und ist bis einschließlich 2.0.9 RC2 nicht behoben worden.

Bringt dies keinen Vorteil kann die Konfigurationszeile einfach wieder gelöscht werden.

set system packet-rx-core-num all

oder

delete system packet-rx-core-num 1

Glossar

Schreibe einen Kommentar