VPNSmith
self-host-vpnINFO

WireGuard em Docker (2026): a forma limpa de auto-hospedar com docker-compose

Execute o WireGuard em Docker da maneira correta: linuxserver/wireguard vs wg-easy, o ficheiro docker-compose, armadilhas do NET_ADMIN e sysctl, persistência e quando um container supera uma instalação bare-metal.

Por Eric Gerard · Fundador · VPNSmith - Especialista em VPN auto-hospedada e VPS RGPD5 min de leituraPhoto via Unsplash

Divulgação de afiliados - Este guia contém links para a Contabo, o VPS que usamos para o nosso próprio WireGuard auto-hospedado. Se fizer uma encomenda através do nosso link, ganhamos uma comissão sem custo adicional para si. Apenas documentamos o que realmente usamos.

Executar o WireGuard em Docker oferece-lhe aquilo que torna os containers valiosos: um servidor que pode ser iniciado, desmontado, versionado e movido para outro host em minutos, sem instalar pacotes na máquina em si. A questão é que um container VPN não é um container normal - ele interage com a pilha de rede do kernel, por isso alguns parâmetros são inegociáveis. Configure-os corretamente e um WireGuard containerizado é tão rápido quanto um bare-metal. Configure-os incorretamente e o túnel conecta-se mas não encaminha nada silenciosamente.

Esta é a forma limpa e orientada para produção de o fazer.

Primeiro, o erro que as pessoas cometem sobre "WireGuard em Docker"

WireGuard é um módulo do kernel. Quando "executa o WireGuard em Docker", a encriptação e o encaminhamento ainda ocorrem no kernel Linux do host - o container apenas transporta as ferramentas de espaço de utilizador (wg, wg-quick) e a sua configuração. É por isso que não há penalização de desempenho: o caminho dos dados nunca entra no container.

Isso também explica os requisitos. Para criar e gerir uma interface de rede a partir de dentro de um container, esse container precisa de capacidade de rede elevada (NET_ADMIN), e o host deve estar autorizado a encaminhar pacotes (net.ipv4.ip_forward=1). Estas não são escolhas opcionais de endurecimento - sem elas, o container ou se recusa a iniciar ou surge inativo.

Escolha a sua imagem: linuxserver/wireguard vs wg-easy

Duas imagens cobrem quase todos os casos de uso:

  • linuxserver/wireguard - um servidor limpo e orientado por configuração. Define os pares através de variáveis de ambiente ou editando ficheiros num diretório montado /config. Gera configurações de cliente e códigos QR na primeira execução. Ideal quando deseja infraestrutura como código, muitos pares, ou para guardar a sua configuração num repositório privado.
  • wg-easy - WireGuard mais um painel web. Crie e revogue pares a partir de um navegador, digitalize códigos QR para telemóveis, veja estatísticas de transferência ao vivo por cliente. Melhor para um punhado de dispositivos e integração rápida sem tocar na linha de comando. Cobrimo-lo de ponta a ponta - incluindo a mudança de palavra-passe da v14 - no guia completo de wg-easy auto-hospedado.

Ambos são maduros e amplamente utilizados. A decisão é entre painel vs ficheiros, não qualidade.

O ficheiro docker-compose (wg-easy)

Racks de servidores iluminados a azul num centro de dados
Racks de servidores iluminados a azul num centro de dados

services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy:latest
    container_name: wg-easy
    environment:
      - WG_HOST=vpn.example.com        # o domínio do seu VPS ou IP público
      - PASSWORD_HASH=<bcrypt-hash>     # login na interface web
      - WG_DEFAULT_DNS=1.1.1.1
    volumes:
      - ./config:/etc/wireguard         # persistência - mantenha isto no host
    ports:
      - "51820:51820/udp"               # dados do WireGuard
      - "51821:51821/tcp"               # interface web (proteja este com firewall para o seu IP)
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped

Três linhas fazem o trabalho pesado e são os pontos de falha habituais:

  • cap_add: NET_ADMIN permite que o container gerencie a interface wg0. Sem isso, o container não consegue ativar o túnel.
  • sysctls: net.ipv4.ip_forward=1 transforma a máquina num router. Sem isso, o túnel conecta-se mas nenhum tráfego o atravessa - a causa mais comum de "diz que está conectado mas nada funciona".
  • volumes: ./config mantém as chaves e pares no host para que uma recriação não apague todos os clientes.

Exponha a porta de dados UDP publicamente; proteja a porta TCP da interface web para o seu próprio IP - nunca deixe a 51821 aberta para a internet.

A lista de verificação do host (faça isto antes de culpar o container)

Um container pode estar perfeito e ainda assim não encaminhar nada por causa da camada subjacente:

  1. Firewall na nuvem: abra 51820/udp no grupo de segurança do seu fornecedor, não apenas no host. Esta é a falha silenciosa número um num VPS. Vê que porta o WireGuard usa e como abri-la se alterares a porta padrão.
  2. Módulo do kernel do host: a maioria das distribuições modernas traz o módulo WireGuard no kernel (Linux 5.6+). Se modprobe wireguard falhar no host, instale os cabeçalhos do kernel - o container não pode carregar um módulo que o host não tem.
  3. DNS para clientes: defina WG_DEFAULT_DNS para que os clientes não vazem consultas para qualquer resolvedor que estavam a usar. Combine isso com o nosso guia de prevenção de vazamento de DNS do WireGuard.

Quando um container é a escolha certa - e quando não é

Use Docker quando executa outros serviços na mesma máquina e quer o WireGuard isolado e reproduzível, quando deseja o painel do wg-easy, ou quando faz redeploy frequentemente entre hosts. Toda a configuração torna-se num ficheiro compose que pode versionar e mover.

Evite Docker quando o VPS não faz nada além do WireGuard. Uma instalação bare-metal apt install wireguard mais um ficheiro de configuração é mais simples, tem uma peça a menos e é trivialmente scriptável - veja os nossos modelos de configuração WireGuard e o walkthrough completo Contabo + WireGuard auto-hospedado. Para uma caixa VPN de propósito único, o container adiciona uma embalagem que não precisa.

O VPS por baixo

Containerizado ou não, o WireGuard precisa de um host com um IP público e uma ligação decente. Um pequeno VPS é suficiente - o WireGuard é leve o suficiente para que uma instância de 4-6 €/mês sature a sua porta de rede muito antes de o CPU notar. Nós usamos o nosso na Contabo pela relação preço-largura de banda:

Obtenha um VPS Contabo para o seu container WireGuard →

Para a análise completa de preço/desempenho entre fornecedores, veja o VPS mais barato para um VPN WireGuard.

A limitação honesta

Docker torna o WireGuard portátil, não mais seguro. O container partilha o kernel do host, executa-se com NET_ADMIN e é apenas tão seguro quanto o host. Não isola o WireGuard da máquina - qualquer pessoa com acesso root no host controla o túnel. Trate o container como uma conveniência de implementação, endureça o host como se o WireGuard estivesse instalado diretamente nele, e mantenha a porta da interface web fora da internet pública. Faça isso, e o WireGuard containerizado é a configuração de auto-hospedagem mais limpa que existe.

★ Datacenter GDPR em Nuremberg · ✓ IPv4 dedicado incluído · 200+ Mbps garantidos

Aloje a sua VPN no seu próprio VPS → ContaboAcesso root completo · IPv4 público · escolha a sua região

Perguntas frequentes

O WireGuard é mais lento em Docker do que em bare metal?
Não há diferença significativa. O WireGuard executa-se no kernel Linux do host, não dentro do container - o container apenas contém as ferramentas de espaço de utilizador (wg, wg-quick) e a configuração. O caminho dos dados é o mesmo módulo do kernel em ambos os casos, por isso a taxa de transferência e a latência são iguais a uma instalação bare-metal. O container é embalagem, não uma camada de desempenho.
Qual imagem devo usar - linuxserver/wireguard ou wg-easy?
linuxserver/wireguard é o servidor minimalista, orientado por ficheiros de configuração: gere os pares editando ficheiros ou variáveis de ambiente. wg-easy adiciona uma interface web para criar pares, mostrar códigos QR e ver estatísticas de transferência ao vivo - muito mais amigável para alguns dispositivos. Escolha linuxserver/wireguard para infra-estrutura como código e muitos pares; escolha wg-easy quando quiser um painel e integração rápida de clientes.
Por que o meu container WireGuard falha ao iniciar ou encaminhar tráfego?
Três causas usuais. Primeiro, o container precisa da capacidade NET_ADMIN (e em algumas configurações SYS_MODULE) para gerir a interface - adicione `cap_add: [NET_ADMIN]`. Segundo, o encaminhamento de IP deve estar ativado: defina `sysctl: net.ipv4.ip_forward=1` no compose ou no host. Terceiro, a porta UDP publicada (padrão 51820/udp) deve estar aberta tanto no firewall da nuvem quanto no host. Se faltar qualquer um, o túnel conecta-se mas não encaminha nada.
Ainda preciso de um VPS para executar o WireGuard em Docker?
Apenas se quiser um ponto de saída público com um IP estático - para acesso remoto a uma rede doméstica, pode executar o container num servidor doméstico por trás de um redirecionamento de portas. Para um VPN ao qual se conecta de qualquer lugar (e para obter um IP estático limpo), um pequeno VPS é a escolha padrão. Uma instância de 4-6 €/mês satura facilmente a sua ligação com o WireGuard.
Como posso manter pares e chaves persistentes entre reinícios de container?
Monte o diretório de configuração no host (por exemplo, `./config:/config`). As chaves e definições de pares vivem lá, por isso `docker compose down && up` mantém todos os clientes a funcionar. Nunca armazene chaves apenas dentro da camada gravável do container - uma recriação apaga-as e todos os clientes têm de se reinscrever.