Introdução
O WireGuard é uma VPN (Rede Virtual Privada) leve que suporta conexões IPv4 e IPv6. Uma VPN permite que você atravesse redes não confiáveis como se estivesse em uma rede privada. Isso lhe dá a liberdade de acessar a internet com segurança do seu smartphone ou laptop quando conectado a uma rede não confiável, como o WiFi de um hotel ou cafeteria.
A criptografia do WireGuard depende de chaves pública e privada para que os pares estabeleçam um túnel criptografado entre si. Cada versão do WireGuard usa um conjunto criptográfico específico para garantir simplicidade, segurança e compatibilidade com os pares.
Em comparação, outros softwares VPN como OpenVPN e IPSec utilizam o Transport Layer Security (TLS) e certificados para autenticar e estabelecer túneis criptografados entre sistemas. Diferentes versões do TLS incluem suporte para centenas de diferentes conjuntos e algoritmos criptográficos, e embora isso permita grande flexibilidade para suportar diferentes clientes, também torna a configuração de uma VPN que utiliza TLS mais demorada, complexa e sujeita a erros.
Neste tutorial, você irá configurar o WireGuard em um servidor Ubuntu 22.04 e, em seguida, configurar outra máquina para se conectar a ele como um par usando conexões IPv4 e IPv6 (comumente referidas como uma conexão dual stack). Você também aprenderá como rotear o tráfego de Internet do par através do servidor WireGuard em uma configuração de gateway, além de usar a VPN para um túnel criptografado ponto a ponto.
Para os propósitos deste tutorial, vamos configurar outro sistema Ubuntu 22.04 como o par (também referido como cliente) para o Servidor WireGuard. Tutoriais subsequentes nesta série explicarão como instalar e executar o WireGuard em sistemas e dispositivos Windows, macOS, Android e iOS.
Nota: Se você planeja configurar o WireGuard em um Droplet da DigitalOcean, esteja ciente de que nós, como muitos provedores de hospedagem, cobramos por excedentes de largura de banda. Por esse motivo, esteja atento ao volume de tráfego que seu servidor está lidando. Veja esta página para mais informações.
Pré-requisitos
Para seguir este tutorial, você precisará de:
- Um servidor Ubuntu 22.04 com um usuário não-root sudo e um firewall ativado. Para configurar isso, você pode seguir nosso tutorial Configuração Inicial do Servidor com Ubuntu 22.04. Nos referiremos a isso como o Servidor WireGuard ao longo deste guia.
- Você precisará de uma máquina cliente que você usará para se conectar ao seu Servidor WireGuard. Neste tutorial, nos referiremos a esta máquina como o Peer WireGuard. Para os propósitos deste tutorial, é recomendável que você use sua máquina local como o Peer WireGuard, mas você pode usar servidores remotos ou telefones celulares como clientes, se preferir. Se você estiver usando um sistema remoto, certifique-se de seguir todas as seções opcionais mais tarde neste tutorial ou você pode ser bloqueado do sistema.
- Para usar o WireGuard com IPv6, você também precisará garantir que seu servidor esteja configurado para suportar esse tipo de tráfego. Se você deseja habilitar o suporte IPv6 com o WireGuard e estiver usando um Droplet da DigitalOcean, consulte esta página de documentação Como Habilitar o IPv6 em Droplets. Você pode adicionar suporte IPv6 ao criar um Droplet, ou depois usando as instruções dessa página.
Passo 1 — Instalando o WireGuard e Gerando um Par de Chaves
O primeiro passo deste tutorial é instalar o WireGuard no seu servidor. Para começar, atualize o índice de pacotes do seu Servidor WireGuard e instale o WireGuard usando os seguintes comandos. Você pode ser solicitado a fornecer a senha do seu usuário sudo se esta for a primeira vez que você estiver usando sudo
nesta sessão:
Agora que você tem o WireGuard instalado, o próximo passo é gerar um par de chaves privada e pública para o servidor. Você usará os comandos wg genkey
e wg pubkey
integrados para criar as chaves e, em seguida, adicionar a chave privada ao arquivo de configuração do WireGuard.
Você também precisará alterar as permissões na chave que acabou de criar usando o comando chmod
, pois por padrão o arquivo é legível por qualquer usuário no seu servidor.
Crie a chave privada para o WireGuard e altere suas permissões usando os seguintes comandos:
O comando sudo chmod go=...
remove quaisquer permissões no arquivo para usuários e grupos que não sejam o usuário root para garantir que apenas ele possa acessar a chave privada.
Você deverá receber uma única linha de saída codificada em base64
, que é a chave privada. Uma cópia da saída também é armazenada no arquivo /etc/wireguard/private.key
para referência futura pela parte do comando tee
. Faça uma nota cuidadosa da chave privada que é gerada, pois você precisará adicioná-la ao arquivo de configuração do WireGuard posteriormente nesta seção.
O próximo passo é criar a chave pública correspondente, que é derivada da chave privada. Use o seguinte comando para criar o arquivo de chave pública:
Este comando consiste em três comandos individuais que são encadeados usando o operador |
(pipe).
sudo cat /etc/wireguard/private.key
: este comando lê o arquivo da chave privada e o exibe no fluxo de saída padrão.wg pubkey
: o segundo comando recebe a saída do primeiro comando como sua entrada padrão e a processa para gerar uma chave pública.sudo tee /etc/wireguard/public.key
: o comando final recebe a saída do comando de geração da chave pública e a redireciona para o arquivo nomeado/etc/wireguard/public.key
.
Ao executar o comando, você receberá novamente uma única linha de saída codificada em base64
, que é a chave pública para o seu Servidor WireGuard. Copie-a para algum lugar como referência, pois você precisará distribuir a chave pública para qualquer peer que se conecte ao servidor.
Etapa 2 — Escolhendo Endereços IPv4 e IPv6
Na seção anterior, você instalou o WireGuard e gerou um par de chaves que será usado para criptografar o tráfego de e para o servidor. Nesta seção, você criará um arquivo de configuração para o servidor e configurará o WireGuard para iniciar automaticamente quando o servidor for reiniciado. Você também definirá endereços IPv4 e IPv6 privados para usar com seu Servidor WireGuard e pares.
Se você planeja usar tanto endereços IPv4 quanto IPv6, siga ambas as seções abaixo. Caso contrário, siga as instruções na seção apropriada para as necessidades de rede do seu VPN.
Passo 2(a) — Escolhendo um Intervalo IPv4
Se estiver usando seu servidor WireGuard com pares IPv4, o servidor precisa de um intervalo de endereços IPv4 privados para usar com os clientes e com sua interface de túnel. Você pode escolher qualquer intervalo de endereços IP dos seguintes blocos reservados de endereços (se desejar aprender mais sobre como esses blocos são alocados, visite a especificação RFC 1918):
10.0.0.0
a10.255.255.255
(prefixo 10/8)172.16.0.0
a172.31.255.255
(prefixo 172.16/12)192.168.0.0
a192.168.255.255
(prefixo 192.168/16)
Para os propósitos deste tutorial, usaremos 10.8.0.0/24
como um bloco de endereços IP do primeiro intervalo de IPs reservados. Esse intervalo permitirá até 255 conexões de pares diferentes e geralmente não deve ter endereços sobrepostos ou conflitantes com outros intervalos de IP privados. Sinta-se à vontade para escolher um intervalo de endereços que funcione com a configuração da sua rede se este exemplo não for compatível com suas redes.
O servidor WireGuard usará um único endereço IP do intervalo para seu endereço de túnel IPv4 privado. Aqui vamos usar 10.8.0.1/24
, mas qualquer endereço no intervalo de 10.8.0.1
a 10.8.0.255
pode ser usado. Faça uma nota do endereço IP que você escolher se usar algo diferente de 10.8.0.1/24
. Você adicionará este endereço IPv4 ao arquivo de configuração que você define em Passo 3 — Criando uma Configuração de Servidor WireGuard.
Passo 2(b) — Escolhendo um Intervalo IPv6
Se você estiver usando o WireGuard com IPv6, então você precisará gerar um prefixo de endereço IPv6 unicast local único com base no algoritmo em RFC 4193. Os endereços que você usa com o WireGuard estarão associados a uma interface de túnel virtual. Você precisará completar algumas etapas para gerar um prefixo IPv6 aleatório e único dentro do bloco reservado fd00::/8
de endereços IPv6 privados.
De acordo com o RFC, a maneira recomendada de obter um prefixo IPv6 único é combinar o horário do dia com um valor de identificação único de um sistema como um número de série ou ID do dispositivo. Esses valores são então hashados e truncados, resultando em um conjunto de bits que podem ser usados como um endereço único dentro do bloco privado reservado fd00::/8
de IPs.
Para começar a gerar um intervalo IPv6 para o seu servidor WireGuard, colete um timestamp de 64 bits usando o utilitário date
com o seguinte comando:
Você receberá um número como o seguinte, que é o número de segundos (o %s
no comando date
), e nanossegundos (o %N
) desde 1970-01-01 00:00:00 UTC combinados juntos:
Output1650301699497770167
Registre o valor em algum lugar para uso posterior nesta seção. Em seguida, copie o valor machine-id
para o seu servidor do arquivo /var/lib/dbus/machine-id
. Este identificador é único para o seu sistema e não deve mudar enquanto o servidor existir.
Você receberá uma saída como a seguinte:
/var/lib/dbus/machine-id610cef4946ed46da8f71dba9d66c67fb
Agora você precisa combinar o timestamp com o machine-id
e hashar o valor resultante usando o algoritmo SHA-1. O comando utilizará o seguinte formato:
printf <timestamp><machine-id> | sha1sum
Execute o comando substituindo pelos seus valores de timestamp e identidade da máquina:
Você receberá um valor de hash como o seguinte:
Output442adea1488d96388dae9ab816045b24609a6c18 -
Observe que a saída do comando sha1sum
está em hexadecimal, então a saída usa dois caracteres para representar um único byte de dados. Por exemplo, 4f
e 26
na saída do exemplo são os dois primeiros bytes dos dados hashados.
O algoritmo no RFC requer apenas os 40 bits menos significativos (traseiros), ou 5 bytes, da saída hashada. Use o comando cut
para imprimir os últimos 5 bytes codificados em hexadecimal do hash:
O argumento -c
indica ao comando cut
para selecionar apenas um conjunto especificado de caracteres. O argumento 31-
diz ao cut
para imprimir todos os caracteres da posição 31 até o final da linha de entrada.
Você deverá receber uma saída como a seguinte:
Output24609a6c18
Neste exemplo de saída, o conjunto de bytes é: 24 60 9a 6c 18
.
Agora você pode construir seu prefixo de rede IPv6 único anexando os 5 bytes que você gerou com o prefixo fd
, separando cada 2 bytes com um :
dois pontos para legibilidade. Como cada sub-rede em seu prefixo único pode conter um total de 18.446.744.073.709.551.616 possíveis endereços IPv6, você pode restringir a sub-rede a um tamanho padrão de /64
para simplicidade.
Usando os bytes gerados anteriormente com o tamanho de sub-rede /64
, o prefixo resultante será o seguinte:
Unique Local IPv6 Address Prefixfd24:609a:6c18::/64
Esta faixa fd24:609a:6c18::/64
é o que você usará para atribuir endereços IP individuais às interfaces de túnel WireGuard no servidor e nos pares. Para alocar um IP para o servidor, adicione um 1
após os caracteres finais ::
. O endereço resultante será fd24:609a:6c18::1/64
. Os pares podem usar qualquer IP na faixa, mas normalmente você incrementará o valor em um a cada vez que adicionar um par, por exemplo, fd24:609a:6c18::2/64
. Anote o IP e prossiga configurando o Servidor WireGuard na próxima seção deste tutorial.
Passo 3 — Criando uma Configuração de Servidor WireGuard
Antes de criar a configuração do seu servidor WireGuard, você precisará das seguintes informações:
-
Certifique-se de ter a chave privada disponível a partir do Passo 1 — Instalando o WireGuard e Gerando um Par de Chaves.
-
Se estiver usando o WireGuard com IPv4, você precisará do endereço IP que escolheu para o servidor no Passo 2(a) — Escolhendo um Intervalo IPv4, que neste exemplo é
10.8.0.1/24
. -
Se estiver usando o WireGuard com IPv6, você precisará do endereço IP para o servidor que gerou no Passo 2(b) — Escolhendo um Intervalo IPv6. Neste exemplo, o IP é
fd24:609a:6c18::1/64
.
Depois de obter a chave privada e o(s) endereço(s) IP necessários, crie um novo ficheiro de configuração usando o nano
ou o editor que preferir, executando o seguinte comando:
Adicione as seguintes linhas ao ficheiro, substituindo a sua chave privada no lugar do valor destacado base64_encoded_private_key_goes_here
, e o(s) endereço(s) IP na linha Address
. Também pode alterar a linha ListenPort
se desejar que o WireGuard esteja disponível numa porta diferente:
/etc/wireguard/wg0.conf[Interface]
PrivateKey = base64_encoded_private_key_goes_here
Address = 10.8.0.1/24, fd24:609a:6c18::1/64
ListenPort = 51820
SaveConfig = true
A linha SaveConfig
garante que, quando uma interface WireGuard for desativada, quaisquer alterações serão guardadas no ficheiro de configuração.
Guarde e feche o ficheiro /etc/wireguard/wg0.conf
. Se estiver a utilizar o nano
, pode fazê-lo com CTRL+X
, depois Y
e ENTER
para confirmar. Agora tem uma configuração inicial do servidor que pode desenvolver dependendo de como planeia utilizar o seu servidor VPN WireGuard.
Fase 4 — Ajustar a Configuração de Rede do Servidor WireGuard
Se você estiver usando o WireGuard para conectar um par ao Servidor WireGuard para acessar serviços apenas no servidor, então você não precisa completar esta seção. Se você deseja rotear o tráfego de Internet do seu Par WireGuard através do Servidor WireGuard, então será necessário configurar o encaminhamento IP seguindo esta seção do tutorial.
Para configurar o encaminhamento, abra o arquivo /etc/sysctl.conf
usando o nano
ou o editor de sua preferência:
Se você estiver usando IPv4 com o WireGuard, adicione a seguinte linha no final do arquivo:
net.ipv4.ip_forward=1
Se você estiver usando IPv6 com o WireGuard, adicione esta linha no final do arquivo:
net.ipv6.conf.all.forwarding=1
Se você estiver usando tanto o IPv4 quanto o IPv6, certifique-se de incluir ambas as linhas. Salve e feche o arquivo quando terminar.
Para ler o arquivo e carregar os novos valores para a sessão atual do terminal, execute:
Outputnet.ipv6.conf.all.forwarding = 1
net.ipv4.ip_forward = 1
Agora, o seu Servidor WireGuard será capaz de encaminhar o tráfego de entrada do dispositivo de ethernet VPN virtual para outros no servidor, e a partir daí para a Internet pública. Usar essa configuração permitirá que você encaminhe todo o tráfego da web do seu Par WireGuard através do endereço IP do seu servidor, e o endereço IP público do seu cliente será efetivamente ocultado.
No entanto, antes que o tráfego possa ser roteado corretamente através do seu servidor, você precisará configurar algumas regras de firewall. Essas regras garantirão que o tráfego de e para o seu Servidor WireGuard e Pares flua corretamente.
Passo 5 — Configurando o Firewall do Servidor WireGuard
Nesta seção, você irá editar a configuração do Servidor WireGuard para adicionar regras de firewall que garantirão que o tráfego de e para o servidor e clientes seja roteado corretamente. Assim como na seção anterior, pule este passo se estiver usando sua VPN WireGuard apenas para uma conexão de máquina para máquina para acessar recursos que estão restritos à sua VPN.
Para permitir o tráfego da VPN WireGuard através do firewall do servidor, você precisará habilitar o masquerading, que é um conceito do iptables que fornece tradução de endereço de rede dinâmica (NAT) sob demanda para rotear corretamente as conexões dos clientes.
Primeiro, encontre a interface de rede pública do seu Servidor WireGuard usando o subcomando ip route
:
A interface pública é a string encontrada na saída deste comando que segue a palavra “dev”. Por exemplo, este resultado mostra a interface chamada eth0
, que está destacada abaixo:
Outputdefault via 203.0.113.1 dev eth0 proto static
Observe o nome do seu dispositivo, pois você o adicionará às regras do iptables
no próximo passo.
Para adicionar regras de firewall ao seu Servidor WireGuard, abra o arquivo /etc/wireguard/wg0.conf
com o nano
ou seu editor preferido novamente.
Ao final do arquivo após a linha SaveConfig = true
, cole as seguintes linhas:
/etc/wireguard/wg0.conf. . .
PostUp = ufw route allow in on wg0 out on eth0
PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on eth0
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
As linhas PostUp
serão executadas quando o Servidor WireGuard iniciar o túnel VPN virtual. No exemplo aqui, ele adicionará três regras ufw
e iptables
:
ufw route allow in on wg0 out on eth0
– Essa regra permitirá o encaminhamento de tráfego IPv4 e IPv6 que chega na interface VPNwg0
para a interface de redeeth0
no servidor. Ela funciona em conjunto com os valoresnet.ipv4.ip_forward
enet.ipv6.conf.all.forwarding
que você configurou na seção anterior.iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
– Essa regra configura o masquerading e reescreve o tráfego IPv4 que chega na interface VPNwg0
para parecer que ele se origina diretamente do endereço IPv4 público do Servidor WireGuard.ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
– Essa regra configura o masquerading e reescreve o tráfego IPv6 que chega na interface VPNwg0
para parecer que ele se origina diretamente do endereço IPv6 público do Servidor WireGuard.
As regras PreDown
são executadas quando o Servidor WireGuard interrompe o túnel VPN virtual. Essas regras são o inverso das regras PostUp
e funcionam para desfazer as regras de encaminhamento e masquerading para a interface VPN quando a VPN é interrompida.
Em ambos os casos, edite a configuração para incluir ou excluir as regras IPv4 e IPv6 que são apropriadas para sua VPN. Por exemplo, se você estiver usando apenas IPv4, então você pode excluir as linhas com os comandos ip6tables
.
Por outro lado, se estiver usando apenas IPv6, edite a configuração para incluir apenas os comandos ip6tables
. As linhas do ufw
devem existir para qualquer combinação de redes IPv4 e IPv6. Salve e feche o arquivo quando terminar.
A última parte da configuração do firewall no seu Servidor WireGuard é permitir o tráfego para e a partir da porta UDP do próprio WireGuard. Se você não alterou a porta no arquivo /etc/wireguard/wg0.conf
do servidor, a porta que você abrirá é a 51820
. Se você escolheu uma porta diferente ao editar a configuração, certifique-se de substituí-la no seguinte comando UFW.
No caso de ter esquecido de abrir a porta SSH ao seguir o tutorial prévio, adicione-a aqui também:
Nota: Se estiver usando um firewall diferente ou personalizou sua configuração UFW, talvez seja necessário adicionar regras adicionais de firewall. Por exemplo, se decidir direcionar todo o tráfego de rede sobre a conexão VPN, será necessário garantir que o tráfego da porta 53
seja permitido para solicitações DNS, e portas como 80
e 443
para tráfego HTTP e HTTPS, respectivamente. Se houver outros protocolos que estiver utilizando sobre a VPN, será necessário adicionar regras para eles também.
Após adicionar essas regras, desative e reative o UFW para reiniciá-lo e carregar as alterações de todos os arquivos que você modificou:
Você pode confirmar que as regras estão em vigor executando o comando ufw status
. Execute-o e você deverá receber uma saída como a seguinte:
OutputStatus: active
To Action From
-- ------ ----
51280/udp ALLOW Anywhere
22/tcp ALLOW Anywhere
51280/udp (v6) ALLOW Anywhere (v6)
22/tcp (v6) ALLOW Anywhere (v6)
Seu servidor WireGuard agora está configurado para lidar corretamente com o tráfego da VPN, incluindo encaminhamento e mascaramento para os pares. Com as regras do firewall em vigor, você pode iniciar o próprio serviço WireGuard para ouvir conexões de pares.
Passo 6 — Iniciando o Servidor WireGuard
O WireGuard pode ser configurado para ser executado como um serviço systemd
usando seu script wg-quick
integrado. Embora você possa manualmente usar o comando wg
para criar o túnel sempre que desejar usar a VPN, fazer isso é um processo manual que se torna repetitivo e propenso a erros. Em vez disso, você pode usar o systemctl
para gerenciar o túnel com a ajuda do script wg-quick
.
Usar um serviço systemd
significa que você pode configurar o WireGuard para iniciar na inicialização para que você possa se conectar à sua VPN a qualquer momento, desde que o servidor esteja em execução. Para fazer isso, habilite o serviço wg-quick
para o túnel wg0
que você definiu adicionando-o ao systemctl
:
Observe que o comando especifica o nome do dispositivo de túnel wg0
como parte do nome do serviço. Esse nome mapeia para o arquivo de configuração /etc/wireguard/wg0.conf
. Essa abordagem de nomeação significa que você pode criar quantos túneis VPN separados desejar usando seu servidor.
Por exemplo, você poderia ter um dispositivo de túnel com o nome de prod
e seu arquivo de configuração seria /etc/wireguard/prod.conf
. Cada configuração de túnel pode conter diferentes configurações de IPv4, IPv6 e firewall do cliente. Desta forma, você pode suportar múltiplas conexões de pares diferentes, cada uma com seus próprios endereços IP e regras de roteamento exclusivos.
Agora inicie o serviço:
Verifique se o serviço WireGuard está ativo com o seguinte comando. Você deve ver active (running)
na saída:
Output● [email protected] - WireGuard via wg-quick(8) for wg0
Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2022-04-18 17:22:13 UTC; 2s ago
Docs: man:wg-quick(8)
man:wg(8)
https://www.wireguard.com/
https://www.wireguard.com/quickstart/
https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
Process: 98834 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
Main PID: 98834 (code=exited, status=0/SUCCESS)
CPU: 193ms
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] wg setconf wg0 /dev/fd/63
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -4 address add 10.8.0.1/24 dev wg0
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -6 address add fd24:609a:6c18::1/64 dev wg0
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip link set mtu 1420 up dev wg0
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ufw route allow in on wg0 out on ens3
Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added
Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added (v6)
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip6tables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
Apr 18 17:22:13 thats-my-jam systemd[1]: Finished WireGuard via wg-quick(8) for wg0.
A saída mostra os comandos ip
que são usados para criar o dispositivo virtual wg0
e atribuir a ele os endereços IPv4 e IPv6 que você adicionou ao arquivo de configuração. Você pode usar essas regras para solucionar problemas no túnel, ou com o próprio comando wg
se quiser tentar configurar manualmente a interface VPN.
Com o servidor configurado e em execução, o próximo passo é configurar sua máquina cliente como um Par do WireGuard e conectar ao Servidor WireGuard.
Passo 7 — Configurando um Par do WireGuard
Configurar um par do WireGuard é semelhante à configuração do Servidor WireGuard. Depois de ter o software cliente instalado, você irá gerar um par de chaves pública e privada, decidir sobre um endereço IP ou endereços para o par, definir um arquivo de configuração para o par e, em seguida, iniciar o túnel usando o script wg-quick
.
Você pode adicionar quantos pares desejar à sua VPN, gerando um par de chaves e configuração usando os seguintes passos. Se adicionar vários pares à VPN, certifique-se de acompanhar os endereços IP privados deles para evitar colisões.
Para configurar o Par do WireGuard, certifique-se de ter o pacote WireGuard instalado usando os seguintes comandos apt
. No par do WireGuard, execute:
Criando o Par de Chaves do WireGuard
Em seguida, você precisará gerar o par de chaves no par usando os mesmos passos que usou no servidor. Do seu computador local ou servidor remoto que servirá como par, prossiga e crie a chave privada para o par usando os seguintes comandos:
Novamente, você receberá uma única linha de saída codificada em base64
, que é a chave privada. Uma cópia da saída também é armazenada em /etc/wireguard/private.key
. Anote cuidadosamente a chave privada que é gerada, pois você precisará adicioná-la ao arquivo de configuração do WireGuard mais tarde nesta seção.
Em seguida, use o seguinte comando para criar o arquivo de chave pública:
Você receberá novamente uma única linha de saída codificada em base64
, que é a chave pública para o seu Par do WireGuard. Copie-a para algum lugar como referência, pois você precisará distribuir a chave pública para o Servidor do WireGuard para estabelecer uma conexão criptografada.
Criando o Arquivo de Configuração do Peer do WireGuard
Agora que você possui um par de chaves, pode criar um arquivo de configuração para o peer que contenha todas as informações necessárias para estabelecer uma conexão com o Servidor WireGuard.
Você precisará de algumas informações para o arquivo de configuração:
-
A chave privada codificada em
base64
que você gerou no peer. -
Os intervalos de endereços IPv4 e IPv6 que você definiu no Servidor WireGuard.
-
A chave pública codificada em
base64
do Servidor WireGuard. -
O endereço IP público e número da porta do Servidor WireGuard. Normalmente, isso será o endereço IPv4, mas se o seu servidor tiver um endereço IPv6 e sua máquina cliente tiver uma conexão IPv6 com a internet, você pode usar isso em vez do IPv4.
Com todas essas informações em mãos, abra um novo arquivo /etc/wireguard/wg0.conf
na máquina do Peer do WireGuard usando o nano
ou seu editor preferido:
Adicione as seguintes linhas ao arquivo, substituindo os diversos dados nas seções destacadas conforme necessário:
/etc/wireguard/wg0.conf[Interface]
PrivateKey = base64_encoded_peer_private_key_goes_here
Address = 10.8.0.2/24
Address = fd24:609a:6c18::2/64
[Peer]
PublicKey = U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
AllowedIPs = 10.8.0.0/24, fd24:609a:6c18::/64
Endpoint = 203.0.113.1:51820
Observe como a primeira linha Address
usa um endereço IPv4 da sub-rede 10.8.0.0/24
que você escolheu anteriormente. Este endereço IP pode ser qualquer um na sub-rede, desde que seja diferente do IP do servidor. Incrementar os endereços por 1 cada vez que você adicionar um par é geralmente a maneira mais fácil de alocar IPs.
Da mesma forma, observe como a segunda linha Address
usa um endereço IPv6 da sub-rede que você gerou anteriormente e incrementa o endereço do servidor em um. Novamente, qualquer IP no intervalo é válido se você decidir usar um endereço diferente.
A outra parte notável do arquivo é a última linha AllowedIPs
. Esses dois intervalos IPv4 e IPv6 instruem o par a enviar tráfego apenas pela VPN se o sistema de destino tiver um endereço IP em qualquer um dos intervalos. Usando a diretiva AllowedIPs
, você pode restringir a VPN no par para conectar apenas a outros pares e serviços na VPN, ou pode configurar a configuração para canalizar todo o tráfego pela VPN e usar o Servidor WireGuard como um gateway.
Se você estiver usando apenas IPv4, omita o intervalo fd24:609a:6c18::/64
final (incluindo a vírgula ,
). Por outro lado, se estiver usando apenas IPv6, inclua apenas o prefixo fd24:609a:6c18::/64
e deixe de fora o intervalo IPv4 10.8.0.0/24
.
Em ambos os casos, se você deseja enviar todo o tráfego de seu par pela VPN e usar o Servidor WireGuard como gateway para todo o tráfego, então você pode usar 0.0.0.0/0
, que representa todo o espaço de endereço IPv4, e ::/0
para todo o espaço de endereço IPv6.
(Opcional) Configurando um Par para Roteamento de Todo o Tráfego Sobre o Túnel
Se você optou por rotear todo o tráfego do par sobre o túnel usando as rotas 0.0.0.0/0
ou ::/0
e o par é um sistema remoto, então você precisará concluir as etapas desta seção. Se seu par é um sistema local, é melhor pular esta seção.
Para pares remotos que você acessa via SSH ou algum outro protocolo usando um endereço IP público, será necessário adicionar algumas regras extras ao arquivo wg0.conf
do par. Essas regras garantirão que você ainda possa se conectar ao sistema de fora do túnel quando estiver conectado. Caso contrário, quando o túnel for estabelecido, todo o tráfego que normalmente seria tratado na interface de rede pública não será roteado corretamente para contornar a interface do túnel wg0
, levando a um sistema remoto inacessível.
Primeiro, você precisará determinar o endereço IP que o sistema usa como seu gateway padrão. Execute o seguinte comando ip route
:
Você receberá uma saída como a seguinte:
Outputdefault via 203.0.113.1 dev eth0 proto static
Anota o endereço IP destacado do gateway 203.0.113.1
para uso posterior e o dispositivo eth0
. O nome do seu dispositivo pode ser diferente. Se for o caso, substitua-o pelo nome do dispositivo no lugar de eth0
nos comandos a seguir.
Em seguida, encontre o IP público do sistema examinando o dispositivo com o comando ip address show
:
Você receberá uma saída como a seguinte:
Outputeth0 UP 203.0.113.5/20 10.20.30.40/16 2604:a880:400:d1::3d3:6001/64 fe80::68d5:beff:feff:974c/64
Neste exemplo de saída, o IP 203.0.113.5
destacado (sem o sufixo /20
) é o endereço público atribuído ao dispositivo eth0
que você precisará adicionar à configuração do WireGuard.
Agora abra o arquivo /etc/wireguard/wg0.conf
do Peer do WireGuard com o nano
ou seu editor preferido.
Antes da linha [Peer]
, adicione as seguintes 4 linhas:
PostUp = ip rule add table 200 from 203.0.113.5
PostUp = ip route add table 200 default via 203.0.113.1
PreDown = ip rule delete table 200 from 203.0.113.5
PreDown = ip route delete table 200 default via 203.0.113.1
[Peer]
. . .
Essas linhas criarão uma regra de roteamento personalizada e adicionarão uma rota personalizada para garantir que o tráfego público para o sistema use o gateway padrão.
PostUp = ip rule add table 200 from 203.0.113.5
– Este comando cria uma regra que verifica todas as entradas de roteamento na tabela numerada200
quando o IP corresponde ao endereço público do sistema203.0.113.5
.PostUp = ip route add table 200 default via 203.0.113.1
– Este comando garante que qualquer tráfego sendo processado pela tabela200
utilizará o gateway203.0.113.1
para roteamento, em vez da interface do WireGuard.
As linhas PreDown
removem a regra personalizada e a rota quando o túnel é desligado.
Nota: O número da tabela 200
é arbitrário ao construir essas regras. Você pode usar um valor entre 2 e 252, ou pode usar um nome personalizado adicionando um rótulo ao arquivo /etc/iproute2/rt_tables
e, em seguida, referindo-se ao nome em vez do valor numérico.
Para mais informações sobre como as tabelas de roteamento funcionam no Linux, visite a Seção de Tabelas de Roteamento do Guia de Administração de Rede da Camada IP com Linux.
Se você estiver roteando todo o tráfego do par pela VPN, certifique-se de ter configurado as regras corretas do sysctl
e do iptables
no Servidor WireGuard em Passo 4 — Ajustando a Configuração de Rede do Servidor WireGuard e Passo 5 — Configurando o Firewall do Servidor WireGuard.
(Opcional) Configurando os Resolvedores DNS do Par WireGuard
Se você estiver usando o Servidor WireGuard como um gateway VPN para todo o tráfego de seus pares, será necessário adicionar uma linha à seção [Interface]
que especifica os resolvedores DNS. Se você não adicionar essa configuração, suas solicitações de DNS podem não ser protegidas pela VPN ou podem ser reveladas ao seu provedor de serviços de Internet ou outras partes.
Se você estiver usando o WireGuard apenas para acessar recursos na rede VPN ou em uma configuração ponto a ponto, então você pode pular esta seção.
Para adicionar resolvedores DNS à configuração do seu par, primeiro determine quais servidores DNS seu Servidor WireGuard está usando. Execute o seguinte comando no Servidor WireGuard, substituindo o nome do seu dispositivo Ethernet pelo exemplo eth0
, se for diferente deste exemplo:
Você deverá receber uma saída como a seguinte:
OutputLink 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888
Os endereços IP que são exibidos são os resolvedores DNS que o servidor está usando. Você pode escolher usar qualquer um ou todos eles, ou apenas IPv4 ou IPv6, dependendo de suas necessidades. Anote os resolvedores que você usará.
Em seguida, você precisará adicionar seus resolvedores escolhidos ao arquivo de configuração do Par WireGuard. De volta ao Par WireGuard, abra o arquivo /etc/wireguard/wg0.conf
usando o nano
ou o editor de sua preferência:
Antes da linha [Peer]
, adicione o seguinte:
DNS = 67.207.67.2 2001:4860:4860::8844
[Peer]
. . .
Novamente, dependendo de suas preferências ou requisitos para IPv4 e IPv6, você pode editar a lista de acordo com suas necessidades.
Assim que estiver conectado à VPN no seguinte passo, você pode verificar se está enviando consultas DNS pela VPN usando um site como DNS leak test.com.
Você também pode verificar se seu par está usando os resolvedores configurados com o comando resolvectl dns
, como fez no servidor. Você deverá receber uma saída como a seguinte, mostrando os resolvedores DNS que você configurou para o túnel VPN:
OutputGlobal: 67.207.67.2 67.207.67.3
. . .
Com todas essas configurações de resolvedor DNS no lugar, agora você está pronto para adicionar a chave pública do par ao servidor e iniciar o túnel WireGuard no par.
Passo 8 — Adicionando a Chave Pública do Par ao Servidor WireGuard
Antes de conectar o par ao servidor, é importante adicionar a chave pública do par ao Servidor WireGuard. Este passo garante que você poderá conectar-se e rotear o tráfego pela VPN. Sem completar este passo, o servidor WireGuard não permitirá que o par envie ou receba qualquer tráfego pelo túnel.
Assegure-se de ter uma cópia da chave pública codificada em base64
para o Par WireGuard executando:
OutputPeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
Agora faça login no servidor WireGuard e execute o seguinte comando:
Observe que a parte allowed-ips
do comando aceita uma lista separada por vírgulas de endereços IPv4 e IPv6. Você pode especificar IPs individuais se desejar restringir o endereço IP que um par pode atribuir a si mesmo, ou um intervalo como no exemplo se seus pares puderem usar qualquer endereço IP no intervalo da VPN. Observe também que nenhum par pode ter a mesma configuração de allowed-ips
.
Se desejar atualizar o allowed-ips
para um par existente, você pode executar o mesmo comando novamente, mas alterar os endereços IP. Múltiplos endereços IP são suportados. Por exemplo, para alterar o Peer do WireGuard que você acabou de adicionar para adicionar um IP como 10.8.0.100
aos IPs existentes 10.8.0.2
e fd24:609a:6c18::2
, você executaria o seguinte:
Depois de executar o comando para adicionar o par, verifique o status do túnel no servidor usando o comando wg
:
Outputinterface: wg0
public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
private key: (hidden)
listening port: 51820
peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
allowed ips: 10.8.0.2/32, fd24:609a:6c18::/128
Observe como a linha peer
mostra a chave pública do Peer do WireGuard e os endereços IP ou intervalos de endereços que ele tem permissão para usar para atribuir a si mesmo um IP.
Agora que você definiu os parâmetros de conexão do par no servidor, o próximo passo é iniciar o túnel no par.
Passo 9 — Conectando o Peer do WireGuard ao Túnel
Agora que seu servidor e peer estão ambos configurados para suportar sua escolha de IPv4, IPv6, encaminhamento de pacotes e resolução de DNS, é hora de conectar o peer ao túnel VPN.
Como você pode querer que a VPN esteja ativada apenas para determinados casos de uso, usaremos o comando wg-quick
para estabelecer a conexão manualmente. Se você deseja automatizar o início do túnel como fez no servidor, siga essas etapas na seção Etapa 6 — Iniciando o Servidor WireGuard em vez de usar o comando wq-quick
.
No caso de estar roteando todo o tráfego através da VPN e ter configurado o encaminhamento de DNS, você precisará instalar a utilidade resolvconf
no Peer do WireGuard antes de iniciar o túnel. Execute o seguinte comando para configurar isso:
Para iniciar o túnel, execute o seguinte no Peer do WireGuard:
Você receberá uma saída como a seguinte:
Output[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.8.0.2/24 dev wg0
[#] ip -6 address add fd24:609a:6c18::2/64 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a tun.wg0 -m 0 -x
Observe os endereços IPv4 e IPv6 destacados que você atribuiu ao peer.
Se você definiu o AllowedIPs
no peer como 0.0.0.0/0
e ::/0
(ou para usar faixas diferentes das que você escolheu para a VPN), então sua saída se assemelhará à seguinte:
Output[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.8.0.2/24 dev wg0
[#] ip -6 address add fd24:609a:6c18::2/64 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a tun.wg0 -m 0 -x
[#] wg set wg0 fwmark 51820
[#] ip -6 route add ::/0 dev wg0 table 51820
[#] ip -6 rule add not fwmark 51820 table 51820
[#] ip -6 rule add table main suppress_prefixlength 0
[#] ip6tables-restore -n
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] iptables-restore -n
Neste exemplo, observe as rotas destacadas que o comando adicionou, que correspondem aos AllowedIPs
na configuração do peer.
Você pode verificar o status do túnel no peer usando o comando wg
:
Outputinterface: wg0
public key: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
private key: (hidden)
listening port: 49338
fwmark: 0xca6c
peer: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
endpoint: 203.0.113.1:51820
allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64
latest handshake: 1 second ago
transfer: 6.50 KiB received, 15.41 KiB sent
Você também pode verificar o status no servidor novamente, e receberá uma saída similar.
Verifique se seu par está usando a VPN usando os comandos ip route
e ip -6 route
. Se estiver usando a VPN como gateway para todo o tráfego da Internet, verifique qual interface será usada para o tráfego destinado aos resolutores DNS da CloudFlare 1.1.1.1
e 2606:4700:4700::1111
.
Se estiver usando apenas o WireGuard para acessar recursos na VPN, substitua um endereço IPv4 ou IPv6 válido como o próprio gateway nesses comandos. Por exemplo, 10.8.0.1
ou fd24:609a:6c18::1
.
Output1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000
cache
Observe o dispositivo wg0
utilizado e o endereço IPv4 10.8.0.2
que você atribuiu ao par. Da mesma forma, se estiver usando IPv6, execute o seguinte:
Output2606:4700:4700::1111 from :: dev wg0 table 51820 src fd24:609a:6c18::2 metric 1024 pref medium
Novamente, observe a interface wg0
, e o endereço IPv6 fd24:609a:6c18::2
que você atribuiu ao par.
Se seu par tiver um navegador instalado, você também pode visitar ipleak.net e ipv6-test.com para confirmar se seu par está roteando seu tráfego pela VPN.
Quando estiver pronto para desconectar da VPN no par, use o comando wg-quick
:
Você receberá uma saída como a seguinte, indicando que o túnel VPN foi desativado:
Output[#] ip link delete dev wg0
[#] resolvconf -d tun.wg0 -f
Se você definiu o AllowedIPs
no par como 0.0.0.0/0
e ::/0
(ou para usar intervalos diferentes dos escolhidos para a VPN), então sua saída se assemelhará ao seguinte:
Output[#] ip rule delete table 200 from 203.0.113.5
[#] ip route delete table 200 default via 203.0.113.1
[#] ip -4 rule delete table 51820
[#] ip -4 rule delete table main suppress_prefixlength 0
[#] ip -6 rule delete table 51820
[#] ip -6 rule delete table main suppress_prefixlength 0
[#] ip link delete dev wg0
[#] resolvconf -d tun.wg0 -f
[#] iptables-restore -n
[#] ip6tables-restore -n
Para reconectar à VPN, execute novamente o comando wg-quick up wg0
no par. Se desejar remover completamente a configuração de um par do Servidor WireGuard, você pode executar o seguinte comando, certificando-se de substituir a chave pública correta para o par que deseja remover:
Normalmente, você só precisará remover uma configuração de par se o par não existir mais, ou se suas chaves de criptografia estiverem comprometidas ou alteradas. Caso contrário, é melhor deixar a configuração no local para que o par possa se reconectar à VPN sem exigir que você adicione sua chave e allowed-ips
cada vez.
Conclusão
Neste tutorial, você instalou o pacote e ferramentas do WireGuard em ambos os sistemas Ubuntu 22.04 do servidor e do cliente. Você configurou regras de firewall para o WireGuard e configurou as configurações do kernel para permitir o encaminhamento de pacotes usando o comando sysctl
no servidor. Você aprendeu como gerar chaves de criptografia privada e pública do WireGuard, e como configurar o servidor e o par (ou pares) para se conectarem entre si.
Se sua rede usa IPv6, você também aprendeu como gerar uma faixa de endereços locais exclusiva para usar com conexões de pares. Por fim, você aprendeu como limitar qual tráfego deve passar pela VPN restringindo os prefixos de rede que o par pode usar, além de como usar o Servidor WireGuard como um gateway VPN para lidar com todo o tráfego da Internet para os pares.
Se você gostaria de aprender mais sobre o WireGuard, incluindo como configurar túneis mais avançados, ou usar o WireGuard com containers, visite a documentação oficial do WireGuard.
Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-wireguard-on-ubuntu-22-04