[live] Host Rewrite bei Nutzung von ReverseProxy

  • Nabend,

    ich habe das live Plugin über meinen Nginx Proxy Manager erreichbar gemacht, sodass ich auch von außerhalb Glotzen kann, oder schnell mal was als Timer anlegen, etc.

    Während das Web-Streaming eine nette Möglichkeit bietet, möchte ich aber präferiert Abspielsoftware wie etwa VLC oder MPC verwenden um zu streamen. Leider werden mir allerdings die Playlisten mit der lokalen IP-Adresse und dem lokalen Port generiert und nicht mit dem von meinem Endgerät aus aufgerufenen FQDN auf Standard-TLS-Port 443. Bei einem einzigen Channel oder einer Aufnahme kann ich natürlich hingehen, die Datei im Editor bearbeiten und dann öffnen, bei der Channelliste geht auch Suchen&Ersetzen, aber auf Dauer ist das einfach unpraktisch. Besonders ärgerlich ist es, dass die ganze Chose bei dem kleinen Webserver auf Port 3000 einwandfrei zu funktionieren scheint.


    [Blocked Image: https://private-user-images.githubusercontent.com/3966858/501678298-bef92dba-d436-468b-a6e0-e576ce05c1a6.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NjA5MTMyOTksIm5iZiI6MTc2MDkxMjk5OSwicGF0aCI6Ii8zOTY2ODU4LzUwMTY3ODI5OC1iZWY5MmRiYS1kNDM2LTQ2OGItYTZlMC1lNTc2Y2UwNWMxYTYucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MTAxOSUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTEwMTlUMjIyOTU5WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NDdkZjEwMmU5MzgzNjAzNGZjZDgyOGUzYzA4MzIxZjZlOWZjNTkzMmVmNmRjMWEyZmEzNmIxNzliNjExMTRiNCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.7wOSywWPGCFTp_SPmjbZEMbFbnoEuEtoJqrny-ARIxQ]


    Theoretisch müssten es bei Nginx die beiden Header sein:


    Code
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;


    Und sobald ich `$host` in `$proxy_host` umändere, kann ich auch auf Port 3000 zB.: im RSS-Feed einen Unterschied erkennen.


    Ich vermute, dass da einfach ein wenig Logik im Plugin fehlt, à la:


    Code
    if exists $HEADER["X-Forwarded-Proto"]
       PROTO=$HEADER["X-Forwarded-Proto"]
    else
       PROTO=$HEADER["Proto"]

    Also sofern X-Forwarded Header existieren, sollen diese anstelle der Original Header verwendet werden.


    Vielleicht hat ja jemand eine Idee.


    Gruß Simon

    Einsatzsituation

    HW

    MINIX NEO Z300

    SW

    OS Arch Linux rolling als LX-Container auf Proxmox Hypervisor
    vdr 2.6.1 mit FritzBox als satip device
    vdr-live 3.1.8 hinter NginxProxyManager


    PS: Ausserdem habe ich noch jeweils eine SAT- und eine Cable-dBox

  • Deine Vermutung könnte durchaus passen.
    (Der Fehler erinnert mich irgendwie an SIP-Telefone, die mit Proxys nicht zurecht kommen.)
    So weit ich weiss, bist Du bist auch erste, der das Live-plugin mit einem Reverse-Proxy kombiniert hat. Bislang hatte ich nur von der Kombination mit einem VPN gehört.

    Ich bin jetzt nicht sicher, ob das beim Live-plugin liegt.
    AFAIK wird fürs streaming das streamdev-plugin verwendet. Da kann ich aber auch irren, die Kombination verwende ich nicht.

    Wenn die Liste vom streamdev-plugin nur durchgereicht wird, könnte es schwieriger werden, da das evtl. gar nichts vom Proxy mit bekommt.
    Dazu müsste sich aber besser noch jemand anderes äußern, der die Zusammenhänge besser überblickt.

    Gruss
    SHF

    Mein (neuer) VDR:

    Software:
    Debian Wheezy mit Kernel 3.14
    VDR 2.0.7 & div. Plugins aus YaVDR-Paketen
    noad 0.8.6

    Hardware:
    MSI C847MS-E33, onboard 2x1,1GHz Sandybridge Celeron 847, 4GiB RAM
    32GB SSD (System), 4TB 3,5" WD-Red HDD (Video)
    TT FF DVB-S 1.5 FullTS-Mod PWM-Vreg-Mod, DVB-Sky 852 Dual DVB-S2
    Das ganze im alten HP Vectra VLi8-Gehäuse versorgt von:
    PicoPSU-160-XT und Meanwell EPP-150 im ATX-NT-Gehäuse

  • Live generiert die URL relativ zur aktuell anzeigten Seite:

    Code
    href="playlist.m3u?channelid=<$ channelId $>"...

    bzw.

    Code
    cToSvConcat url("playlist.m3u?recid=", recid);

    Beispielsweise wird:

    https://x.y.z:8443/whats_on.html?type=now

    … zu:

    https://x.y.z:8443/playlist.m3u?channelid=S19.2E-1-1019-10301

    Über diesen Link wird die m3u-Datei für den Media-Player heruntergeladen. In dieser steht ebenfalls eine URL für den Videostream:

    Code
    #EXTM3U
    #EXTINF:-1,Das Erste HD
    http://x.y.z:3000/TS/S19.2E-1-1019-10301

    Der dort eingetragene Server "x.y.z" ist derjenige, der bei der Verarbeitung in TNTnet von getHost() zurückgegeben wird – also vermutlich das, was in der ursprünglichen URL als Webserver eingetragen ist.

    Eventuell müssen für eine solche Proxy-Applikation im Webserver noch ein Ergänzungen in .htaccess vorgenommen werden? Da bin ich aber dann raus.

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.7 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, satip, screenshot, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • .htaccess gibt es nur bei Apache.

    Aber es gibt wohl so etwas wie `tnt::HttpRequest::getHeader()` mit dem man o.g. Logik implementieren könnte. Ich kann nur leider noch nicht wirklich etwas dazu im Quellcode von vdr-plugin-live finden.

    Einsatzsituation

    HW

    MINIX NEO Z300

    SW

    OS Arch Linux rolling als LX-Container auf Proxmox Hypervisor
    vdr 2.6.1 mit FritzBox als satip device
    vdr-live 3.1.8 hinter NginxProxyManager


    PS: Ausserdem habe ich noch jeweils eine SAT- und eine Cable-dBox

  • Das zitierte getHost() macht intern ziemlich genau das, um anhand von HTTP_HOST den Servernamen zu ermitteln…

    Hardware: Antec NSK2480, Asus P8B75-M LX, Intel Core i5-3570T, 4 GB RAM, NVIDIA GT610, TT-Premium S2-6400, 128 GB SSD, 14 TB HDD, Pioneer BDR-207EBK
    Software: Ubuntu 22.04 LTS mit Kernel 6.8 und VDR 2.7.7 (mit offiziellen und eigenen Patches)
    Plugins: devstatus, dvbhddevice, dvd, dvdswitch, epgsearch, extrecmenu, recsearch, femon, live, markad, mlist, osdteletext, remote, satip, screenshot, skinnopacity, streamdev, systeminfo, undelete, xineliboutput
    Addons: VDR Convert 0.1.0 (angepasst)

  • Das müsste das getHost() aus der playlist.ecpp sein, das kommt also von tntnet.
    Wenn ich es da beim überfliegen richtig interpretiert habe, kommt der Wert aus dem request-header.

    Evtl. kann man den Proxy ja irgendwie anders konfigurieren, dass der Header nicht umgeschreiben wird? Falls das überhaupt zulässig ist.
    (Wenn ich das noch recht erinnere, war der Workaround bei SIP auch so ähnlich.)
    Anderenfalls muss man sich da wohl tntnet näher beschäftigen.

    Gruss
    SHF

    Mein (neuer) VDR:

    Software:
    Debian Wheezy mit Kernel 3.14
    VDR 2.0.7 & div. Plugins aus YaVDR-Paketen
    noad 0.8.6

    Hardware:
    MSI C847MS-E33, onboard 2x1,1GHz Sandybridge Celeron 847, 4GiB RAM
    32GB SSD (System), 4TB 3,5" WD-Red HDD (Video)
    TT FF DVB-S 1.5 FullTS-Mod PWM-Vreg-Mod, DVB-Sky 852 Dual DVB-S2
    Das ganze im alten HP Vectra VLi8-Gehäuse versorgt von:
    PicoPSU-160-XT und Meanwell EPP-150 im ATX-NT-Gehäuse

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!