Como Configurar o WireGuard no Ubuntu 22.04

Introdução

WireGuard é uma Rede Privada Virtual (VPN) 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 de forma segura e protegida a partir do seu smartphone ou laptop quando conectado a uma rede não confiável, como o WiFi em um hotel ou cafeteria.

A criptografia do WireGuard depende de chaves públicas e privadas para os pares estabelecerem um túnel criptografado entre si. Cada versão do WireGuard utiliza uma suíte criptográfica específica para garantir simplicidade, segurança e compatibilidade com os pares.

Em comparação, outros softwares de 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 suítes e algoritmos criptográficos, e embora isso permita uma grande flexibilidade para suportar diferentes clientes, também torna a configuração de uma VPN que utiliza TLS mais demorada, complexa e propensa a erros.

Neste tutorial, você 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 referido 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 ponto a ponto criptografado.

Para os propósitos deste tutorial, configuraremos 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 DigitalOcean, esteja ciente de que nós, como muitos provedores de hospedagem, cobramos por excedentes de largura de banda. Por esse motivo, por favor, esteja atento à quantidade de tráfego que seu servidor está manipulando. 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 sudo não root e um firewall habilitado. 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 essa máquina como o Peer WireGuard. Para os propósitos deste tutorial, é recomendado 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 estiver usando um sistema remoto, certifique-se de seguir todas as seções opcionais mais tarde neste tutorial ou poderá ficar bloqueado fora 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 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 posteriormente usando as instruções dessa página.

Passo 1 — Instalando o WireGuard e Gerando um Par de Chaves

O primeiro passo neste 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 estiver usando sudo nesta sessão:

  1. sudo apt update
  2. sudo apt install wireguard

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 embutidos wg genkey e wg pubkey 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:

  1. wg genkey | sudo tee /etc/wireguard/private.key
  2. sudo chmod go= /etc/wireguard/private.key

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 é produzida, pois você precisará adicioná-la ao arquivo de configuração do WireGuard mais tarde 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:

  1. sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

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 envia para o 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 último comando recebe a saída do comando de geração de 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 par que se conecte ao servidor.

Passo 2 — Escolhendo Endereços IPv4 e IPv6

Na seção anterior, você instalou o WireGuard e gerou um par de chaves que serão usadas 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 reiniciar. Você também definirá endereços IPv4 e IPv6 privados para usar com seu servidor e pares do WireGuard.

Se planeja usar tanto endereços IPv4 quanto IPv6, siga estas duas seções. Caso contrário, siga as instruções na seção apropriada para as necessidades de rede da sua VPN.

Passo 2(a) — Escolha de um Intervalo IPv4

Se estiver utilizando o seu servidor WireGuard com pares IPv4, o servidor precisa de um intervalo de endereços IPv4 privados para utilizar nos clientes e na 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 até 10.255.255.255 (prefixo 10/8)
  • 172.16.0.0 até 172.31.255.255 (prefixo 172.16/12)
  • 192.168.0.0 até 192.168.255.255 (prefixo 192.168/16)

Para os propósitos deste tutorial, vamos usar 10.8.0.0/24 como um bloco de endereços IP a partir do primeiro intervalo de IPs reservados. Este intervalo permitirá até 255 diferentes conexões de pares 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, caso este intervalo de exemplo não seja compatível com as suas redes.

O servidor WireGuard usará um único endereço IP do intervalo para seu endereço de túnel IPv4 privado. Usaremos 10.8.0.1/24 aqui, mas qualquer endereço no intervalo de 10.8.0.1 a 10.8.0.255 pode ser usado. Anote o endereço IP que você escolher se estiver usando 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 precisará gerar um prefixo de endereço IPv6 unicast local exclusivo com base no algoritmo em RFC 4193. Os endereços que você usa com o WireGuard serão associados a uma interface de túnel virtual. Você precisará concluir algumas etapas para gerar um prefixo IPv6 aleatório e exclusivo 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 hashizados 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 carimbo de data/hora de 64 bits usando o utilitário date com o seguinte comando:

  1. date +%s%N

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:

Output
1650301699497770167

Registre o valor em algum lugar para uso posterior nesta seção. Em seguida, copie o valor do 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.

  1. cat /var/lib/dbus/machine-id

Você receberá uma saída como a seguinte:

/var/lib/dbus/machine-id
610cef4946ed46da8f71dba9d66c67fb

Agora você precisa combinar o carimbo de data/hora com o machine-id e hashar o valor resultante usando o algoritmo SHA-1. O comando usará o seguinte formato:

printf <timestamp><machine-id> | sha1sum

Execute o comando substituindo os valores do carimbo de data/hora e da identidade da máquina:

  1. printf 1650301699497770167610cef4946ed46da8f71dba9d66c67fb | sha1sum

Você receberá um valor de hash como o seguinte:

Output
442adea1488d96388dae9ab816045b24609a6c18 -

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 hash.

O algoritmo no RFC requer apenas os 40 bits menos significativos (trailing), ou 5 bytes, da saída hash. Use o comando cut para imprimir os últimos 5 bytes codificados em hexadecimal do hash:

  1. printf 442adea1488d96388dae9ab816045b24609a6c18 | cut -c 31-

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ê deve receber uma saída como a seguinte:

Output
24609a6c18

Neste exemplo de saída, o conjunto de bytes é: 24 60 9a 6c 18.

Agora você pode construir seu prefixo de rede IPv6 único adicionando os 5 bytes gerados com o prefixo fd, separando cada 2 bytes com dois pontos : para facilitar a leitura. 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 Prefix
fd24:609a:6c18::/64

Este intervalo fd24:609a:6c18::/64 é o que você usará para atribuir endereços IP individuais às interfaces de túnel WireGuard no servidor e nos peers. 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 peers podem usar qualquer IP no intervalo, mas normalmente você incrementará o valor em um a cada vez que adicionar um peer, 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:

  1. Certifique-se de ter a chave privada disponível do Passo 1 — Instalando o WireGuard e Gerando um Par de Chaves.

  2. Se estiver utilizando o WireGuard com IPv4, você precisará do endereço IP que escolheu para o servidor no Passo 2(a) — Escolhendo uma Faixa IPv4, que neste exemplo é 10.8.0.1/24.

  3. Se estiver utilizando o WireGuard com IPv6, você precisará do endereço IP para o servidor que gerou no Passo 2(b) — Escolhendo uma Faixa IPv6. Neste exemplo, o IP é fd24:609a:6c18::1/64.

Uma vez que tenha a chave privada e o(s) endereço(s) IP necessários, crie um novo ficheiro de configuração usando o nano ou o seu editor preferido, executando o seguinte comando:

  1. sudo nano /etc/wireguard/wg0.conf

Adicione as seguintes linhas ao ficheiro, substituindo a sua chave privada pelo valor realçado aqui_vai_a_chave_privada_codificada_em_base64, 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 é desligada, quaisquer alterações serão guardadas no ficheiro de configuração.

Guarde e feche o ficheiro /etc/wireguard/wg0.conf. Se estiver a usar 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 pretende utilizar o seu servidor VPN WireGuard.

Passo 4 – Ajustar a Configuração de Rede do Servidor WireGuard

Se estiver a utilizar o WireGuard para ligar um par ao Servidor WireGuard para aceder apenas aos serviços no servidor, então não precisa de completar esta secção. Se pretender encaminhar o tráfego de Internet do seu Par WireGuard através do Servidor WireGuard, então precisará de configurar o encaminhamento IP seguindo esta secção do tutorial.

Para configurar o encaminhamento, abra o ficheiro /etc/sysctl.conf usando o nano ou o seu editor preferido:

  1. sudo nano /etc/sysctl.conf

Se estiver a usar IPv4 com o WireGuard, adicione a seguinte linha no final do ficheiro:

/etc/sysctl.conf
net.ipv4.ip_forward=1

Se estiver a usar IPv6 com o WireGuard, adicione esta linha no final do ficheiro:

/etc/sysctl.conf
net.ipv6.conf.all.forwarding=1

Se estiver a utilizar tanto IPv4 como IPv6, certifique-se de incluir ambas as linhas. Guarde e feche o ficheiro quando terminar.

Para ler o ficheiro e carregar os novos valores para a sua sessão de terminal atual, execute:

  1. sudo sysctl -p
Output
net.ipv6.conf.all.forwarding = 1 net.ipv4.ip_forward = 1

Agora o seu Servidor WireGuard será capaz de encaminhar tráfego de entrada do dispositivo ethernet VPN virtual para outros no servidor, e a partir daí para a Internet pública. Utilizando esta configuração permitirá encaminhar todo o tráfego web do seu Par WireGuard através do endereço IP do seu servidor, e o endereço IP público do seu cliente estará efetivamente oculto.

No entanto, antes que o tráfego possa ser encaminhado corretamente através do seu servidor, precisará de configurar algumas regras de firewall. Estas regras garantirão que o tráfego para e a partir do 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 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 dinâmica de endereços de rede (NAT) 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:

  1. ip route list default

A interface pública é a string encontrada dentro da saída deste comando que segue a palavra “dev”. Por exemplo, este resultado mostra a interface chamada eth0, que está destacada abaixo:

Output
default via 203.0.113.1 dev eth0 proto static

Anote o nome do seu dispositivo, pois você irá adicioná-lo à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.

  1. sudo nano /etc/wireguard/wg0.conf

No 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, serão adicionadas três regras ufw e iptables:

  • ufw route allow in on wg0 out on eth0 – Esta regra permitirá o encaminhamento do tráfego IPv4 e IPv6 que chega na interface VPN wg0 para a interface de rede eth0 no servidor. Ela funciona em conjunto com os valores sysctl net.ipv4.ip_forward e net.ipv6.conf.all.forwarding que você configurou na seção anterior.
  • iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE – Esta regra configura a masquerading e reescreve o tráfego IPv4 que chega na interface VPN wg0 para que pareça que ele se origina diretamente do endereço IPv4 público do servidor WireGuard.
  • ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE – Esta regra configura a masquerading e reescreve o tráfego IPv6 que chega na interface VPN wg0 para que pareça 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 apenas usando IPv4, pode excluir as linhas com os comandos ip6tables.

Por outro lado, se estiver utilizando apenas IPv6, então 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 de e para a 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á é 51820. Se escolheu uma porta diferente ao editar a configuração, certifique-se de substituí-la no seguinte comando UFW.

Caso tenha esquecido de abrir a porta SSH ao seguir o tutorial pré-requisito, adicione-a aqui também:

  1. sudo ufw allow 51820/udp
  2. sudo ufw allow OpenSSH

Nota: Se estiver utilizando um firewall diferente ou tiver personalizado sua configuração UFW, talvez seja necessário adicionar regras de firewall adicionais. Por exemplo, se decidir tunelar todo o tráfego da sua rede pela conexão VPN, será necessário garantir que o tráfego da porta 53 esteja permitido para solicitações DNS, e as portas como 80 e 443 para tráfego HTTP e HTTPS, respectivamente. Se estiver usando outros protocolos pela VPN, então 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:

  1. sudo ufw disable
  2. sudo ufw enable

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:

  1. sudo ufw status
Output
Status: active To Action From -- ------ ---- 51280/udp ALLOW Anywhere 22/tcp ALLOW Anywhere 51280/udp (v6) ALLOW Anywhere (v6) 22/tcp (v6) ALLOW Anywhere (v6)

O seu servidor WireGuard está agora 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 as conexões dos pares.

Passo 6 — Iniciando o Servidor WireGuard

O WireGuard pode ser configurado para ser executado como um serviço systemd usando o seu script wg-quick integrado. Embora você pudesse usar manualmente o comando wg para criar o túnel sempre que quiser 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:

  1. sudo systemctl enable [email protected]

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 o seu servidor.

Por exemplo, você pode 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 firewall IPv4, IPv6 e do cliente. Dessa forma, você pode suportar várias conexões de pares diferentes, cada uma com seus próprios endereços IP e regras de roteamento exclusivos.

Agora inicie o serviço:

  1. sudo systemctl start [email protected]

Verifique duplamente se o serviço WireGuard está ativo com o seguinte comando. Você deverá ver active (running) na saída:

  1. sudo systemctl status [email protected]
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 Peer do WireGuard e conectar ao Servidor WireGuard.

Passo 7 — Configurando um Peer do WireGuard

Configurar um peer do WireGuard é semelhante à configuração do Servidor WireGuard. Depois de instalar o software cliente, você irá gerar um par de chaves pública e privada, decidir sobre um ou mais endereços IP para o peer, definir um arquivo de configuração para o peer e então 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 seus endereços IP privados 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:

  1. sudo apt update
  2. sudo apt install wireguard

Criando o Par de Chaves do WireGuard

Em seguida, você precisará gerar o par de chaves no par usando os mesmos passos que você usou no servidor. A partir da sua máquina local ou servidor remoto que servirá como par, prossiga e crie a chave privada para o par usando os seguintes comandos:

  1. wg genkey | sudo tee /etc/wireguard/private.key
  2. sudo chmod go= /etc/wireguard/private.key

Novamente, você receberá uma linha única de saída codificada em base64, que é a chave privada. Uma cópia da saída também é armazenada em /etc/wireguard/private.key. Faça uma anotação cuidadosa da chave privada que é gerada, pois você precisará adicioná-la ao arquivo de configuração do WireGuard posteriormente nesta seção.

Em seguida, use o seguinte comando para criar o arquivo de chave pública:

  1. sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

Você receberá novamente uma linha única de saída codificada em base64, que é a chave pública para o seu Par do WireGuard. Copie-a em algum lugar para 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 Par do WireGuard

Agora que você tem um par de chaves, você pode criar um arquivo de configuração para o par que contenha todas as informações necessárias para estabelecer uma conexão com o Servidor WireGuard.

Você vai precisar de algumas informações para o arquivo de configuração:

  • A chave privada codificada em base64 que você gerou no par.

  • 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 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 Peer do WireGuard usando o nano ou seu editor preferido:

  1. sudo nano /etc/wireguard/wg0.conf

Adicione as seguintes linhas ao arquivo, substituindo os vários 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 em 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 se 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 no 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 desejar enviar todo o tráfego de seus pares 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ços IPv4, e ::/0 para todo o espaço de endereços 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 através do 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 o seu par for 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, você precisará adicionar algumas regras extras ao arquivo wg0.conf do par. Essas regras garantirão que você ainda consiga se conectar ao sistema de fora do túnel quando estiver conectado. Caso contrário, quando o túnel estiver estabelecido, todo o tráfego que normalmente seria tratado na interface de rede pública não será roteado corretamente para contornar a interface de 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:

  1. ip route list table main default

Você receberá uma saída como a seguinte:

Output
default 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 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:

  1. ip -brief address show eth0

Você receberá uma saída semelhante à seguinte:

Output
eth0 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 destacado 203.0.113.5 (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.

  1. sudo nano /etc/wireguard/wg0.conf

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 quaisquer entradas de roteamento na tabela numerada 200 quando o IP corresponde ao endereço público do sistema 203.0.113.5.
  • PostUp = ip route add table 200 default via 203.0.113.1 – Este comando garante que qualquer tráfego processado pela tabela 200 usará o gateway 203.0.113.1 para roteamento, em vez da interface WireGuard.

As linhas PreDown removem a regra e a rota personalizadas 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 depois referenciando o nome em vez do valor numérico.

Para obter mais informações sobre como funcionam as tabelas de roteamento no Linux, visite a Seção de Tabelas de Roteamento do Guia de Administração de Rede da Camada IP com Linux.

Se estiver roteando todo o tráfego do par sobre a VPN, certifique-se de ter configurado corretamente as regras sysctl e 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 estiver a utilizar o Servidor WireGuard como um gateway VPN para todo o tráfego dos seus pares, precisará de adicionar uma linha à secção [Interface] que especifique os resolvedores DNS. Se não adicionar esta configuração, então os seus pedidos DNS podem não estar seguros pela VPN, ou podem ser revelados ao seu Provedor de Serviços de Internet ou a outras partes terceiras.

Se estiver apenas a utilizar o WireGuard para aceder a recursos na rede VPN ou numa configuração peer-to-peer, pode ignorar esta secção.

Para adicionar resolvedores DNS à configuração do seu par, primeiro determine quais servidores DNS o seu Servidor WireGuard está a utilizar. Execute o seguinte comando no Servidor WireGuard, substituindo o nome do dispositivo Ethernet pelo seu em vez de eth0 se for diferente deste exemplo:

  1. resolvectl dns eth0

Deverá receber uma saída como a seguinte:

Output
Link 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á a utilizar. Pode escolher usar qualquer um deles, ou apenas IPv4 ou IPv6, dependendo das suas necessidades. Tome nota dos resolvedores que irá usar.

Em seguida, precisará de adicionar os resolvedores escolhidos ao ficheiro de configuração do Par WireGuard. Voltando ao Par WireGuard, abra o ficheiro /etc/wireguard/wg0.conf usando o nano ou o seu editor preferido:

  1. sudo nano /etc/wireguard/wg0.conf

Antes da linha [Peer], adicione o seguinte:

DNS = 67.207.67.2 2001:4860:4860::8844

[Peer]
. . .

Novamente, dependendo da sua preferência ou requisitos para IPv4 e IPv6, pode editar a lista de acordo com as suas necessidades.

Uma vez conectado à VPN no próximo 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 você executou no servidor. Você deve receber uma saída como a seguinte, mostrando os resolvedores DNS que você configurou para o túnel VPN:

Output
Global: 67.207.67.2 67.207.67.3 . . .

Com todas essas configurações de resolvedor DNS no lugar, você está pronto para adicionar a chave pública do par ao servidor e então 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á se conectar e rotear o tráfego pela VPN. Sem concluir 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:

  1. sudo cat /etc/wireguard/public.key
Output
PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=

Agora faça login no servidor WireGuard e execute o seguinte comando:

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2

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 dois pares podem ter a mesma configuração de allowed-ips.

Se você deseja atualizar o allowed-ips para um par existente, pode executar o mesmo comando novamente, mas altere os endereços IP. Múltiplos endereços IP são suportados. Por exemplo, para alterar o Par 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:

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd24:609a:6c18::2

Depois de executar o comando para adicionar o par, verifique o status do túnel no servidor usando o comando wg:

  1. sudo wg
Output
interface: 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 Par WireGuard e os endereços IP, ou intervalos de endereços que ele pode 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 Par 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.

Já que você pode querer que a VPN esteja ativada apenas para casos de uso específicos, 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 Passo 6 — Iniciando o Servidor WireGuard em vez de usar o comando wq-quick.

No caso de estar roteando todo o tráfego pela VPN e ter configurado o redirecionamento de DNS, será necessário instalar o utilitário resolvconf no Peer WireGuard antes de iniciar o túnel. Execute o seguinte comando para configurar isso:

  1. sudo apt install resolvconf

Para iniciar o túnel, execute o seguinte no Peer WireGuard:

  1. sudo wg-quick up wg0

Você receberá uma saída semelhante à 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 os 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 será semelhante à 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, correspondentes aos AllowedIPs na configuração do peer.

Você pode verificar o status do túnel no peer usando o comando wg:

  1. sudo wg
Output
interface: 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 o 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 resolvedores 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.

  1. ip route get 1.1.1.1
Output
1.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:

  1. ip -6 route get 2606:4700:4700::1111
Output
2606: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 o seu par tiver um navegador instalado, você também pode visitar ipleak.net e ipv6-test.com para confirmar se o seu par está roteando seu tráfego pela VPN.

Quando estiver pronto para desconectar da VPN no par, use o comando wg-quick:

  1. sudo wg-quick down wg0

Você receberá uma saída como a seguinte, indicando que o túnel VPN está desconectado:

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 que você escolheu para a VPN), então sua saída se parecerá com o 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, garantindo substituir a chave pública correta pelo par que deseja remover:

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove

Normalmente, só será necessário remover uma configuração de par se o par não existir mais, ou se suas chaves de criptografia forem comprometidas ou alteradas. Caso contrário, é melhor deixar a configuração no lugar para que o par possa se reconectar à VPN sem precisar adicionar sua chave e allowed-ips cada vez.

Conclusão

Neste tutorial, você instalou o pacote e as ferramentas WireGuard nos sistemas Ubuntu 22.04 do servidor e do cliente. 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. Aprendeu como gerar chaves de criptografia WireGuard privadas e públicas e como configurar o servidor e o par (ou pares) para se conectarem entre si.

Se sua rede usar IPv6, também aprendeu como gerar uma faixa de endereços locais exclusiva para usar com conexões de pares. Por fim, aprendeu como limitar quais tráfegos devem 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 contêineres, visite a documentação oficial do WireGuard.

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-wireguard-on-ubuntu-22-04