Un routeur UDP merdique pour l'année 2020 et au-delà.
Donc je joue avec Roon et j'ai ce réseau domestique compliqué qui lance Roon en boucle. J'ai commencé à déboguer les choses et il s'avère que Roon envoie des messages diffusés à UDP/9003. Bien entendu, mon pare-feu/routeur ne transmettra pas ces messages, car c'est la bonne chose à faire.
Malheureusement, je souhaite vraiment que ces messages diffusés soient transférés vers d'autres VLAN/sous-réseaux de mon réseau local. J'ai commencé à utiliser udp-proxy-relay-redux qui a très bien fonctionné au début.
Mais j'aime aussi beaucoup ces messages transmis via mes connexions OpenVPN qui utilisent le pilote tun
qui est une interface point à point et ne prend explicitement pas en charge les diffusions. Cela n'a pas bien fonctionné avec udp-proxy-relay-redux car Roon se comporte mal et essaie toujours d'envoyer des "diffusions" à l'adresse .255 qui sont ensuite abandonnées car mon serveur VPN n'a pas l'adresse xxx255. Fondamentalement, sur une interface point à point, ces « diffusions » étaient traitées comme un paquet destiné à un autre hôte et, à juste titre, ignorées.
Au lieu d'utiliser un socket UDP normal pour écouter les messages diffusés, udp-proxy-2020
utilise libpcap pour « renifler » les messages diffusés UDP. Cela signifie qu'il peut être beaucoup plus flexible quant aux paquets qu'il "voit" afin de pouvoir ensuite les envoyer via libpcap/injection de paquets sur toutes les autres interfaces configurées. Si cela vous fait dire « ew », eh bien, bienvenue en 2020.
J'écris ceci dans GoLang, donc au moins la compilation croisée sur votre routeur/pare-feu Linux/FreeBSD aléatoire est raisonnablement facile. Pas de vilain complément C croisé ou d'essayer d'installer Python/Ruby et un tas de bibliothèques.
Aussi : HAHAHAHAHAHAHA ! Rien de tout cela n’est vrai ! Avoir besoin d'utiliser libpcap signifie que je dois effectuer une compilation croisée à l'aide de CGO car gopacket/pcapgo ne prend en charge Linux que pour la lecture et l'écriture sur les interfaces réseau (Ethernet ?).
Presque tous les systèmes de type Unix sont pris en charge car la liste des dépendances ne contient que libpcap
et golang
. Je développe sur MacOS et cible spécifiquement pfSense/FreeBSD et Ubiquiti USG, EdgeRouter et DreamMachine/Pro car ceux-ci sont assez courants parmi la communauté des utilisateurs de Roon.
Si vous utilisez une distribution basée sur Linux RedHat ou Debian, le moyen le plus simple d'installer est de récupérer le fichier .rpm
ou .deb
approprié et de l'installer avec votre gestionnaire de paquets. Modifiez ensuite /etc/udp-proxy-2020.conf
et démarrez via : systemctl start udp-proxy-2020
.
Il existe également une image docker disponible pour Linux sur AMD64 et ARM64 (comme l'UDM Ubiquiti).
Notez que pour les déploiements Docker, vous devez utiliser le réseau hôte.
Je publie des binaires pour Linux, FreeBSD (pfSense) et MacOS pour le matériel Intel, ARM et MIPS.
Des instructions et des scripts de démarrage sont désormais disponibles dans le répertoire startup-scripts. Si vous savez comment ajouter la prise en charge d'une autre plate-forme, veuillez m'envoyer une pull request !
Exécutez udp-proxy-2020 --help
pour une liste actuelle des options de ligne de commande.
Veuillez également noter que sur de nombreux systèmes d'exploitation, vous devrez l'exécuter en tant qu'utilisateur root
. Les systèmes Linux peuvent éventuellement accorder la fonctionnalité CAP_NET_RAW
.
Actuellement, il n'y a que quelques indicateurs dont vous devez probablement vous soucier :
--interface
-- Spécifiez deux ou plusieurs interfaces réseau sur lesquelles écouter.--port
-- Spécifiez un ou plusieurs ports UDP à surveiller.--level
-- Spécifiez le niveau de journalisation : [trace|debug|warn|info|error]Options avancées :
--fixed-ip
-- Coder en dur un @ vers lequel toujours envoyer du trafic. Utile pour des choses comme OpenVPN en mode site à site.--timeout
-- Nombre de ms pour la valeur du délai d'expiration de pcap. (la valeur par défaut est 250 ms)--cache-ttl
-- Nombre de minutes pendant lesquelles les adresses IP sont mises en cache. (la valeur par défaut est 180 minutes / 3 heures) Cette valeur devra peut-être être augmentée si vous rencontrez des problèmes pour transmettre le trafic aux clients sur les tunnels OpenVPN si vous ne pouvez pas utiliser --fixed-ip
car les clients n'ont pas d'adresse IP fixe.--no-listen
-- Ne pas écouter sur le(s) port(s) UDP spécifié(s) pour éviter les conflits--deliver-local
-- Livrer les paquets localement sur l'interface de bouclage Il existe bien sûr d'autres indicateurs, exécutez ./udp-proxy-2020 --help
pour une liste complète.
Exemple:
udp-proxy-2020 --port 9003 --interface eth0,eth0.100,eth1,tun0 --cache-ttl 300
Transmettrait les paquets udp/9003 sur quatre interfaces : eth0, eth1, VLAN100 sur eth0 et tun0. Les adresses IP des clients sur tun0 seront mémorisées pendant 5 minutes une fois apprises.
Remarque : « apprentissage » nécessite que le client envoie d'abord un message udp/9003 ! Si votre application nécessite d'abord qu'un message soit envoyé au client, vous devrez alors spécifier --fixed-ip=1.2.3.4@tun0
où 1.2.3.4
est l'adresse IP du client sur tun0.
J'ai testé les deux configurations VPN "Road Warrior" avec le client Roon exécuté sur mon ordinateur portable et me connectant à mon pare-feu domestique via OpenVPN et Wireguard. Personnellement, j'utilise Wireguard au lieu d'OpenVPN car il est plus sécurisé et offre de meilleures performances.
J'ai également testé le VPN site à site en utilisant Wireguard + pfSense. J'ai suivi les instructions du VPN Wireguard site à site pfSense et installé udp-proxy-2020
sur les deux pare-feu. Vous devez configurer l'option --interface
pour inclure à la fois les interfaces réseau LAN et Wireguard.
Si vous construisez pour la même plate-forme que celle sur laquelle vous avez l'intention d'exécuter udp-proxy-2020
, il vous suffit de vous assurer que vous disposez libpcap
et des en-têtes nécessaires (vous aurez peut-être besoin d'un package -dev
pour cela) et d'exécuter make
ou gmake
selon le cas ( nous avons besoin de GNU Make, pas de BSD Make).
Si vous avez besoin de créer des plateformes multiplateformes, l'une des cibles suivantes peut vous aider :
make linux-amd64
via Dockermake linux-mips64
(Linux/MIPS64 big-endian pour Ubiquiti USG/EdgeRouter) via Dockermake linux-arm
via Docker :make freebsd
(pfSense 2.6) via Vagrant & VirtualBoxmake docker
Vous pouvez obtenir une liste complète des cibles make et des informations de base à leur sujet en exécutant : make help
.
À partir de la v0.0.11, udp-proxy-2020
crée désormais par défaut un socket d'écoute UDP sur le ou --port
spécifiés. Cela empêche le système d'exploitation sous-jacent d'émettre des messages ICMP Port Unreachable qui peuvent interrompre certains clients (notamment le client Roon iOS).
La seule fois où vous devriez avoir besoin d'utiliser l'indicateur --no-listen
c'est s'il existe un autre logiciel qui s'exécute sur le même hôte que udp-proxy-2020
.
Depuis la v0.1.0, oui. Vous devez spécifier les options --deliver-local
et --no-listen
pour qu'il délivre les paquets via l'interface de bouclage.
Ces indicateurs concernent les problèmes de débogage avec udp-proxy-2020
. Vous devez utiliser ces indicateurs lorsque je vous demande de le faire dans le cadre d'un ticket que vous avez ouvert pour udp-proxy-2020
.
Depuis la page des versions sur Github.
Non, ce n'est pas un proxy. C'est plutôt un routeur. Vous n'avez pas besoin d'apporter de modifications autres que de l'exécuter sur votre routeur/pare-feu domestique.
Honnêtement, je n’ai pas vraiment réfléchi au nom et c’est la première chose qui m’est venue à l’esprit. De plus, nommer est difficile.
tun
, comme celles utilisées par OpenVPNraw
, comme celles utilisées par Wireguardvti
pour IPSec site à siteNotez que les tunnels VPN L2TP sous Linux ne sont pas compatibles avec udp-proxy-2020 car le noyau Linux expose ces interfaces en tant que Linux SLL qui ne fournit pas un décodage précis des paquets.
Je ne l'ai donc pas fait moi-même, mais Bart Verhoeven sur les forums de la communauté Roon a écrit cette procédure très détaillée.
udp-proxy-2020 est conçu pour plusieurs systèmes d'exploitation et plates-formes matérielles :
darwin-amd64
linux-amd64
linux-arm64
(RasPi 2 V1.2 et supérieur, Ubiquiti UniFi Dream Machine)linux-armv7
(RasPi 2 V1.1 et versions antérieures)linux-armv6
linux-armv5
linux-mips64
(Ubiquiti USG/EdgeRouter)freebsd-amd64
(fonctionne avec pfSense sur x86)freebsd-arm64
(Netgate SG-1100 et SG-2100)freebsd-armv7
(Netgate SG-3100)Honnêtement, envoyez-moi simplement un e-mail disant merci ou "star" ce projet dans GitHub suffit, merci.
Parfois, quelqu'un me demande de me donner quelques dollars, mais je n'en ai vraiment pas besoin. Si vous souhaitez toujours me donner quelques dollars, je préférerais de loin que vous fassiez un don à la banque alimentaire Second Harvest, qui est locale chez moi et qui pourrait consacrer votre argent à un meilleur travail que moi.