ProtonVPN no Qubes OS
Depois de finalizada a instalação do Qubes OS em uma máquina, ele não parecia fornecer um qube de rede com interfaces acessíveis para utilizar uma VPN de minha escolha, mas isso não pareceu implicar que a configuração de uma por meio de protocolos como o WireGuard fosse complicada. Irei demonstrar neste artigo utilizando uma solução relativamente popular e acessível, o ProtonVPN.
Preparando o template
Dentro do template que será utilizado no qube responsável pelo ProtonVPN, é interessante instalarmos algumas dependências relacionadas ao WireGuard e NetworkManager. Usando o fedora-42-xfce como exemplo:
$ sudo dnf install -y wireguard-tools nm-connection-editor
Terminado, podemos desligar o template.
Criando o qube
Pelo Qube Manager conseguimos criar o qube facilmente através da opção “New qube”. Uma vez aberto, basta dar um nome (ex: sys-protonvpn), cor, selecionar o template e a rede de origem desejada. Aqui é crucial manter selecionado a opção “Provides network access to other qubes” em “Advanced Options”.
Depois de criado, também é importante que o serviço network-manager esteja adicionado, selecionando o qube e indo em Settings > Services.

Gerando configuração WireGuard
O ProtonVPN fornece em seu site a possibilidade de gerar uma configuração WireGuard pronta para uso. Hoje essa funcionalidade se encontra em account.protonvpn.com/downloads.
Inserimos um nome qualquer para o certificado, selecionamos GNU/Linux na plataforma e, opcionalmente, habilitamos alguns recursos para a VPN, como o bloqueio NetShield e VPN Accelerator. Por fim, basta escolher o servidor desejado e a configuração será gerada, a qual iremos querer exportar para um arquivo do tipo conf.

Preparando o qube
Dentro do terminal do qube criado anteriormente, precisaremos rodar alguns comandos:
Importamos a configuração WireGuard:
$ nmcli connection import type wireguard file <nome>.conf
Exemplo:
$ nmcli connection import type wireguard file proton-br-01.conf
Subimos a VPN:
$ nmcli connection up proton-br-01
Para garantir que a VPN suba automaticamente:
$ nmcli connection modify proton-br-01 connection.autoconnect yes
Também convém garantir que a interface WireGuard tenha prioridade de rota:
$ nmcli connection modify proton-br-01 ipv4.never-default no ipv6.never-default no
Por fim:
$ sudo poweroff
Inicie o qube novamente e verifique:
$ curl icanhazip.com
O IP retornado deve ser do ProtonVPN.
Evitando vazamentos
Com esse setup, se a VPN cair, ainda pode haver risco de tráfego sair pelo eth0 do qube. Para reduzir isso, é interessante criar um script shell que defina regras que só permitam tráfego encaminhado pela interface WireGuard.
Exemplo:
sudo vim /rw/config/vpn-killswitch.sh
No conteúdo adicionamos:
#!/bin/bash
# Troque caso o nome da interface WireGuard seja outro.
WG_IF="proton-br-01"
sudo nft delete table inet protonvpn 2>/dev/null
sudo nft add table inet protonvpn
sudo nft 'add chain inet protonvpn forward { type filter hook forward priority 0; policy drop; }'
sudo nft 'add chain inet protonvpn output { type filter hook output priority 0; policy accept; }'
sudo nft add rule inet protonvpn forward ct state established,related accept
sudo nft add rule inet protonvpn forward oifname "$WG_IF" accept
sudo nft add rule inet protonvpn forward oifname "eth0" drop
Tornamos executável:
$ sudo chmod +x /rw/config/vpn-killswitch.sh
Para rodar no boot do qube:
$ sudo vim /rw/config/rc.local
E adicionamos:
/rw/config/vpn-killswitch.sh
Permissão:
$ sudo chmod +x /rw/config/rc.local
E agora desligue e ligue o qube.
Para verificar se deu certo podemos derrubar a VPN:
$ nmcli connection down proton-br-01
Em uma AppVM que use esse qube como rede de origem, o tráfego deve falhar em vez de sair sem VPN.
Finalizando
Com o qube rodando e a VPN funcionando, agora é só utilizá-lo como rede de origem nos qubes que desejar. Bom hacking!