How to set non-Tor qubes to automatically run over Proton VPN? (using WireGuard protocol)

You didn’t install the VPN itself, just the repo.

This command is missing (it’s in your notes):

sudo dnf install --refresh proton-vpn-gnome-desktop

I found it! It was in the left tab. I signed in but when I try to connect, it says something went wrong — an unexpected error. Do you know if maybe something about my setup is causing this? I tried changing the qube’s firewall settings from sysfirewall (default) to the non-default one as well as disabling the Kill Switch but that didn’t help.

1 Like

Did you set the firewall to “Limit outgoing connections”? If so, turn it back to “Allow” until you can connect.

This error is not very explicit, so I have no idea what went wrong here. Try running the application from the terminal instead and see if you can catch anything useful in the output:


Hello! I was following this rather useful tutorial, but I also ended up with the same error as the OP: Something went wrong, an unexpected error.

Not a very useful error. I have followed this tutorial to a tee, using Fedora 38 on Qubes 4.2, up too this point. I ran ProtonVPN from the terminal as you suggested and it threw up some critical GDK errors.

Sorry to hijack the thread but as the OP has gone awol, and I’m in the same boat I figured you maybe wouldn’t mind.

Can you provide the errors you get from the application?

Sure, Thanks! In the terminal, upon running the app I get this:

(protonvpn-app:4745): Gdk-CRITICAL **: 15:04:55.794: gdk_atom_intern: assertion ‘atom_name != NULL’ failed

(protonvpn-app:4745): Gdk-CRITICAL **: 15:04:55.795: gdk_atom_intern: assertion ‘atom_name != NULL’ failed
2024-01-08T14:04:56.062887 | | INFO | APP:PROCESS_START | self=<app.App object at 0x783a468b4c80 (proton+vpn+app+gtk+app+App at 0x647f3770f3a0)>

I cant seem to figure it out, or how I did, it, and I didn’t save the output, but earlier I had the terminal throwing up kill switch errors, something like not configured at the back end for a fall back or something. I cant remember how I got it to display this info, or I would copy it here

Here you go, this is what I meant:

:148 | INFO | Network connectivity was detected.
2024-01-08T14:13:25.529008 | | INFO | UI.TRAY:CONNECT | Connect to fastest server
2024-01-08T14:13:25.626397 | proton.vpn.core.connection:156 | INFO | CONN.CONNECT:START | Server: / Protocol: openvpn-udp / Ports: [80, 51820, 4569, 1194, 5060] / Backend: None
2024-01-08T14:13:25.711825 | | CRITICAL | APP:CRASH | Unexpected error.
Traceback (most recent call last):
File “/usr/lib/python3.11/site-packages/proton/vpn/killswitch/interface/”, line 52, in get
return Loader.get(“killswitch”, class_name=class_name)
File “/usr/lib/python3.11/site-packages/proton/loader/”, line 113, in get
raise RuntimeError(f"Loader: couldn’t find an acceptable implementation for {type_name}.")
RuntimeError: Loader: couldn’t find an acceptable implementation for killswitch.

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File “/usr/lib/python3.11/site-packages/proton/vpn/app/gtk/widgets/vpn/”, line 96, in _on_connect_button_clicked
File “/usr/lib/python3.11/site-packages/proton/vpn/app/gtk/”, line 177, in connect_to_fastest_server
File “/usr/lib/python3.11/site-packages/proton/vpn/app/gtk/”, line 193, in _connect_to_vpn
File “/usr/lib/python3.11/site-packages/proton/vpn/core/”, line 162, in connect
File “/usr/lib/python3.11/site-packages/proton/vpn/connection/”, line 120, in connect
connection = VPNConnection.create(
File “/usr/lib/python3.11/site-packages/proton/vpn/connection/”, line 165, in create
return protocol_class(server, credentials, settings)
File “/usr/lib/python3.11/site-packages/proton/vpn/backend/linux/networkmanager/protocol/openvpn/”, line 38, in init
super().init(*args, **kwargs)
File “/usr/lib/python3.11/site-packages/proton/vpn/backend/linux/networkmanager/core/”, line 52, in init
super().init(*args, **kwargs)
File “/usr/lib/python3.11/site-packages/proton/vpn/connection/”, line 83, in init
self._killswitch = killswitch or KillSwitch.get()()
File “/usr/lib/python3.11/site-packages/proton/vpn/killswitch/interface/”, line 54, in get
raise MissingKillSwitchBackendDetails(excp) from excp
proton.vpn.killswitch.interface.exceptions.MissingKillSwitchBackendDetails: Loader: couldn’t find an acceptable implementation for killswitch.

From what I can see, it seems to be using network manager to handle the killswitch part. Can you try adding the network-manager service in the qube settings and see if that changes anything?

Ok thanks. I’ll try that when I get back to my machine.

Wow! Thanks a million times! That worked, my test Qube connected to it doesn’t leak according to ipleak. So is that it? Do I need to do anything else to make it work properly? I heard there was an auto login for the protonvpn app, but I don’t think there is. Is there something I can do to automate it all so it can be as hands off as possible? Auto start the Qubes, auto start the vpn app, auto login the credentials etc. How does that work with 2fa?

That should be enough. Network Manager should redirect all DNS requests to the VPN and handle the killswitch part (if protonvpn did it right, of course).

I’m not a protonvpn user, so I can’t help with most of your questions here, sorry. If you can login and control the VPN from the CLI, you should be able to add a few commands to /rw/config/rc.local so that it does all the necessary things when your VPN qube starts.

No problem. Thanks for your help anyway! Massively useful information. Have a nice day today.

1 Like