Passo a passo para criar um servidor VPN WireGuard em uma VM Debian/Ubuntu no Proxmox, com NAT, firewall e clientes Windows, macOS e celular.
Para que serve
Este guia monta um servidor VPN WireGuard em uma VM pequena dentro do seu Proxmox. Com ela, você e sua equipe acessam o painel do Proxmox, o SSH e as VMs por um túnel criptografado, sem deixar essas portas abertas para a internet. Cada notebook ou celular recebe um IP da rede da VPN e alcança a rede interna das VMs.
Por que em uma VM e não no host Proxmox
A recomendação da E-Consulters é manter a VPN em uma VM dedicada:
- Superfície de ataque menor no hipervisor: o host fica só com o Proxmox; nenhum serviço extra escuta na internet a partir dele.
- Isolamento: um erro de configuração ou uma falha na VPN fica restrita à VM, que você pode restaurar do backup ou recriar em minutos.
- Atualizações independentes: você atualiza ou troca o sistema da VPN sem mexer no host.
Instalar o WireGuard direto no host funciona, mas não é recomendado pelos motivos acima.
Pré-requisitos
- Proxmox VE 8.x ou 9.x com a bridge pública
vmbr0e a bridge internavmbr1(veja o artigo «Como configurar a rede do Proxmox para as VMs: bridge, bloco /28 IPv4 e IPv6»). - Um IP livre do seu bloco /28 para a VM da VPN.
- Acesso ao console IPMI/iLO do servidor (rota de recuperação, veja o fim do artigo).
- Endereços usados nos exemplos (todos fictícios, troque pelos seus):
- Host Proxmox:
203.0.113.2(vmbr0) e10.10.10.1(vmbr1). Gateway do bloco:203.0.113.1. - VM da VPN:
203.0.113.5(placa pública) e10.10.10.2(placa interna). - Rede da VPN:
10.8.0.0/24, servidor10.8.0.1. Use uma faixa que não exista no escritório nem nas VMs.
- Host Proxmox:
Etapa 1: criar a VM da VPN
- Crie uma VM com Debian 12/13 ou Ubuntu 24.04: 1 a 2 vCPU, 1 GB de RAM e 8 a 10 GB de disco bastam.
- Placa 1 (
net0) emvmbr0e placa 2 (net1) emvmbr1, ambas VirtIO e com a opção Firewall marcada. - Faça a VM iniciar primeiro no boot do host (exemplo com o ID 110):
qm set 110 --onboot 1 --startup order=1 - Configure a rede dentro da VM. No Debian, em
/etc/network/interfaces(confira os nomes das placas comip -br link):
A placa interna não leva gateway. No Ubuntu, faça o equivalente no netplan.auto ens18 iface ens18 inet static address 203.0.113.5/28 gateway 203.0.113.1 auto ens19 iface ens19 inet static address 10.10.10.2/24
Etapa 2: instalar o WireGuard e gerar as chaves
- Instale as ferramentas (o módulo já vem no kernel):
apt update apt install wireguard nftables qrencode - Gere as chaves do servidor:
cd /etc/wireguard umask 077 wg genkey | tee servidor.key | wg pubkey > servidor.pub - Ative o encaminhamento de pacotes. No Debian 13 o
/etc/sysctl.confnão existe mais por padrão, então use/etc/sysctl.d/:echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.d/99-wireguard.conf sysctl --system
Etapa 3: configurar o wg0 e as rotas até o Proxmox
Crie /etc/wireguard/wg0.conf:
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = COLE_AQUI_O_CONTEUDO_DE_servidor.key
PostUp = nft add table ip wgnat; nft add chain ip wgnat post '{ type nat hook postrouting priority 100; }'; nft add rule ip wgnat post oifname "ens19" masquerade
PostDown = nft delete table ip wgnat
# Notebook do administrador
[Peer]
PublicKey = CHAVE_PUBLICA_DO_NOTEBOOK
AllowedIPs = 10.8.0.2/32
Por que o NAT: o host e as VMs têm como rota padrão a internet. Se um pacote chegasse com origem 10.8.0.2, a resposta sairia pela internet e se perderia. Com o NAT na placa interna, todo acesso vindo da VPN chega ao Proxmox e às VMs com origem 10.10.10.2, e a resposta volta pela VM da VPN. É a opção recomendada por funcionar sem mexer em nenhuma outra máquina.
Alternativa (rota estática): se você precisa ver nos logs o IP de cada usuário da VPN, remova as linhas PostUp/PostDown e ensine a rota de volta ao host e a cada VM que será acessada. No host, acrescente na seção vmbr1 de /etc/network/interfaces:
up ip route add 10.8.0.0/24 via 10.10.10.2
Nas VMs Linux, use a mesma rota; no Windows, route -p add 10.8.0.0 mask 255.255.255.0 10.10.10.2. Nesse caso, nas regras de firewall use 10.8.0.0/24 como origem em vez de 10.10.10.2.
Suba a interface e ative no boot:
systemctl enable --now wg-quick@wg0
wg show
Etapa 4: firewall da VM da VPN
Na placa pública, a VM só precisa receber a porta 51820/udp. Em Datacenter > Firewall o firewall precisa estar ativo, e em VM 110 > Firewall você define a política. O arquivo /etc/pve/firewall/110.fw fica assim:
[OPTIONS]
enable: 1
policy_in: DROP
[RULES]
IN ACCEPT -i net0 -p udp -dport 51820
IN ACCEPT -i net1 -p tcp -dport 22
A segunda regra permite SSH na VM da VPN só pela rede interna; pela própria VPN o acesso chega por dentro do túnel e não passa por essa regra.
policy_in: DROP, o SSH pelo IP público da VM deixa de funcionar. Teste a VPN antes. Se perder o acesso à VM, use o console noVNC do Proxmox ou, se o painel também estiver inacessível, o IPMI/iLO (veja abaixo).
Etapa 5: criar os clientes da VPN
- Gere as chaves do dispositivo e cole a pública no
[Peer]dowg0.conf:wg genkey | tee notebook.key | wg pubkey > notebook.pub - Monte o arquivo do cliente:
Só as redes em[Interface] PrivateKey = CONTEUDO_DE_notebook.key Address = 10.8.0.2/32 [Peer] PublicKey = CONTEUDO_DE_servidor.pub Endpoint = 203.0.113.5:51820 AllowedIPs = 10.8.0.0/24, 10.10.10.0/24 PersistentKeepalive = 25AllowedIPspassam pelo túnel; a internet do usuário continua saindo pela conexão dele. - Aplique o novo peer sem derrubar os demais:
wg syncconf wg0 <(wg-quick strip wg0) - Importe no dispositivo: app oficial do WireGuard para Windows e macOS ("Import tunnel from file"); no Android/iOS, leia o QR code gerado com
qrencode -t ansiutf8 < notebook.conf. Depois apague a chave do servidor:shred -u notebook.key.
Para revogar um dispositivo, apague o bloco [Peer] dele e rode novamente o wg syncconf.
Como saber se funcionou
- Na VM da VPN,
wg showexibe o peer comlatest handshakerecente. - No cliente:
ping 10.8.0.1eping 10.10.10.1. - O painel abre em
https://10.10.10.1:8006. Para fechar o acesso pelo IP público, siga o artigo «Como liberar o acesso ao Proxmox (porta 8006), SSH e RDP só pela VPN».
Se a VM da VPN cair
O console IPMI/iLO do servidor continua acessível mesmo sem VPN. Por ele, faça login no host e rode qm status 110 e qm start 110. Se precisar do painel com urgência, pve-firewall stop libera temporariamente a porta 8006 pelo IP público; volte com pve-firewall start assim que terminar.
Problemas comuns
- Sem handshake: porta 51820/udp bloqueada (regra da VM ou firewall do datacenter desativado), chave colada errada ou
Endpointincorreto. - Handshake ok, mas sem acesso ao Proxmox: falta
ip_forward, a rede10.10.10.0/24não está noAllowedIPsdo cliente ou o nome da placa no NAT (ens19) está errado. - "resolvconf: command not found": aparece quando o arquivo do cliente Linux tem
DNS =. Remova a linha ou instalesystemd-resolved.
Perguntas frequentes
Quantos recursos a VM do WireGuard precisa?
Para acesso administrativo, 1 vCPU e 1 GB de RAM sobram. Use 2 vCPU se muitos usuários transferirem arquivos grandes ao mesmo tempo.
Posso usar um container LXC em vez de VM?
Funciona, mas o container compartilha o kernel do host e precisa de permissões extras para criar a interface. A VM dá o isolamento que motivou tirar a VPN do host.
Preciso de um IP público só para a VPN?
Sim, é o mais simples: um dos IPs do seu /28 fica na placa pública da VM.
Precisa de ajuda?
Se o túnel não subir, abra um ticket com a saída de wg show (sem chaves privadas), o arquivo 110.fw e o ip -br addr da VM.
