How I got Roon working over OpenVPN (hard for me, easy for you)

@Aaron_Turner, well these two don’t seem to run, same as previous batch. here is the error message:

vexari@RT-AC68U-E238:/jffs/scripts# ./udp-proxy-2020-0.0.9-linux-armv7
FATAL: kernel too old
Aborted

vexari@RT-AC68U-E238:/jffs/scripts# ./udp-proxy-2020-0.0.9-linux-armv6
FATAL: kernel too old
Aborted

in my router’s system information page I found the following info:
CPU Model BCM470x - Cortex A7 ARMv7 revision 0 (Cores: 2)

@Aaron_Turner
I realize that my case is probably hopeless or too complicated with somehow outdated hardware.
What would you recommend as an affordable replacement to my actual router that will run your udp-proxy-2020 solution ? Something that could work with up to a 1Gb up/down connexion and maybe get up to 100Mbps with openVPN. Right now with my actual router I get roughly 40-50Mbps through output with openVPN.

@Vexari,

So i was actually going to tell you to do something like that, but the peeps over at SBN pointed at me some scripts which should in theory give me a working build environment. Right now I’m trying to figure out it will work for me. Gonna take a bit as I’ve got other things on my plate right now. Maybe in a week?

As for router recommendations… depends on if you need an all-in-one like you have today? I honestly, don’t have anything I “like” that does wifi as they’re all going to have the issue you mention- slow OpenVPN because they all have underpowered CPU’s (although maybe things have changed? I honestly don’t know anymore.)

I personally use Ubiquiti for my switches / wifi access points and a cheap small computer from Amazon running pfSense for firewall/router. People also seem to like the Ubiquiti Dream Machine (Pro) for router/firewall duties since it integrates well with the switches/AP, but if you want more complicated networking config, then IMHO pfSense is where it is at. There are also the pfSense appliances from Nextgate or OpenSense.

That said, my home network config would be considered somewhat insane by most people’s standards so just because that’s what I use doesn’t mean its appropriate for you.

@Aaron_Turner
I’m not in a hurry. If you feel like testing this working build environment I can’t say no but don’t sweat too much over it.
If that doesn’t work out I’ll investigate into one of those pfSense appliance such as the Netgate 1100 or 2100, the other options seem to $$$.

So did a bunch of research on the AsusMarlin/AC68U and tried to get it to work, and the more I learn the more problems I run into and it’s very unclear if it is even possible for various reasons (there is no gogcc that is part of the available toolchain being the biggest it seems, as well as relying on uclibc instead of glibc which I’m not sure will work).

Anyways, going to have to say this isn’t likely to ever be supported. Might try reading this thread and seeing what other people are using successfully. Without more information about what features you actually require, i’m not sure what I can recommend.

@Aaron_Turner
Too bad to see that this will finally not work with my RT-AC68U router and thanks so much for taking the time to try this out.

The features I need are not too complicated. My home internet connexion is actually 100/100 Mbps (the provider allows for up to 10/10 Gbps). The actual router is configured quite simply with some port forwarding to allow me to vnc thru ssh to my home iMac. NAT + Firewall and Trend Micro network protection and QoS. I also have an openVPN server set up on the router which runs at about 45 Mbps. This speed is enough for my Roon audio streaming needs. I actually only need to find a way to make my iPhone work with Roon (now I can connect remotely to my Roon server but not listen).
I could change my router but I’m not quite ready to spend $800 for something like the Netgate 6100. The cheaper, the better.

When re-reading through the thread the following options seem to work for remote Roon on iOS:

  1. Wireguard on Raspberry Pi (I could keep my actual router but maybe too complicated to set-up)
  • This makes me think:
    could I install an openVPN server (via Tunnelblick) on my Roon server mac and maybe run your udp-proxy-2020 binary on this same mac (2012 intel iMac)?
  1. Wireguard on my UniFi USG (the hardware is quite cheap but openVPN seems to run slower than on my actual router)
  2. pfSense appliance (maybe more user friendly than (1.), such as Netgate 1100 or maybe get a Chinese Qotom fanless mini pc box which would have an intel i3 processor for roghly the same price as the Netgate box in europe (~$250)

Dam, i wish i had an option like 10/10Gbps… not that I need that, but even 250/250Mbps would be :man_dancing:

You can run OpenVPN or Wireguard + udp-proxy-2020 on your Mac. You don’t need the Pi. You will need to configure your Asus router to port forward to your Mac though. This works really well if your ISP gives you a static IP or you use one of the various dynamic DNS providers. Or yeah, you can use a Pi & Wireguard and do the port forward thing to that.

I have both a USG-3P and USG Pro-4 collecting dust because yes, the OpenVPN and Wireguard are very slow, Only IPSec is fast, because that uses the hardware acceleration.

A mini-PC running pfSense or a Netgate is a great option, but probably overkill for most people to be honest.

I tried first to install an OpenVPN server on my Mac but the info I’ve found was very scarce and then stumbled on a very complete tutorial on how to run a Wireguard server on a Mac and now I have a Wireguard server running and working :))

I’m strugling now on the udp-proxy-2020 part.
I installed the udp-proxy-2020-0.0.8-darwin-amd64 binary which is the one I should be running if I got it right (I’m using an Intel iMac on OS X 10.13.6) but when I run it I get the following:

iMac27-home:udp-proxy-2020 xavier$ ./udp-proxy-2020-0.0.8-darwin-amd64
fatal error: unexpected signal during runtime execution
[signal SIGSEGV: segmentation violation code=0x1 addr=0xb01dfacedebac1e pc=0x7fff5edd130a]

runtime stack:
runtime: unexpected return pc for runtime.sigpanic called from 0x7fff5edd130a
stack: frame={sp:0x7ffeefbff948, fp:0x7ffeefbff998} stack=[0x7ffeefb809e8,0x7ffeefbffa50)
0x00007ffeefbff848:  0x01007ffeefbff868  0x0000000000000004 
0x00007ffeefbff858:  0x000000000000001f  0x00007fff5edd130a 
0x00007ffeefbff868:  0x0b01dfacedebac1e  0x0000000000000001 
0x00007ffeefbff878:  0x00000000040346b1 <runtime.throw+0x0000000000000071>  0x00007ffeefbff918 
0x00007ffeefbff888:  0x00000000041c89cf  0x00007ffeefbff8d0 
0x00007ffeefbff898:  0x0000000004034968 <runtime.fatalthrow.func1+0x0000000000000048>  0x00000000043449e0 
0x00007ffeefbff8a8:  0x0000000000000001  0x0000000000000001 
0x00007ffeefbff8b8:  0x00007ffeefbff918  0x00000000040346b1 <runtime.throw+0x0000000000000071> 
0x00007ffeefbff8c8:  0x00000000043449e0  0x00007ffeefbff908 
0x00007ffeefbff8d8:  0x00000000040348f0 <runtime.fatalthrow+0x0000000000000050>  0x00007ffeefbff8e8 
0x00007ffeefbff8e8:  0x0000000004034920 <runtime.fatalthrow.func1+0x0000000000000000>  0x00000000043449e0 
0x00007ffeefbff8f8:  0x00000000040346b1 <runtime.throw+0x0000000000000071>  0x00007ffeefbff918 
0x00007ffeefbff908:  0x00007ffeefbff938  0x00000000040346b1 <runtime.throw+0x0000000000000071> 
0x00007ffeefbff918:  0x00007ffeefbff920  0x00000000040346e0 <runtime.throw.func1+0x0000000000000000> 
0x00007ffeefbff928:  0x00000000041cc41f  0x000000000000002a 
0x00007ffeefbff938:  0x00007ffeefbff988  0x0000000004049cb6 <runtime.sigpanic+0x0000000000000396> 
0x00007ffeefbff948: <0x00000000041cc41f  0x00000000043449e0 
0x00007ffeefbff958:  0x00007ffeefbff9c8  0x0000000004027ba6 <runtime.(*mheap).allocSpan+0x0000000000000546> 
0x00007ffeefbff968:  0x000000c0001d0000  0x0000000000002000 
0x00007ffeefbff978:  0x0000000000000008  0x00000000040645c0 <runtime.walltime_trampoline+0x0000000000000000> 
0x00007ffeefbff988:  0x00007ffeefbff9d0 !0x00007fff5edd130a 
0x00007ffeefbff998: >0x00007ffeefbff9d0  0x0000000004328000 
0x00007ffeefbff9a8:  0x0000000000000163  0x0000000004120e05 <golang.org/x/sys/unix.libc_ioctl_trampoline+0x0000000000000005> 
0x00007ffeefbff9b8:  0x0000000004064bff <runtime.syscall+0x000000000000001f>  0x000000c0001b1078 
0x00007ffeefbff9c8:  0x000000000406456c <runtime.nanotime_trampoline+0x000000000000000c>  0x000000c0001b1048 
0x00007ffeefbff9d8:  0x0000000004062a90 <runtime.asmcgocall+0x0000000000000070>  0x0000000000000001 
0x00007ffeefbff9e8:  0x0000000004001400  0x1400000000001018 
0x00007ffeefbff9f8:  0x0000000000000010  0x00000000048a3ad8 
0x00007ffeefbffa08:  0x0000000000000fe0  0x000000c0000001a0 
0x00007ffeefbffa18:  0x0000000004060ba9 <runtime.systemstack+0x0000000000000049>  0x0000000000000004 
0x00007ffeefbffa28:  0x00000000041f6f68  0x00000000043449e0 
0x00007ffeefbffa38:  0x00007ffeefbffa80  0x0000000004060aa5 <runtime.mstart+0x0000000000000005> 
0x00007ffeefbffa48:  0x0000000004060a5d <runtime.rt0_go+0x000000000000013d> 
runtime.throw({0x41cc41f, 0x43449e0})
	/usr/local/Cellar/go/1.17.2/libexec/src/runtime/panic.go:1198 +0x71
runtime: unexpected return pc for runtime.sigpanic called from 0x7fff5edd130a
stack: frame={sp:0x7ffeefbff948, fp:0x7ffeefbff998} stack=[0x7ffeefb809e8,0x7ffeefbffa50)
0x00007ffeefbff848:  0x01007ffeefbff868  0x0000000000000004 
0x00007ffeefbff858:  0x000000000000001f  0x00007fff5edd130a 
0x00007ffeefbff868:  0x0b01dfacedebac1e  0x0000000000000001 
0x00007ffeefbff878:  0x00000000040346b1 <runtime.throw+0x0000000000000071>  0x00007ffeefbff918 
0x00007ffeefbff888:  0x00000000041c89cf  0x00007ffeefbff8d0 
0x00007ffeefbff898:  0x0000000004034968 <runtime.fatalthrow.func1+0x0000000000000048>  0x00000000043449e0 
0x00007ffeefbff8a8:  0x0000000000000001  0x0000000000000001 
0x00007ffeefbff8b8:  0x00007ffeefbff918  0x00000000040346b1 <runtime.throw+0x0000000000000071> 
0x00007ffeefbff8c8:  0x00000000043449e0  0x00007ffeefbff908 
0x00007ffeefbff8d8:  0x00000000040348f0 <runtime.fatalthrow+0x0000000000000050>  0x00007ffeefbff8e8 
0x00007ffeefbff8e8:  0x0000000004034920 <runtime.fatalthrow.func1+0x0000000000000000>  0x00000000043449e0 
0x00007ffeefbff8f8:  0x00000000040346b1 <runtime.throw+0x0000000000000071>  0x00007ffeefbff918 
0x00007ffeefbff908:  0x00007ffeefbff938  0x00000000040346b1 <runtime.throw+0x0000000000000071> 
0x00007ffeefbff918:  0x00007ffeefbff920  0x00000000040346e0 <runtime.throw.func1+0x0000000000000000> 
0x00007ffeefbff928:  0x00000000041cc41f  0x000000000000002a 
0x00007ffeefbff938:  0x00007ffeefbff988  0x0000000004049cb6 <runtime.sigpanic+0x0000000000000396> 
0x00007ffeefbff948: <0x00000000041cc41f  0x00000000043449e0 
0x00007ffeefbff958:  0x00007ffeefbff9c8  0x0000000004027ba6 <runtime.(*mheap).allocSpan+0x0000000000000546> 
0x00007ffeefbff968:  0x000000c0001d0000  0x0000000000002000 
0x00007ffeefbff978:  0x0000000000000008  0x00000000040645c0 <runtime.walltime_trampoline+0x0000000000000000> 
0x00007ffeefbff988:  0x00007ffeefbff9d0 !0x00007fff5edd130a 
0x00007ffeefbff998: >0x00007ffeefbff9d0  0x0000000004328000 
0x00007ffeefbff9a8:  0x0000000000000163  0x0000000004120e05 <golang.org/x/sys/unix.libc_ioctl_trampoline+0x0000000000000005> 
0x00007ffeefbff9b8:  0x0000000004064bff <runtime.syscall+0x000000000000001f>  0x000000c0001b1078 
0x00007ffeefbff9c8:  0x000000000406456c <runtime.nanotime_trampoline+0x000000000000000c>  0x000000c0001b1048 
0x00007ffeefbff9d8:  0x0000000004062a90 <runtime.asmcgocall+0x0000000000000070>  0x0000000000000001 
0x00007ffeefbff9e8:  0x0000000004001400  0x1400000000001018 
0x00007ffeefbff9f8:  0x0000000000000010  0x00000000048a3ad8 
0x00007ffeefbffa08:  0x0000000000000fe0  0x000000c0000001a0 
0x00007ffeefbffa18:  0x0000000004060ba9 <runtime.systemstack+0x0000000000000049>  0x0000000000000004 
0x00007ffeefbffa28:  0x00000000041f6f68  0x00000000043449e0 
0x00007ffeefbffa38:  0x00007ffeefbffa80  0x0000000004060aa5 <runtime.mstart+0x0000000000000005> 
0x00007ffeefbffa48:  0x0000000004060a5d <runtime.rt0_go+0x000000000000013d> 
runtime.sigpanic()
	/usr/local/Cellar/go/1.17.2/libexec/src/runtime/signal_unix.go:719 +0x396

goroutine 1 [syscall]:
syscall.syscall(0x4120e00, 0x2, 0x40487413, 0xc0001b1108)
	/usr/local/Cellar/go/1.17.2/libexec/src/runtime/sys_darwin.go:22 +0x3b fp=0xc0001b1078 sp=0xc0001b1058 pc=0x405f87b
syscall.syscall(0xc, 0x1a, 0x41f9660, 0x41cfc08)
	<autogenerated>:1 +0x26 fp=0xc0001b10c0 sp=0xc0001b1078 pc=0x4065326
golang.org/x/sys/unix.ioctl(0x15, 0x41f9660, 0x41cfc08)
	/Users/aturner/go/pkg/mod/golang.org/x/sys@v0.0.0-20200930185726-fdedc70b468f/unix/zsyscall_darwin_amd64.go:731 +0x39 fp=0xc0001b10f0 sp=0xc0001b10c0 pc=0x4120a99
golang.org/x/sys/unix.IoctlGetTermios(...)
	/Users/aturner/go/pkg/mod/golang.org/x/sys@v0.0.0-20200930185726-fdedc70b468f/unix/ioctl.go:72
github.com/sirupsen/logrus.isTerminal(0x4)
	/Users/aturner/go/pkg/mod/github.com/sirupsen/logrus@v1.7.0/terminal_check_bsd.go:11 +0x50 fp=0xc0001b1160 sp=0xc0001b10f0 pc=0x41245b0
github.com/sirupsen/logrus.checkIfTerminal({0x41f9480, 0xc000010020})
	/Users/aturner/go/pkg/mod/github.com/sirupsen/logrus@v1.7.0/terminal_check_notappengine.go:13 +0x75 fp=0xc0001b1178 sp=0xc0001b1160 pc=0x4124655
github.com/sirupsen/logrus.(*TextFormatter).init(0xc00005e240, 0x4b22328)
	/Users/aturner/go/pkg/mod/github.com/sirupsen/logrus@v1.7.0/text_formatter.go:103 +0x34 fp=0xc0001b11f8 sp=0xc0001b1178 pc=0x4124734
github.com/sirupsen/logrus.(*TextFormatter).Format.func1()
	/Users/aturner/go/pkg/mod/github.com/sirupsen/logrus@v1.7.0/text_formatter.go:193 +0x25 fp=0xc0001b1218 sp=0xc0001b11f8 pc=0x4125de5
sync.(*Once).doSlow(0x41fc170, 0xc00000e2a0)
	/usr/local/Cellar/go/1.17.2/libexec/src/sync/once.go:68 +0xd2 fp=0xc0001b1280 sp=0xc0001b1218 pc=0x4070452
sync.(*Once).Do(...)
	/usr/local/Cellar/go/1.17.2/libexec/src/sync/once.go:59
github.com/sirupsen/logrus.(*TextFormatter).Format(0xc00005e240, 0xc0001b88c0)
	/Users/aturner/go/pkg/mod/github.com/sirupsen/logrus@v1.7.0/text_formatter.go:193 +0xebe fp=0xc0001b17f0 sp=0xc0001b1280 pc=0x412579e
github.com/sirupsen/logrus.(*Entry).write(0xc0001b88c0)
	/Users/aturner/go/pkg/mod/github.com/sirupsen/logrus@v1.7.0/entry.go:271 +0xa5 fp=0xc0001b1868 sp=0xc0001b17f0 pc=0x4122ce5
github.com/sirupsen/logrus.Entry.log({0xc0001b8000, 0xc000068cc0, {0x0, 0x0, 0x0}, 0x0, 0x0, {0x0, 0x0}, 0x0, ...}, ...)
	/Users/aturner/go/pkg/mod/github.com/sirupsen/logrus@v1.7.0/entry.go:247 +0x25a fp=0xc0001b18e0 sp=0xc0001b1868 pc=0x412297a
github.com/sirupsen/logrus.(*Entry).Log(0xc0001b8850, 0x1, {0xc0001b1d00, 0x4124186, 0x41488d8})
	/Users/aturner/go/pkg/mod/github.com/sirupsen/logrus@v1.7.0/entry.go:283 +0xa8 fp=0xc0001b19e8 sp=0xc0001b18e0 pc=0x4122f08
github.com/sirupsen/logrus.(*Logger).Log(0xc0001b8000, 0x1, {0xc0001b1d00, 0x1, 0x1})
	/Users/aturner/go/pkg/mod/github.com/sirupsen/logrus@v1.7.0/logger.go:198 +0x65 fp=0xc0001b1a28 sp=0xc0001b19e8 pc=0x4123e85
github.com/sirupsen/logrus.(*Logger).Fatal(0xc0001ca000, {0xc0001b1d00, 0xc000010020, 0x0})
	/Users/aturner/go/pkg/mod/github.com/sirupsen/logrus@v1.7.0/logger.go:242 +0x31 fp=0xc0001b1a68 sp=0xc0001b1a28 pc=0x4123f51
github.com/sirupsen/logrus.Fatal(...)
	/Users/aturner/go/pkg/mod/github.com/sirupsen/logrus@v1.7.0/exported.go:134
main.main()
	/Users/aturner/go/src/github.com/synfinatic/udp-proxy-2020/cmd/main.go:84 +0x790 fp=0xc0001b1f80 sp=0xc0001b1a68 pc=0x4152ab0
runtime.main()
	/usr/local/Cellar/go/1.17.2/libexec/src/runtime/proc.go:255 +0x227 fp=0xc0001b1fe0 sp=0xc0001b1f80 pc=0x4036d47
runtime.goexit()
	/usr/local/Cellar/go/1.17.2/libexec/src/runtime/asm_amd64.s:1581 +0x1 fp=0xc0001b1fe8 sp=0xc0001b1fe0 pc=0x4062d81

10.13.6 is really old and probably the cause of your issue.

Damn. I can’t go any higher than 10.13.6 with this iMac.
But everything else is running fine like the Wireguard server, Roon, etc.
I feel like I’m so close but somehow this UDP broadcast messages sniffing paradise is eluding me.

Do you think by chance building udp-proxy-2020 myself on my old iMac could make this work or will this give me the same result ?

Then I guess this will leave me with the small Netgate box option.

and if that’s my only option left, will udp-proxy-2020 run on the Netgate 1100 or should I be better with the Qotom mini PC i3 (somehow at minimal power consumption).

[A little update about my Wireguard VPN server installation…]

After restarting my iMac to check if the Wireguard launch daemon was working, I noticed that running Roon on my iPhone the iPhone itself is now available as a Roon endpoint and I can listen to music remotely. This works whether on wifi or cellular (4G).
So I don’t seem to need udp-proxy-2020.

Maybe my quest is coming to an end at last :))
I’ll report back in a few days if this set-up is still working.

1 Like

@Aaron_Turner thnx for this, works perfect over OpenVPN and VLAN

1 Like

Hi, I’m running pfsense and OpenVPN on x86 hardware and would love to get Roon working on my iOS devices when I am traveling. I’ve tried to follow this thread and went to the GitHub page to see if there are detailed instructions on how to install the script including how to download it and also what to do to edit the .conf file. For example, what port to use and what interfaces to type in? For my setup, WAN is igb3, LAN is igb2

Are there more detailed, step by step, instructions a Linux/networking noob can follow? Thank you so much!

Hammer.

Hi Hammer,

The port is 9003. The instructions here: https://github.com/synfinatic/udp-proxy-2020/tree/main/startup-scripts/pfSense

That said, if you don’t know how to edit or copy files to your pfSense, I’m not sure I’m comfortable giving more detailed instructions because I don’t want to risk causing problems that you can’t fix on your own.

Thank you…I can edit using nano, but I don’t know how to download the script. And also what parameters I need in the conf file. I also would need some help getting the script to run each time I reboot the pfsense box. I do have a backup of my pfsense box if something goes really wrong! Thank you for your help!

So there is an example config file here:

You just need to replace the sample list of interfaces with yours. Specifically igb2 and the name of your OpenVPN server interface which is something like ovpns1. But the number could be different.

When you say “don’t know how to download the script” … use your browser? Or do you mean you don’t know how copy the files to your pfSense box? In that case you probably want to download them to your PC and then upload them to the pfSense box via scp.

Beyond that, maybe you want to ask someone who understands how to configure *BSD or pfSense. Sorry, I don’t have a fancy package installer… I’m not really a BSD person myself.

Thank you…so if my WAN is igb3, LAN is igb2, then the config file should be this?

change the port and add --interface {dev-name} as many times as needed.

udp_vars="–port 9003 --interface igb2,OPENVPN2 --logfile /var/log/udp-proxy-2020.log"

where OPENVPN2 is the name of the OpenVPN Server running on pfsense?

Thank you again for your help!

1 Like

I’m going to make a suggestion here: Just try it. See what happens.

Also you might notice that those arguments are the exact same CLI arguments that udp-proxy-2020 takes. That means you can even just test things in a shell and iterate a bit.

Good luck!

Hi, @Aaron_Turner

Thanks for making this! I’m newbie of networking. Could you please help, how to adjust the following settings to make its working?
My Setup :
office:
Roon Rock running 192.168.1.4
Synology Nas running Openvpn from the VPN Server package 192.168.1.2
its behind a modem & router, Openvpn port is forwarded in the router, & its working.
router, nas, rock, is setup as same subnet 255.255.255.0 gateway & dns is 192.168.1.1
home:
PC ip 192.168.1.3
its behind a modem & router is as same subnet 255.255.255.0 gateway & dns is 192.168.1.1
this is the screen capture of the docker in the synology docker packages, its error when starting the container:







圖片

Thanks