RTSP und IPTables
RTSP und IPTables

Das Realtime Streaming Protocol kurz RTSP wird genutzt um den Verbin­dungs­aufbau mit Strea­ming­servern zu koordi­nieren. Die Mobil­version von YouTube nutzt beispiels­weise dieses Protokoll. Nach dem Verbin­dungs­aufbau werden die Nutzdaten dann meist über RTP übertragen. Da dieses UDP-basierte Protokoll die verwen­deten Ports dynamisch aushandelt, ist es schwierig, dieses ohne geeig­netes Conntrack-Modul durch die Firewall zu bekommen. Wenn man also — so wie ich — eine IPTables-Firewall nutzt um den einge­henden und ausge­henden Traffic zu filtern, so hat man mit RTSP ein echtes Problem.

Zwar gibt es für RTSP wohl irgendwo ein Conntrack-Modul, jedoch ist es in den meisten Distri­bu­tionen nicht verfügbar. Wer jedoch nur einige bestimmte Seite (z.B. YouTube Mobile) zum laufen bekommen will, kann sich eines einfachen Tricks bedienen: Man öffnet einfach den nötigen UDP-Port-Range für ein bestimmte Zeit, wenn die Firewall vorher eine RTSP-Verbindung gesehen hat. Hierfür bietet das IPTables-Modul recent die nötigen Voraus­set­zungen. Es führt eine benannte Liste, in welche IP-Adressen und Zeits­tempel hinzu­gefügt werden können. Später kann in der Liste nachge­sehen werden, ob in den letzten X Sekunden ein Daten­paket an die angegebene IP-Adresse gesehen wurde.

D.h. um YouTube Mobile ausgehend durch eine IP-Tables Firewall nutzen zu können, genügen folgende Firewall­regeln:

  1. iptables -s <Internes Netz> -A FORWARD -p tcp -m tcp --dport 554 -m recent --name rtsp --set -m comment --comment "RTSP für Media Streaming" -j ACCEPT
  2. iptables -s <Internes Netz> -A FORWARD -p udp -m udp --dport 10000:11000 -m recent --name rtsp --update --seconds 10 -m comment --comment "RTSP UDP erlauben, wenn vorher RTSP auf Port 554 gesprochen wurde." -j ACCEPT

Die erste Zeile erlaubt ausge­hende Verbin­dungen auf Port 554 (RTSP). Bei ist jeweils das Netzwerk und die Maske für das interne Netzwerk anzugeben, in welchem sich die Clients befinden (z.B. 192.168.0.0/16). Der Abschnitt -m recent --name rtsp --set fügt nun die Quell­adresse des internen Clients zur Recent-Liste hinzu. D.h. dieser Client darf nun die nächten 10 Sekunden lang UDP-Pakete verschicken. Hierfür sorgt die zweite Zeile. Sie erlaubt den UDP-Portbereich 10000 bis 11000 (passend zu YouTube Mobile) für den Client. Die Option --update sorgt dafür, dass auch die UDP-Pakete den Zeits­tempel der Quell-Adresse anpassen und somit das Zeitfenster weiter offen bleibt. Die Option --seconds 10 legt fest, dass 10 Sekunden nach dem letzten RTSP oder UDP-Paket keine weiteren Pakete mehr akzep­tiert werden.

Damit das alles funktio­niert, ist natürlich noch das normale Connection-Tracking notwendig. Ansonsten werden die UDP-Antwortpakete von der Firewall nicht akzep­tiert. Also irgendwo in der Konfi­gu­ration muss noch die folgende Regel einge­tragen werden:

  1. iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

Da dieser Eintrag aber norma­ler­weise Teil einer größeren Firewall­kon­fi­gu­ration ist, gehe ich hier nicht weiter darauf ein.

Um nachzu­sehen, welche Verbin­dungen gerade in der Recent-Liste stehen, kann man das vom Recent-Modul bereit­ge­stellte Verzeichnis im Proc-Dateisystem nutzen:

  1. cat /proc/net/xt_recent/rtsp

Dies gibt die gespei­cherten Statistik-Informationen und Zeits­tempel aus und kann zur Fehler­dia­gnose sehr nützlich sein.

Mit dieser Konfi­gu­ration kann nun z.B. ein Android Smart­phone problemlos RTSP-Inhalte von YouTube Mobile abspielen, ohne dass größere Löcher in die Firewall gebohrt werden müssen.

13.04.2011

Besucher:

2.205

Tags: