Instalar WireGuard em CentOS 8

Introdução
WireGuard é uma implementação VPN de código aberto e multiplataforma que usa criptografia moderna. É mais rápida, simples e direta que IPSec e OpenVPN. Foi desenhada para ser usada tanto em sistemas embarcados quanto em supercomputadores e roda em Linux, Windows, macOS, iOS, Android, BSD e outras plataformas.
Este tutorial cobre como instalar o WireGuard em um servidor baseado em CentOS 8 e como conectar um cliente Linux (CentOS/Fedora/Ubuntu).
Antes de começar
Importante: execute os comandos como um usuário com privilégios sudo. Ajuste IPs, portas e regras de firewall ao seu ambiente. Os exemplos usam:
- Rede VPN privada: 192.168.10.0/24
- IP do servidor na VPN: 192.168.10.1
- IP do cliente na VPN: 192.168.10.2
- Porta UDP do WireGuard: 37822
- IP público do servidor (exemplo): 203.1.114.98/24
Passo 1 - Atualizar o sistema
Antes de prosseguir, atualize o sistema para instalar as últimas atualizações.
$ sudo dnf update
Passo 2 - Instalar e habilitar o repositório EPEL
Os pacotes necessários do WireGuard estão no repositório EPEL, então vamos instalá-lo e habilitá-lo.
$ sudo dnf install epel-release
$ sudo dnf config-manager --set-enabled PowerTools
Observação: habilitamos também o repositório PowerTools pois alguns pacotes do EPEL dependem dele.
Passo 3 - Instalar WireGuard
Habilite o repositório COPR do WireGuard.
$ sudo dnf copr enable jdoss/wireguard
Instale os pacotes do WireGuard.
$ sudo dnf install wireguard-dkms wireguard-tools
Este passo instala o compilador GNU GCC, necessário para construir os módulos do kernel Linux.
Passo 4 - Configurar o servidor WireGuard
Crie o diretório e um ficheiro de configuração com permissões restritas.
$ sudo mkdir /etc/wireguard
$ sudo sh -c 'umask 077; touch /etc/wireguard/wg0.conf'
Crie um par de chaves (privada/pública) para o servidor.
$ cd /etc/wireguard
$ sudo sh -c 'umask 077; wg genkey | tee privatekey | wg pubkey > publickey'
Isto criará os ficheiros privatekey e publickey com as chaves correspondentes.
Visualize a chave privada gerada (copie e guarde em local seguro).
$ sudo cat privatekey
Edite o ficheiro de configuração do WireGuard.
$ sudo nano /etc/wireguard/wg0.conf
Adicione o seguinte conteúdo (substitua a chave privada pelo valor gerado no seu servidor).
[Interface]
## VPN server private IP address ##
Address = 192.168.10.1/24
## VPN server port - You can choose any port ##
ListenPort = 37822
## VPN server's private key i.e. /etc/wireguard/privatekey - the one from above ##
PrivateKey = GCEXafeZKqSsuLfvuHE+zLzMYwoH4qQyBh7MZ4f/3kM=
## Save and update this config file when a new peer (vpn client) added ##
SaveConfig = true
Explicação rápida
- [Interface]: define o lado local (o servidor) da ligação.
- PrivateKey: chave privada do servidor; não a partilhe.
- ListenPort: porta UDP que o servidor escuta.
- Address: IP(s) atribuídos à interface wg0.
- SaveConfig: permite que o serviço grave a configuração ativa no ficheiro durante a paragem.
Pressione Ctrl + X, confirme com Y e Enter para gravar.
Passo 5 - Configurar o firewall
Abra a porta UDP escolhida e defina o serviço WireGuard no firewalld.
Crie o ficheiro do serviço do firewall.
$ sudo nano /etc/firewalld/services/wireguard.xml
Cole o seguinte conteúdo (mantenha a porta conforme a sua escolha).
wireguard
WireGuard open UDP port 37822 for client connections
Salve o ficheiro.
Habilite o serviço no firewalld.
$ sudo firewall-cmd --permanent --add-service=wireguard
Ative masquerading para que todo o tráfego da rede 192.168.10.0/24 seja roteado pelo IP público do servidor (exemplo 203.1.114.98).
$ sudo firewall-cmd --permanent --add-masquerade
Recarregue o firewall para aplicar as regras.
$ sudo firewall-cmd --reload
Verifique as regras atuais.
$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: wireguard ssh
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Passo 6 - Ativar encaminhamento IPv4 e ajustes de rede
Crie um ficheiro personalizado sysctl para ativar o encaminhamento e algumas otimizações básicas.
$ sudo nano /etc/sysctl.d/99-custom.conf
Cole o conteúdo abaixo.
## Turn on bbr ##
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
## for IPv4 ##
net.ipv4.ip_forward = 1
## Turn on basic protection/security ##
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
## for IPv6 ##
net.ipv6.conf.all.forwarding = 1
Salve o ficheiro e aplique as alterações.
$ sudo sysctl -p /etc/sysctl.d/99-custom.conf
Adicione a interface wg0 à zona interna do firewall e ligue o masquerade permanente nessa zona.
$ sudo firewall-cmd --add-interface=wg0 --zone=internal
$ sudo firewall-cmd --permanent --zone=internal --add-masquerade
Passo 7 - Ativar e iniciar o serviço WireGuard
Ative o serviço para iniciar no boot e inicie-o agora.
$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0
Verifique o estado e a interface.
$ sudo wg
interface: wg0
public key: VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
private key: (hidden)
listening port: 37822
$ sudo ip a show wg0
3: wg0: mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 192.168.10.1/24 scope global wg0
valid_lft forever preferred_lft forever
Passo 8 - Instalar e configurar o cliente WireGuard (Linux)
Siga as instruções oficiais de instalação para o seu sistema (distribuição) e então crie a configuração do cliente.
$ sudo mkdir /etc/wireguard
$ sudo sh -c 'umask 077; touch /etc/wireguard/wg0.conf'
$ cd /etc/wireguard/
$ sudo sh -c 'umask 077; wg genkey | tee privatekey | wg pubkey > publickey'
$ sudo cat privatekey
Copie a chave privada do cliente e edite o ficheiro wg0.conf.
$ sudo nano /etc/wireguard/wg0.conf
Exemplo de configuração do cliente. Substitua chaves e endpoint.
[Interface]
## client private key ##
PrivateKey = OEM6D/zt2fVWOepVv3iEDD430V0gAshKp4+5oVVt5EE=
## client ip address ##
Address = 192.168.10.2/24
[Peer]
## CentOS 8 server public key ##
PublicKey = VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
## set ACL ##
AllowedIPs = 192.168.10.0/24
## Your CentOS 8 server's public IPv4/IPv6 address and port ##
Endpoint = 203.1.114.98:37822
## Key connection alive ##
PersistentKeepalive = 15
Notas rápidas
- AllowedIPs define o tráfego roteado através do túnel (pode ser 0.0.0.0/0 para todo o tráfego).
- PersistentKeepalive é útil para manter NATs abertas; 15s é um valor comum.
Ative e inicie o cliente.
$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0
$ sudo systemctl status wg-quick@wg0
Passo 9 - Adicionar o cliente ao servidor
No servidor, pare temporariamente o serviço, edite /etc/wireguard/wg0.conf e adicione um bloco [Peer] com a chave pública do cliente.
$ sudo systemctl stop wg-quick@wg0
$ sudo nano /etc/wireguard/wg0.conf
Anexe o bloco do peer do cliente.
[Peer]
## client VPN public key ##
PublicKey = dmfO9pirB315slXOgxXtmrBwAqPy07C57EvPks1IKzA=
## client VPN IP address (note /32 subnet) ##
AllowedIPs = 192.168.10.2/32
Salve e volte a iniciar o serviço.
$ sudo systemctl start wg-quick@wg0
Explicação de segurança simples: cada conexão é autenticada por chave pública. Pacotes de pares não reconhecidos são ignorados silenciosamente, tornando o serviço “invisível” a conexões não autorizadas.
Passo 10 - Testar a ligação
No cliente, teste com ping e verifique o estado com wg.
$ ping -c 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=44.2 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=45.8 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=46.7 ms
64 bytes from 192.168.10.1: icmp_seq=4 ttl=64 time=44.1 ms
--- 192.168.10.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2800ms
rtt min/avg/max/mdev = 41.729/47.829/48.953/5.046 ms
$ sudo wg
interface: wg0
public key: dmfO9pirB315slXOgxXtmrBwAqPy07C57EvPks1IKzA=
private key: (hidden)
listening port:
peer: VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
endpoint: 203.1.114.98:37822
allowed ips: 192.168.10.0/24
latest handshake: 1 minute, 40 seconds ago
transfer: 938 B received, 45.67 KiB sent
persistent: keepalive: every 15 seconds
Verificação e solução de problemas
Checklist rápido quando algo falha
- O serviço wg-quick@wg0 está ativo em ambos os lados? (systemctl status)
- As chaves pública/privada correspondem entre cliente e servidor?
- A porta UDP está aberta no firewall do servidor e no roteador upstream?
- O servidor tem encaminhamento IP habilitado (sysctl net.ipv4.ip_forward)?
- Regras de masquerade/masquerading aplicadas corretamente?
- O cliente consegue resolver o endpoint (DNS) e alcançar o IP público?
Comandos úteis
- Verificar estado WireGuard: sudo wg
- Ver logs do journal: sudo journalctl -u wg-quick@wg0
- Testar conectividade: ping, traceroute
Casos comuns e soluções
- Handshake não aparece: verifique a porta UDP e o firewall upstream.
- Conexão estabelecida, mas sem tráfego: reveja AllowedIPs e regras de NAT/masquerade.
- Conexão intermitente: experimente aumentar PersistentKeepalive ou inspecionar NAT/estado TCP do roteador.
Hardening e boas práticas de segurança
- Mantenha as chaves privadas acessíveis apenas a root (perm 600).
- Use portas UDP não óbvias para reduzir scanners automatizados.
- Habilite apenas as IPs necessárias em AllowedIPs para restringir alcance.
- Aplique atualizações de segurança regularmente (dnf update).
- Use autenticação em duas camadas para serviços expostos no servidor (por exemplo, SSH com chave + 2FA).
- Audite logs e handshakes periodicamente.
Matriz de riscos e mitigação
- Risco: Chave privada comprometida. Mitigação: revogar peer (remover [Peer]) e gerar novo par de chaves.
- Risco: Porta UDP bloqueada por ISP/roteador. Mitigação: alterar porta ou usar encapsulamento (ex. WireGuard sobre UDP via túnel TLS) — esse é um caso avançado.
- Risco: Vazamento de DNS quando todo o tráfego não passa pelo túnel. Mitigação: configurar DNS via túnel e verificar leaks via sites de teste DNS.
Checklist por função
Administrador de sistema
- Gerar chaves e configurar wg0.conf no servidor.
- Abrir portas no firewall e aplicar masquerade.
- Habilitar encaminhamento e iniciar o serviço.
Engenheiro de rede
- Garantir rotas e NAT no perímetro.
- Monitorizar handshakes e uso de largura de banda.
Usuário final
- Fazer backup da chave privada do cliente.
- Verificar que AllowedIPs corresponde ao necessário.
Privacidade e conformidade
WireGuard cifra o tráfego entre pares, mas não resolve por si só questões de retenção de logs, metadados ou políticas internas. Para adequar a requisitos de privacidade ou GDPR:
- Minimize logs de conexão onde possível e documente a retenção de dados.
- Se for processar dados pessoais de cidadãos da UE, mantenha um registro das bases legais e, se necessário, adote cláusulas contratuais ou avaliações de impacto.
- Informe utilizadores sobre que metadados são coletados (por exemplo, tempos de conexão, IPs de origem).
Boas práticas operacionais (mini playbook rápido)
- Gerar chaves e configurar o servidor em ambiente de testes.
- Testar um cliente e validar handshakes.
- Aplicar regras de firewall e NAT.
- Monitorizar por 24–48 horas antes de mover para produção.
- Fazer backups das chaves públicas (não das privadas) e da configuração aprovada.
FAQ
Posso usar o WireGuard para todo o tráfego do cliente?
Sim. Defina AllowedIPs = 0.0.0.0/0 no cliente para rotear todo o tráfego pelo túnel. Garanta que o servidor tem masquerade/NAT configurado.
O WireGuard funciona com IPv6?
Sim. WireGuard suporta IPv6; adicione endereços IPv6 nas diretivas Address e AllowedIPs e habilite net.ipv6.conf.all.forwarding.
Como revogo o acesso de um cliente?
Remova o bloco [Peer] correspondente do ficheiro /etc/wireguard/wg0.conf no servidor e reinicie (ou recarregue) o serviço.
Resumo e próximos passos
Importante: este guia cobre as etapas fundamentais para pôr um servidor WireGuard a funcionar em CentOS 8 e conectar um cliente Linux. Para produção, adapte políticas de segurança, monitorização e backups. Considere integrar autenticação adicional e rotinas de rotação de chaves.
Se precisar, poste perguntas específicas com saídas de comandos (sem chaves privadas) para que a comunidade possa ajudar.