Como configurar o wireguard
Nesse artigo estarei explicando como funciona o wireguard, como configurar um servidor vpn, como configurar um client vpn.
Oque é o wireguard?
O wireguard é uma ferramenta opensource para criar VPNs, tunnels, entre outros, o processo de configuração do wireguard é bem manual e em alguns casos é necessário usar regras de firewall.
Como configuro um servidor VPN com Wireguard
O wireguard não utiliza sistemas de usuário e senha, ele usa um sistema de chaves públicas e privadas, cada usuário conectado a rede tem uma chave privada, e a chave pública correspondente deve ser informado no servidor principal.
Vamos entender a configuração do wireguard, a baixo veremos um arquivo de configuração.
[Interface]
Address = 10.7.0.1/24
PrivateKey = GIPKfUjt63bB/cXoznFO4T55hDBu+C4u5PtJdDaRgm4=
ListenPort = 51820
[Peer]
# Chave pública do client
PublicKey = gN65BkIKy1eCE9pP1wdc8ROUtkHLF2PfAqYdyYBz6EA=
AllowedIPs = 10.7.0.2/32
[Interface] é a configuração da interface de rede, no caso estamos configurado como servidor, então teremos que informar a porta que essa interface irá escutar, no exemplo a porta é 51820.
[Peer] é o par que irar se conectar a rede, com isso podemos autenticar e informar quais ips o usuário pode atribuir a ele mesmo.
A baixo veremos o mesmo arquivo de configuração para o client.
[Interface]
Address = 10.7.0.2/24
PrivateKey = KGb9dhtkF/I6+A8fp/DjDNQGVBWcYyNuz9Ke6okfcHo=
[Peer]
# Chave pública do servidor
PublicKey = fVeXnp3uRVvF5jYchH5b1bsgizBf5veBLEPBU58zoAQ=
AllowedIPs = 0.0.0.0/0
Endpoint = exemplo.ip.externo:51820
Pode-se notar que nessa configuração a função da interface inverteu, agora ele serve para indentificar o client, e o peer serve para identificar e se conectar com o servidor.
Em AllowedIPs também perdeu sua função inicial, no servidor ele tem a função de definir qual endereço ip o client terá acesso, no client vc irá definir quais ip irão passar pela vpn, ao definir 0.0.0.0/0 você esta informando que todos os ips da sua rede irão trafegar pela vpn.
Wireguard na prática.
Primeiro temos que instalar o wireguard, para isso basta executar os seguintes comandos. (debian/ubuntu)
sudo apt install wireguard
Vamos conhecer os comandos para gerar a chave privada e obter a chave pública a partir da chave privada.
Lembrando que o servidor terá sua chave privada diferentes de todos os clients.
# Gerando chave privada
wg genkey
# Obtendo chave pública
echo 'chave_privada_aqui' | wg pubkey chave_privada_aqui
Gere uma chave privada para o servidor e para o client, ex:
wg genkey
# Saída: GIPKfUjt63bB/cXoznFO4T55hDBu+C4u5PtJdDaRgm4=
echo 'GIPKfUjt63bB/cXoznFO4T55hDBu+C4u5PtJdDaRgm4=' | wg pubkey
# Saída: 5D+br5dC65SS1v5Cagdxu5a+X+bsQAQwIe4Mj5lGnVw=
Repita o processo para o client.
Após isso basta seguir o padrão do arquivo informando anteriormente.
[Interface]
Address = 10.7.0.1/24
PrivateKey = chave_privada_1
ListenPort = 51820
[Peer]
PublicKey = chave_publica_2
AllowedIPs = 10.7.0.2/32
[Interface]
Address = 10.7.0.2/24
PrivateKey = chave_privada_2
[Peer]
PublicKey = chave_publica_1
AllowedIPs = 0.0.0.0/0
Endpoint = exemplo.ip.externo:51820
O arquivo deve ser armazenado na pasta /etc/wireguard com o nome /wg0.conf.
O arquivo deve ter o mesmo nome tanto para o client quanto para o servidor.
Para habilitar a rede basta executar o seguinte comando.
wg-quick up wg0
Para habilitar a inicialização automática basta executar.
systemctl enable --now wg-quick@wg0.service
Lembrando que o processo no Windows deve ser feito na interface gui do programa wireguard.
No windows a chave privada é gerada automáticamente e a chave pública será informada a cima da privada.
Regras de firewall.
Vimos até aqui que o wireguard permite conectar duas redes pública em um tunnel privado, agora como faremos com que todos o trafego da rede passe pelo servidor?
Bom para isso precisamos de algumas regras de firewall, se você não quiser se aprofundar muito basta criar um serviço no servidor linux para o wireguard, para executar os seguintes comandos assim que o servidor for iniciado.
Na pasta /etc/systemd/system/ crie um arquivo chamado wg-iptables.service.
Copie os seguintes comandos.
[Unit]
Before=network.target
[Service]
Type=oneshot
ExecStart=/usr/sbin/iptables -t nat -A POSTROUTING -s 10.7.0.0/24 ! -d 10.7.0.0/24 -j SNAT --to 192.168.0.101
ExecStart=/usr/sbin/iptables -I INPUT -p udp --dport 51820 -j ACCEPT
ExecStart=/usr/sbin/iptables -I FORWARD -s 10.7.0.0/24 -j ACCEPT
ExecStart=/usr/sbin/iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
ExecStop=/usr/sbin/iptables -t nat -D POSTROUTING -s 10.7.0.0/24 ! -d 10.7.0.0/24 -j SNAT --to 192.168.0.101
ExecStop=/usr/sbin/iptables -D INPUT -p udp --dport 51820 -j ACCEPT
ExecStop=/usr/sbin/iptables -D FORWARD -s 10.7.0.0/24 -j ACCEPT
ExecStop=/usr/sbin/iptables -D FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Lembre-se de mudar o ip 192.168.0.101 para o endereço ipv4 do seu servidor, essas regras vão mascarar a saída da interface wireguard para o ip do servidor, isso irá permitir o tunnel, caso a conexão seja apenas local usando os ips do wireguard essa configuração não é necessária.
A configuração usada nesse artigo explica apenas como configurar tudo em ipv4, para configurar um tunnel ipv6 o processo será diferente.
Referencias: wireguard.com
, script de instalação
O script de instalação facilita o processo de configuração e instalação do wireguard no servidor criando o serviço wg-iptables.service automático.
Caso tenha ficado alguma dúvida peço que responda a publicação a baixo.