How to: Roon Mobile over WireGuard on a UniFi USG

Are you sure that the UDM Pro is based on the mips architecture? I always thought it was arm64. You might want to double check that.

Thanks for getting back to me! Sorry, I’m getting you understandably confused. I’m trying to get site-to-site running between one site with a UDM Pro and one with a USG. I’m installing the docker arm64 image on the UDM Pro (and having issues with that, which I’m documenting over here on the main thread).

Separately, I’m also installing it on my USG at the other location using your very good instructions. I have the OpenVPN tunnel set up, and I can definitely access web interfaces / ssh across the subnets in both directions.

However, when I try to follow the directions to get the USG to run udp-proxy-2020, it just sits - no results.

john@Johns-MacBook-Air Downloads % wget https://github.com/synfinatic/udp-proxy-2020/releases/download/v0.0.11/udp-proxy-2020-0.0.11-linux-mips64      
john@Johns-MacBook-Air Downloads % scp -O -i ~/.ssh/207UDM_rsa.pub udp-proxy-2020-0.0.11-linux-mips64 admin@192.168.10.1:/home/admin/bin/udp-proxy-2020       

Then I ssh into my USG and…

admin@ubnt:~$ cd bin
admin@ubnt:~$ chmod +x udp-proxy-2020
admin@ubnt:~/bin$ sudo ./udp-proxy-2020 --port 9003 --interface eth1,vtun64

And this last line never comes back (it just sits). I tried downloading again from GitHub and renaming to make sure I didn’t screw up. Not sure if there’s a way to debug…

Thanks,
John

if you add -L trace to the command do you get any output?

Sorry, I don’t really know anything about the ASUS RT-AX88u or frankly the other 1000 different home routers that you can buy on Amazon. You probably want to research on some support forum such as https://www.snbforums.com on how to install a binary and auto-start it on boot.

Why yes I do!

admin@ubnt:~/bin$ sudo ./udp-proxy-2020 -L trace --port 9003 --interface eth1,vtun64
DEBUG   eth1: ifIndex: 3                             
DEBUG   eth1 network: ip+net		string: 192.168.10.1/23 
DEBUG   eth1 network: ip+net		string: 2600:8805:9a80:2b5:7a8a:20ff:fe44:4ed9/64 
DEBUG   eth1 network: ip+net		string: fe80::7a8a:20ff:fe44:4ed9/64 
DEBUG   Listen: (main.Listen) {
 iname: (string) (len=4) "eth1",
 netif: (*net.Interface)(0xc0001685c0)({
  Index: (int) 3,
  MTU: (int) 1500,
  Name: (string) (len=4) "eth1",
  HardwareAddr: (net.HardwareAddr) (len=6 cap=4436) 78:8a:20:44:4e:d9,
  Flags: (net.Flags) up|broadcast|multicast
 }),
 ports: ([]int32) (len=1 cap=1) {
  (int32) 9003
 },
 ipaddr: (string) (len=14) "192.168.11.255",
 promisc: (bool) false,
 handle: (*pcap.Handle)(<nil>),
 writer: (*pcapgo.Writer)(<nil>),
 inwriter: (*pcapgo.Writer)(<nil>),
 outwriter: (*pcapgo.Writer)(<nil>),
 timeout: (time.Duration) 250ms,
 clientTTL: (time.Duration) 0s,
 sendpkt: (chan main.Send) (cap=100) 0xc0000b0720,
 clients: (map[string]time.Time) {
 }
} 
DEBUG   vtun64: ifIndex: 7                           
DEBUG   Listen: (main.Listen) {
 iname: (string) (len=6) "vtun64",
 netif: (*net.Interface)(0xc000168c00)({
  Index: (int) 7,
  MTU: (int) 1500,
  Name: (string) (len=6) "vtun64",
  HardwareAddr: (net.HardwareAddr) ,
  Flags: (net.Flags) up|pointtopoint|multicast
 }),
 ports: ([]int32) (len=1 cap=1) {
  (int32) 9003
 },
 ipaddr: (string) "",
 promisc: (bool) true,
 handle: (*pcap.Handle)(<nil>),
 writer: (*pcapgo.Writer)(<nil>),
 inwriter: (*pcapgo.Writer)(<nil>),
 outwriter: (*pcapgo.Writer)(<nil>),
 timeout: (time.Duration) 250ms,
 clientTTL: (time.Duration) 0s,
 sendpkt: (chan main.Send) (cap=100) 0xc0000b07e0,
 clients: (map[string]time.Time) {
 }
} 
DEBUG   eth1: applying BPF Filter: (udp port 9003) and (src net 192.168.10.0/23) 
DEBUG   Opened pcap handle on eth1                   
DEBUG   vtun64: applying BPF Filter: (udp port 9003) and (src net 192.168.50.50/32) 
DEBUG   Opened pcap handle on vtun64                 
DEBUG   Initialization complete!                     
DEBUG   handlePackets(eth1) ticker                   
DEBUG   handlePackets(vtun64) ticker                 
DEBUG   handlePackets(eth1) ticker                   
DEBUG   handlePackets(vtun64) ticker                 
DEBUG   handlePackets(eth1) ticker                   
DEBUG   handlePackets(vtun64) ticker                 
DEBUG   handlePackets(eth1) ticker                   
DEBUG   handlePackets(vtun64) ticker                 

Does that mean it’s running fine, I just don’t know how to run it so that it comes back to a command line and I can log out? I’m trying to remember when I sort of knew my way around Unix in the mid-90’s.

Yep, everything is fine.

udp-proxy-2020 doesn’t run as a ā€œdaemonā€ā€¦ that’s fallen out of favor now with modern systems like systemd and Docker. Hence it runs in the foreground like you’re seeing.

So you should be able to continue to follow @Nepherte’s instructions above to get it to run automatically on boot.

Awesome! Many thanks! Now I can focus on trying to get it to run on the UDM in Docker on the other thread - I’m a 2-for-the-price-of-one customer :slight_smile:
But I’m going to write up my dummies guide, since I think this is going to be a non-zero use case :slight_smile:

Awesome info, thanks to all who contributed!

My situation is a little different, and I got things almost working.

I run OPNsense on my home network. It has Wireguard installed configured with peers for my laptops and phones. All Apple devices. OPNsense is setup to allow full access to my home network via Wireguard, including internet. Everything works, including DNS and resolving of local and public addresses.

On OPNsense there is an official plugin called os-udpbroadcastrelay. Its function is very similar (even identical?) to udp-proxy-2020.

And for the good news, it seems to work. Roon connects and does not loose its configured audio devices. Local Macbook speakers are available too.

I can play and control home devices while connected to Wireguard.

However, when I try to play on the Macbook to the Macbook Speakers, the playback timer just sits at 0:00, and after a few seconds skips to the next song, sits at 0:00 for a while and so on.

Its not playing …

I tried with udp-proxy-2020 and it shows the same behavior.

Any ideas please?

Edit: Some traffic was getting blocked still. Firewall rules to allow traffic made things work.

Hi and again, thank you to everyone in this thread. My use case is similar however I have PFSense firewalls in both locations with wireguard up and running for over a year now. Point to Point.

PFSense udpbroadcastrelay package states that it cannot send the UDP packages over WireGuard VPN. WG is L3, needs an L2 VPN and I’m not going to setup a second VPN between locations for now.

I don’t want to install anything on my PFSense, I would rather run UDP proxy in an LXC on proxmox (on both networks), pointing to the WG gateways instead of the interfaces. Is that possible?

No. That is not possible.

I wonder if you can perhaps get this working with some combination of ZeroTier with bridge nodes and @Aaron_Turner’s UDP Proxy. That would be in addition to what you’ve already got working with WireGuard on your firewalls, so you’d have to be comfortable with adding ZeroTier to the mix.

I use UDP Proxy to enable Roon core to run on a different subnet than my controllers and a couple of endpoints. I run it in a Docker container on the same machine on which my core, also in a container, runs. Works great. Thanks @Aaron_Turner!

thank you @Aaron_Turner and thank you for writing up this proxy. I hope you realize I was kidding around after reading your readme… ā€œA crappy UDP router for the year 2020 and beyond.ā€

I am going to try ZeroTier and see if that gets things going? Do you have any other ideas?

@gTunes Can you elaborate? You have UDP Proxy running on the same machine as Core? I thought UDP Proxy has to run on your firewall? Pointing directly to specific interfaces to work?
ā€œudp-proxy-2020 --port 9003 --interface eth0,eth0.100,eth1,tun0 --cache-ttl 300ā€

I was hoping I could install it directly on the LXC that runs my Roon Server and point it to the gateway:
ā€œudp-proxy-2020 --port 9003 --gateway 10.100.90.1 --cache-ttl 300ā€

Setup the reverse on my other network… so they are talking directly to each other over the wireguard VPN. If the service is running on each LAN and has a clear communication path to each other, @Aaron_Turner ?

In the case of VPN, your firewall (which is also your router) won’t route multi-cast packets across network boundaries. To get the proxy to work, it has to run on the router so that it can essentially pick up the packets on one side and adjust/write them to the other. You can’t do this from any arbitrary machine - it has to be the router.

I’m doing something different. I have vlans within a single site. I run core and the proxy on the same machine and, on that machine, the proxy is able to read from one interface and write to the other. The packets it places on the ā€œotherā€ network don’t have to go through a router to get to their destination. In my case, I run it like this:

udp-proxy-2020 --port 9003 --interface eth0,eth1 --cache-ttl 300

I’ve used ZeroTier a bit but I’m no expert. The hope would be that if you ran it on your proxmox box (where your core is) and you put that specific node in bridge mode, you’d see an interface such as ā€œzt0ā€ show up and that UDP Proxy would be able to route to it. So your interfaces would be something like eth0,zt0. (you’d have to figure these out with something like ā€œip link showā€)

I’m not 100% sure about any of this, though.

1 Like

Thank you for those details… I want to see if there is a solution that does not involve installing UDP proxy on my netgate box. However, I would be game to do that if I cannot find another solution.

Just got this msg… Reddit - Dive into anything

Maybe ZeroTier will do the trick?

No offense taken. Just you asked a simple question and you got a simple answer. :smiley:

Generally speaking site-to-site isn’t something that I do personally, have no way of testing and just can’t support- mostly because everyone’s setup is very different and remote debugging via email/etc is too hard/painful.

Never used ZeroTier or other options and the way UDP Proxy 2020 works is kinda an ugly hack (hence the crappy part) and you already got a VPN. In theory, ZeroTier might work, but there are a lot of ???'s- especially if you want to keep your current network setup.

I may be wrong that you also need UDP Proxy when running ZeroTier in bridge mode. It’s worth trying with exactly one bridge node on both networks and with the core and ZeroTier bridge on the same device.

Figured you would get my bad joke… Just had some coffee and took a step back. I’m thinking now to install OpenVPN and UDP Proxy 2020 on the LXC that is running Roon Server?

The Open VPN on an LXC in home B. Try to route the Open VPN tunnel over my existing wireguard VPN so I don’t need to open any more ports?

How does that sound?

You can try. Fundamentally, UDP Proxy 2020 was designed as a router. Routers move packets between interfaces to forward traffic to other hosts. When you run UDP Proxy 2020 on the same host as Roon, it’s only half a router. Yes, a real router has no problems delivering packets to itself, but again, UDP Proxy 2020 is a crappy router. :smiley:

People sometimes have seen issues with that. I don’t know why, and I’ve never tried that. Roon Server was designed to run on your internal network and UDP Proxy 2020 was designed to run on your router/firewall.

Fundamentally, there are a billion and one possible network configurations and I’m just a dude who was trying to listen to Roon while visiting his parents in another state. Good luck!

You are far from just a dude :smiley:

What do you think about this article?

https://an0n-r0.medium.com/making-dlna-through-site-to-site-vpn-work-f393629f4ce0