Configure uma VPN auto-hospedada usando Wireguard
Uma VPN (Virtual Private Network) permite que o usuário se conecte a uma rede privada remotamente, como se o computador do usuário estivesse diretamente conectado à rede privada. A tecnologia foi desenvolvida inicialmente para permitir o acesso remoto à rede privada interna de uma empresa, para os funcionários que não estão efetivamente presentes no local da rede interna.
Um servidor VPN é implantado no local da rede interna. Este servidor está na rede pública e pode ser acessado por meio de um cliente VPN pelo funcionário. A autenticação é necessária para se conectar ao servidor VPN. A comunicação entre o servidor VPN e o cliente VPN é protegida por meio de um protocolo de túnel. Observe que essa comunicação pode ou não ser criptografada, mas geralmente na maioria dos protocolos VPN ela é criptografada.
Outro uso da VPN é obter anonimato ao acessar a Internet ou contornar as restrições geográficas impostas ao acessar alguns sites. Nesses casos, a rede à qual o usuário deseja se conectar não é uma rede privada, mas sim a Internet.
Muitos protocolos VPN foram desenvolvidos ao longo dos anos. Esses protocolos fazem uso de diferentes protocolos de encapsulamento e algoritmos de criptografia para a comunicação entre o servidor e o cliente.
Um desses protocolos, que está ganhando amplo uso recentemente, é o Wireguard . O Wireguard é mais leve, mais simples e mais eficiente do que os protocolos VPN tradicionalmente usados, como OpenVPN, IPSec. Já está implementado para Windows, Mac OS e um grande número de distribuições Linux. No Linux, ele é implementado como um módulo do kernel. Ele está disponível nos repositórios oficiais do Ubuntu 20.04.
Neste artigo, veremos como configurar um servidor e cliente VPN Wireguard no Ubuntu 20.04.
Instalação
Para este artigo, estou configurando um servidor Wireguard em um Linode Ubuntu 20.04 e um cliente Wireguard em minha máquina local com Ubuntu 20.04.
O pacote wireguard
instala o servidor e o cliente Wireguard. Execute o seguinte comando na máquina do servidor e na máquina do cliente.
sudo apt install wireguard
Configuração do Servidor
Chaves de Segurança
Precisamos gerar um conjunto de pares de chaves públicas / privadas para autenticar e proteger a conexão Wireguard. Isso pode ser feito usando os seguintes comandos:
sudo su
cd /etc/wireguard
umask 077
wg genkey | tee private_key | wg pubkey > public_key
Observe que estamos realizando todas as tarefas de configuração como superusuário. A razão é que o acesso ao diretório /etc/wireguard
é impedido para usuários normais e o acesso ao diretório não pode ser obtido apenas com privilégios sudo para um usuário normal.
Em seguida, definimos a máscara de criação de arquivo como077
. Isso significa que sempre que um novo arquivo é criado nesta pasta por qualquer processo, suas permissões serão automaticamente mascaradas com 077. Ex. se um arquivo for criado nesta pasta com as permissões 777, ele será mascarado automaticamente e as permissões passarão a ser 700. Isso é feito para que apenas o proprietário do arquivo tenha todas as permissões no arquivo e todos os outros não tenham permissões.
Na próxima linha, geramos o par de chaves pública / privada para o servidor. Eles são salvos em arquivos private_key
e public_key
. Para ver as chaves, execute:
cat private_key
cat public_key
Copie a chave privada, precisamos dela na próxima etapa.
Nota: Nunca compartilhe sua chave privada publicamente!
Arquivo de configuração
Vamos criar um arquivo de configuração para o servidor Wireguard. Você pode escolher qualquer nome para o arquivo. Vamos criar um arquivo wg0.conf
neste exemplo.
vim wg0.conf
Adicione o seguinte ao arquivo.
[Interface]
Address = 10.20.43.1/24
SaveConfig = true
ListenPort = 51190
PrivateKey =
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o -j MASQUERADE
Cole a chave privada que copiamos anteriormente na linha 5 do código acima.
Temos que configurar o Wireguard em uma sub-rede (virtual) diferente do endereço IP do servidor. Aqui, usei 10.20.43.1 para o servidor e irei usar 10.20.43.2 para o cliente. Qualquer sub-rede pode ser usada aqui. Para obter o endereço IP do servidor e a interface, execute:
ifconfig
A parte destacada é o endereço IP
Observe o endereço IP do servidor. Isso é necessário durante a configuração do cliente.
A interface utilizada pelo servidor, conforme imagem acima, é eth0
. O nome da interface pode variar de acordo com a rede do usuário, pode ser wlan0
ou wlp2s0
caso o usuário esteja conectado a uma rede WiFi usando uma placa sem fio.
Substitua em PostUp
e PostDown
por sua interface; neste exemplo, é eth0
. PostUp
e as PostDown
diretivas são usadas para especificar quais comandos devem ser executados quando o servidor é iniciado e interrompido, respectivamente. Em nosso exemplo, usamos o iptables
comando para definir regras de IP de forma que o endereço IP do servidor seja compartilhado pelos clientes. As regras cairão assim que o servidor parar.
Salve e saia do arquivo. Ao usar o vim, pressione Esc , digite :wq
e pressione Enter para salvar e sair.
Se você estiver usando um ufw
firewall no servidor, precisamos permitir conexões UDP à porta do servidor VPN, 51190.
ufw allow 51190/udp
Iniciando o serviço
Agora que a configuração está feita, podemos iniciar o serviço VPN Wireguard.
Para permitir que o serviço seja iniciado no momento da inicialização, execute:
systemctl enable [email protected]
Observe que aqui wg0
está o nome do arquivo de configuração.
Para iniciar o serviço, execute:
service [email protected] start
Verifique se o serviço foi iniciado com sucesso:
service [email protected] status
Verifique se a interface que criamos no arquivo de configuração foi iniciada, usando o comando IP.
ip a show wg0
O Wireguard VPN Server agora está configurado e funcionando. Vamos configurar o cliente agora.
Configuração de Cliente
A configuração do cliente para Wireguard é mais ou menos igual à configuração do servidor. Geramos as chaves para o cliente e, a seguir, criamos um arquivo de configuração.
Chaves de Segurança
Para gerar o par de chaves pública / privada para o cliente, execute:
sudo su
cd /etc/wireguard
umask 077
wg genkey | tee client_private_key | wg pubkey > client_public_key
As chaves públicas e privadas para o cliente agora são geradas respectivamente em arquivos client_private_key
e client_public_key
.
Verifique se eles foram criados, usando o cat
comando.
cat client_private_key
cat client_public_key
Copie a chave privada exibida, pois precisamos adicioná-la ao arquivo de configuração do cliente.
Arquivo de configuração
Crie o arquivo de configuração com qualquer nome que desejar. Estaremos criando com o nome wg0-client
para este exemplo.
vim wg0-client.conf
Adicione a seguinte configuração.
[Interface]
# IP Address and Private Key of the Client
Address = 10.20.43.2/24
PrivateKey =
[Peer]
# Public key, IP Address and Port of the Server
PublicKey =
Endpoint = :51190
AllowedIPs = 0.0.0.0/0, ::/0
Digite o endereço de sub-rede do cliente. Conforme descrito anteriormente, usamos 10.20.43.2
para o cliente neste exemplo.
Adicione a chave privada do cliente gerada na etapa anterior na linha 4 no código de configuração acima.
Em 'Peer', adicionamos informações sobre o servidor VPN Wireguard ao qual queremos nos conectar.
Insira a chave pública do servidor. Insira o endereço IP do servidor , que observamos anteriormente, e a porta no formato fornecido em relação ao Endpoint . Esta é a porta que especificamos no arquivo de configuração do servidor e na qual o serviço VPN no servidor foi iniciado.
Os IPs permitidos devem ser inseridos conforme fornecido (0.0.0.0/0) para que qualquer solicitação em um IP público dinâmico usado pelo cliente sempre encaminhe para o servidor VPN.
Salve e saia do arquivo. Ao usar o vim, pressione Esc , digite :wq
e pressione Enter para salvar e sair.
Enable the client service to run with every boot, and start it.
systemctl enable [email protected]
service [email protected] start
Verify if the service has started.
service [email protected] status
Adding Peer to the Server
Now we have the VPN server and client up and running. However, a secure tunnel between the two is not established unless we establish a peer to peer connection between the server and client.
Go back to the server. First, stop the VPN service.
service [email protected] stop
Next, open the configuration file to add configuration for the peer (client).
vim /etc/wireguard/wg0.conf
Append the following lines to the file.
[Peer]
PublicKey =
AllowedIPs = 10.20.43.2/32
Now, start the VPN service again.
service [email protected] start
That’s it! This is all the configuration needed for Wireguard VPN client and server setup. Let’s now test our VPN.
Testing the VPN
First, let’s do a simple ping from the client to the server, to make sure the VPN tunnel communication works. Run the following on the client:
ping 10.20.43.1
Next, open a web browser and open any website to check if you are able to connect to the Internet from the client machine. You can also check your internet connectivity from the command line using wget
.
wget
Now, we have checked the tunnel connectivity and the Internet connectivity. If both are working, we now need to make sure that all internet traffic coming to client is passing through the server.
For this, we simply need to check the IP Address of the client as seen by the Internet. One way to do it is to go to whatsmyip.org. Or else from the command line, we can query another similar service called IP info, using Curl.
Run the following on the client machine
curl https://ipinfo.io/ip
Yes. It is the public IP Address of the Linode where the VPN server is hosted. This is how anonymity is achieved using VPN, since all over the Internet now the IP of the VPN server is seen and not of your computer.
Conclusion
The ease of setup is one of the most important advantages of Wireguard over traditional VPN software like OpenVPN, which needs a higher level of networking and routing knowledge to set up. However, there is a lack of detailed official documentation for Wireguard which might cause problems if your Wireguard setup is throwing errors or not working as expected.
Nevertheless, Wireguard is an excellent choice if you want a self hosted VPN for secure communication over the Internet. To learn more about Wireguard and the protocols and technologies it uses, you can check out the official site.