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:
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:
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:
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:
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 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.
Você receberá uma saída como a seguinte:
/var/lib/dbus/machine-id610cef4946ed46da8f71dba9d66c67fb
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:
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 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:
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:
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 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 Prefixfd24: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:
-
Certifique-se de ter a chave privada disponível do Passo 1 — Instalando o WireGuard e Gerando um Par de Chaves.
-
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
. -
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:
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:
Se estiver a usar IPv4 com o WireGuard, adicione a seguinte linha no final do ficheiro:
net.ipv4.ip_forward=1
Se estiver a usar IPv6 com o WireGuard, adicione esta linha no final do ficheiro:
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:
Outputnet.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
:
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:
Outputdefault 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.
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 VPNwg0
para a interface de redeeth0
no servidor. Ela funciona em conjunto com os valores sysctlnet.ipv4.ip_forward
enet.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 VPNwg0
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 VPNwg0
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:
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:
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)
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
:
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:
Verifique duplamente se o serviço WireGuard está ativo com o seguinte comando. Você deverá 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 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:
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:
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:
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:
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
:
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 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 semelhante à 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 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.
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 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 processado pela tabela200
usará o gateway203.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:
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á 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:
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:
OutputGlobal: 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:
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 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:
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 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:
Para iniciar o túnel, execute o seguinte no Peer WireGuard:
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
:
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 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
.
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 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
:
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:
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