Ein beschissener UDP-Router für das Jahr 2020 und darüber hinaus.
Ich spiele also mit Roon und habe dieses komplizierte Heimnetzwerk, das Roon aus der Fassung bringt. Ich habe angefangen, Dinge zu debuggen, und es stellte sich heraus, dass Roon Broadcast- Nachrichten an UDP/9003 sendet. Meine Firewall/mein Router leitet diese Nachrichten natürlich nicht weiter, denn das ist die richtige Vorgehensweise.
Leider möchte ich unbedingt, dass diese Broadcast-Nachrichten an andere VLANs/Subnetze in meinem lokalen Netzwerk weitergeleitet werden. Ich habe angefangen, udp-proxy-relay-redux zu verwenden, was zunächst großartig funktionierte.
Mir gefallen aber auch diese Nachrichten sehr gut, die über meine OpenVPN-Verbindungen weitergeleitet werden, die den tun
-Treiber nutzen, der eine Punkt-zu-Punkt-Schnittstelle ist und deren explizite Übertragung keine Broadcasts unterstützt. Das hat mit udp-proxy-relay-redux nicht gut funktioniert, weil Roon sich schlecht benimmt und immer noch versucht, „Broadcasts“ an die .255-Adresse zu senden, die dann auf den Boden fallen gelassen werden, weil mein VPN-Server nicht die Adresse xxx255 hat. Grundsätzlich wurden diese „Broadcasts“ auf einer Punkt-zu-Punkt-Schnittstelle als Pakete behandelt, die an einen anderen Host gerichtet waren, und zu Recht ignoriert.
Anstatt einen normalen UDP-Socket zum Abhören von Broadcast-Nachrichten zu verwenden, verwendet udp-proxy-2020
libpcap, um die UDP-Broadcast-Nachrichten zu „schnüffeln“. Dies bedeutet, dass es viel flexibler sein kann, welche Pakete es „sieht“, sodass es sie dann per libpcap/packet-injection über alle anderen konfigurierten Schnittstellen senden kann. Wenn Sie dadurch „neu“ werden, dann willkommen im Jahr 2020.
Ich schreibe dies in GoLang, sodass zumindest das Cross-Kompilieren auf Ihrem beliebigen Linux/FreeBSD-Router/Ihrer Firewall einigermaßen einfach ist. Kein hässliches Cross-Complinging von C oder der Versuch, Python/Ruby und eine Reihe von Bibliotheken zu installieren.
Außerdem: HAHAHAHAHAHAHA! Nichts davon ist wahr! Die Verwendung von libpcap bedeutet, dass ich eine Cross-Kompilierung mit CGO durchführen muss, da gopacket/pcapgo Linux nur zum Lesen und Schreiben auf (Ethernet-?) Netzwerkschnittstellen unterstützt.
Es wird so gut wie jedes Unix-ähnliche System unterstützt, da die Abhängigkeitsliste nur libpcap
und golang
enthält. Ich entwickle auf MacOS und ziele speziell auf pfSense/FreeBSD und Ubiquiti USG, EdgeRouter und DreamMachine/Pro ab, da diese in der Roon-Benutzergemeinschaft weit verbreitet sind.
Wenn Sie eine Linux RedHat- oder Debian-basierte Distribution verwenden, ist die einfachste Installation die entsprechende .rpm
oder .deb
Datei und die Installation mit Ihrem Paketmanager. Bearbeiten Sie dann /etc/udp-proxy-2020.conf
und starten Sie über: systemctl start udp-proxy-2020
.
Es gibt auch ein Docker-Image für Linux auf AMD64 und ARM64 (wie das Ubiquiti UDM).
Beachten Sie, dass Sie für Docker-Bereitstellungen Host-Netzwerke verwenden sollten.
Ich veröffentliche Binärdateien für Linux, FreeBSD (pfSense) und MacOS für Intel-, ARM- und MIPS-Hardware.
Im Startup-Scripts-Verzeichnis sind jetzt Anweisungen und Startskripte verfügbar. Wenn Sie herausfinden, wie Sie Unterstützung für eine andere Plattform hinzufügen können, senden Sie mir bitte eine Pull-Anfrage!
Führen Sie udp-proxy-2020 --help
aus, um eine aktuelle Liste der Befehlszeilenoptionen anzuzeigen.
Bitte beachten Sie außerdem, dass Sie es auf vielen Betriebssystemen als root
-Benutzer ausführen müssen. Linux-Systeme können optional die CAP_NET_RAW
-Fähigkeit gewähren.
Derzeit gibt es nur ein paar Flags, über die Sie sich wahrscheinlich Sorgen machen müssen:
--interface
– Geben Sie zwei oder mehr Netzwerkschnittstellen an, die überwacht werden sollen.--port
– Geben Sie einen oder mehrere zu überwachende UDP-Ports an.--level
– Geben Sie die Protokollebene an: [trace|debug|warn|info|error]Erweiterte Optionen:
--fixed-ip
– Hardcodieren Sie ein @, an das immer Datenverkehr gesendet werden soll. Nützlich für Dinge wie OpenVPN im Site-to-Site-Modus.--timeout
– Anzahl der ms für den pcap-Timeout-Wert. (Standard ist 250 ms)--cache-ttl
– Anzahl der Minuten, für die IPs zwischengespeichert werden. (Standard ist 180 Min./3 Std.) Dieser Wert muss möglicherweise erhöht werden, wenn Sie Probleme bei der Weiterleitung des Datenverkehrs an Clients in OpenVPN-Tunneln haben und Sie --fixed-ip
nicht verwenden können, da Clients keine feste IP haben.--no-listen
– Die angegebenen UDP-Ports nicht abhören, um Konflikte zu vermeiden--deliver-local
– Pakete lokal auf der Loopback-Schnittstelle zustellen Es gibt natürlich noch andere Flags. Führen Sie ./udp-proxy-2020 --help
aus, um eine vollständige Liste zu erhalten.
Beispiel:
udp-proxy-2020 --port 9003 --interface eth0,eth0.100,eth1,tun0 --cache-ttl 300
Würde UDP/9003-Pakete auf vier Schnittstellen weiterleiten: eth0, eth1, VLAN100 auf eth0 und tun0. Client-IPs auf tun0 werden nach dem Erlernen 5 Minuten lang gespeichert.
Hinweis: „Lernen“ erfordert, dass der Client zuerst eine udp/9003-Nachricht sendet! Wenn Ihre Anwendung erfordert, dass zuerst eine Nachricht an den Client gesendet wird, müssen Sie --fixed-ip=1.2.3.4@tun0
angeben, wobei 1.2.3.4
die IP-Adresse des Clients auf tun0 ist.
Ich habe beide „Road Warrior“-VPN-Konfigurationen getestet, wobei der Roon-Client auf meinem Laptop läuft und über OpenVPN und Wireguard eine Verbindung zu meiner Heim-Firewall herstellt. Ich persönlich verwende Wireguard anstelle von OpenVPN, weil es sicherer ist und eine bessere Leistung bietet.
Ich habe auch Site-to-Site-VPN mit Wireguard + pfSense getestet. Ich habe die Site-to-Site Wireguard VPN-Anweisungen von pfSense befolgt und udp-proxy-2020
auf beiden Firewalls installiert. Sie müssen die Option --interface
so konfigurieren, dass sie sowohl die LAN- als auch die Wireguard-Netzwerkschnittstellen einbezieht.
Wenn Sie für dieselbe Plattform erstellen, auf der Sie udp-proxy-2020
ausführen möchten, müssen Sie nur sicherstellen, dass Sie über libpcap
und die erforderlichen Header verfügen (dafür benötigen Sie möglicherweise ein -dev
-Paket) und je nach Bedarf make
oder gmake
ausführen ( wir brauchen GNU Make, nicht BSD Make).
Wenn Sie plattformübergreifend bauen müssen, kann Ihnen eines der folgenden Ziele helfen:
make linux-amd64
über Dockermake linux-mips64
(Linux/MIPS64 Big-Endian für Ubiquiti USG/EdgeRouter) über Dockermake linux-arm
über Docker:make freebsd
(pfSense 2.6) über Vagrant und VirtualBoxmake docker
Sie können eine vollständige Liste der Make-Ziele und grundlegende Informationen dazu erhalten, indem Sie Folgendes ausführen: make help
.
Ab v0.0.11 erstellt udp-proxy-2020
nun standardmäßig einen UDP-Listening-Socket auf den angegebenen --port
(s). Dadurch wird verhindert, dass das zugrunde liegende Betriebssystem ICMP-Port-Unreachable-Meldungen ausgibt, die bestimmte Clients beschädigen können (insbesondere den Roon iOS-Client).
Sie sollten das Flag --no-listen
nur dann verwenden müssen, wenn eine andere Software auf demselben Host wie udp-proxy-2020
ausgeführt wird.
Ab v0.1.0 ja. Sie müssen die Optionen --deliver-local
und --no-listen
angeben, damit Pakete über die Loopback-Schnittstelle übermittelt werden.
Diese Flags dienen zum Debuggen von Problemen mit udp-proxy-2020
. Sie sollten diese Flags verwenden, wenn ich Sie im Rahmen eines Tickets, das Sie für udp-proxy-2020
geöffnet haben, dazu auffordere.
Von der Release-Seite auf Github.
Nein, es ist kein Proxy. Es ist eher wie ein Router. Sie müssen keine Änderungen vornehmen, außer es auf Ihrem Heimrouter/Ihrer Firewall auszuführen.
Ehrlich gesagt habe ich nicht wirklich viel über den Namen nachgedacht und das war das Erste, was mir in den Sinn kam. Außerdem ist die Namensgebung schwierig.
tun
-Schnittstellen, wie sie von OpenVPN verwendet werdenraw
, wie sie von Wireguard verwendet werdenvti
Schnittstellen für Site-to-Site-IPSecBeachten Sie, dass L2TP-VPN-Tunnel unter Linux nicht mit udp-proxy-2020 kompatibel sind, da der Linux-Kernel diese Schnittstellen als Linux-SLL verfügbar macht, was keine genaue Decodierung der Pakete ermöglicht.
Ich habe das also nicht selbst gemacht, aber Bart Verhoeven in den Foren der Roon-Community hat dies wirklich detailliert beschrieben.
udp-proxy-2020 wurde für mehrere Betriebssysteme und Hardwareplattformen entwickelt:
darwin-amd64
linux-amd64
linux-arm64
(RasPi 2 V1.2 und höher, Ubiquiti UniFi Dream Machine)linux-armv7
(RasPi 2 V1.1 und niedriger)linux-armv6
linux-armv5
linux-mips64
(Ubiquiti USG/EdgeRouter)freebsd-amd64
(funktioniert mit pfSense auf x86)freebsd-arm64
(Netgate SG-1100 & SG-2100)freebsd-armv7
(Netgate SG-3100)Ehrlich gesagt, schicken Sie mir einfach eine E-Mail mit den Worten „Danke“ oder „markieren“ Sie dieses Projekt in GitHub, das reicht aus, danke.
Gelegentlich wird jemand gefragt, ob er mir ein paar Dollar geben möchte, aber ich brauche wirklich kein Geld. Wenn Sie mir immer noch ein paar Dollar zur Verfügung stellen möchten, wäre es mir viel lieber, wenn Sie an die Second Harvest Food Bank spenden, die in meiner Nähe ist und Ihr Geld besser einsetzen könnte als ich.