WireGuard es una de las VPN mas eficientes que existen para linux. Su sistema se basa en pares de claves(como en el SSH) lo que para nosotros seria como un "certificado".
En esta guia tambien se configurara su integracion con nftables..
Instalamos el software necesario:
sudo apt install nftables install wireguard wireguard-tools Editar el sysctl.conf para permitir redireciones de trafico a nivel kernel.
- nano /etc/sysctl.confDescomentar dependiendo si usamos IPv4 o IPv6:
net.ipv4.ip_forward = 1
#net.ipv6.conf.all.forwarding=1Una vez guardado, aplicar cambios con:
sysctl -pPor defecto nftables viene vacio completamente.
Este fichero es el nucleo de nuestro firewall, comprenderlo nos dara un profundo conocimiento sobre la seguridad y el comportamiento de nuestra maquina ya que todo pasara por aqui.
Habra que especificar todos aquellos servicios que queramos permitir, se han añadido comentados algunos como el ping o el SSH. He creado esta estructura basica para que wireguard pueda usarlo
Creamos el fichero /etc/nftables.conf:
sudo nano /etc/nftables.confModificar plantilla al gusto:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# Permitir conexiones ya establecidas o relacionadas
ct state established,related accept
# Permitir trafico en la interfaz local (loopback)
iifname "lo" accept
# WireGuard (permitir UDP para WireGuard en el puerto 51820)
udp dport 51820 ct state new limit rate 10/minute counter accept
# Permitir ICMP (ping) - solo echo-request y echo-reply
# ip protocol icmp icmp type { echo-request, echo-reply } accept
# [Opcional] Permitir conexiones TCP (puerto 22) y limitar nuevas conexiones a 10 por minuto añadiendolas a un contador
# tcp dport 22 ct state new limit rate 10/minute counter accept
# [Opcional] Permitir conexiones aolo SSH (puerto 22) y limitar nuevas conexiones a 10 por minuto añadiendolas a un contador
# tcp dport 22 ct state new tcp flags syn limit rate 4/minute counter accept
}
chain forward {
type filter hook forward priority 0; policy drop;
# Permitir trafico entre WireGuard y la red local
iifname "wg0" oifname "enP3p49s0" accept # Cambia "eth0" por tu interfaz LAN
iifname "enP3p49s0" oifname "wg0" ct state established,related accept
# Permitir trafico especifico desde 10.10.0.1 hacia 192.168.1.0/24
ip saddr 10.10.0.1 ip daddr 192.168.1.0/24 accept
}
chain output {
type filter hook output priority 0; policy accept;
}
chain nat {
type nat hook postrouting priority 100; policy accept;
ip saddr 10.10.10.0/24 oifname "eth0" masquerade
}
}sudo nft -f /etc/nftables.conf✅ Si el comando no duelve nada el fichero esta correcto. Si todo esta ok activamos el firewall
Arrancar el servicio para aplicar:
sudo systemctl start nftables.serviceComprobamos que no tiene errores:
sudo systemctl status nftables.serviceHabilitamos arranque automatico si todo esta correcto:
sudo systemctl enable nftables.serviceEn este apartado generaremos las claves necesarias para que la conexion sea posible.
- WireGuard no usa usuario y contraseña
- Funciona con pares de claves publica-privada
- Cada clave publica se crea a partir de su privada
- Las claves estan generadas en BASE-64
- Habra que crear un par para el servidor y otro para cada host que queramos conectar
- Asignaremos permisos restrictivos para no poder modificar las claves accidentalmente
- A diferencia de otras VPN, cualquiera puede ser servidor y cliente.
Tenemos 2 metodos para crear todos los certificados, mediante script o manualmente:
Para no alargar esta guia lo he alojado en otro repositorio.
- Es un Script creado por mi para facilitar la gestion diaria.
- Permite Crear certificados del servidor y cliente
- Comprueba correspondencia entre las claves publicas y privadas
- Borrar certificados del servidor y cliente
- Elimina errores manuales de gestion
Para ver el script visita el repositorio de WireGuard CertMaker Debian.
Podemos crear el par de claves a la vez o por separado, lo haremos de todas las formas posibles para fomentar su comprension.
cd /etc/wireguard/
wg genkey | tee server.key | wg pubkey > server.pub
sudo chmod 0400 /etc/wireguard/server.*📜 A continuacion desglosaremos por separado, si ya la creaste saltar al "4.3 Comprobar las claves".
Una vez instalado wireguard, ahora tendremos la herrmaienta wg para crear pares de claves.
El siguiente paso es generar los certificados del servidor.
Esto puede hacerse utilizando la herramienta de linea de comandos wg.
Ejecuta el siguiente comando para generar la clave privada del servidor wireguard en /etc/wireguard/server.key
sudo wg genkey > server.key
sudo chmod 0400 /etc/wireguard/server.keyA continuacion, ejecuta el siguiente comando para generar la clave pública del servidor wireguard en /etc/wireguard/server.pub.
sudo wg pubkey < server.key > server.pub
sudo chmod 0400 /etc/wireguard/server.pubComprobamos que contienen las claves:
cat /etc/wireguard/server.key
cat /etc/wireguard/server.pubComo wireguard por defecto viene vacio, primero crearemos una esctructura de directorios organizada donde iremos almacenando las claves de los clientes que generemos, asi podremos administrar la VPN de forma ordenada.
Todos los clientes penderan de la carpeta clients Creamos la carpeta clients
sudo mkdir /etc/wireguard/clientsDentro de la carpeta clients crearemos una por cada usuario donde se almacenaran sus claves.
sudo mkdir /etc/wireguard/clients/user1Para crear las claves el procedimiento es similar a la publica pero cambiando la ruta y el nombre de los ficheros.
Los metodos son los mismos:
cd /etc/wireguard/clients/user1
wg genkey | tee user1.key | wg pubkey > user1.pubComprobamos:
cat /etc/wireguard/clients/user/user.key
cat /etc/wireguard/clients/user/user.pubDebemos tener en cuenta las siguientes reglas:
- Cada bloque de codigo define un host
- Estos bloques iran separados por una linea en blanco
- Para el servidor pondremos la clave privada y la clave publica para los hosts
- Cada host tendra definida su clave y una IP diferente /32
- Si fallan estos pasos la VPN no funcionara correctamente
Crea una nueva configuracion de Wireguard en /etc/wireguard/wg0.conf
sudo nano /etc/wireguard/wg0.confEsto es un ejemplo del servidor con 2 usuarios configurados
[Interface]
# Wireguard Server private key - server.key
PrivateKey = cNBb6MGaKhmgllFxSq/h9BdYfZOdyKvo8mjzb2STbW8=
# Wireguard interface will be run at 10.10.0.1
Address = 10.10.0.1/24
# Clients will connect to UDP port 51820
ListenPort = 51820
# Ensure any changes will be saved to the Wireguard config file
#SaveConfig = true
[Peer]
# Wireguard first client public key - user.pub
PublicKey = 3ZoaoVgHOioZnKzCrF/XALAv70V4vyJXpl/UO7AKYzA=
# clients' VPN IP addresses you allow to connect
AllowedIPs = 10.10.0.2/32
[Peer]
# Wireguard second client public key - user2.pub
PublicKey = 54gyrteoagHOiozCrF/XtrLAv7V4vyJXpl/UO7AK36g=
# clients' VPN IP addresses you allow to connect
AllowedIPs = 10.10.0.3/32Para iniciar y habilitar el servidor wireguard, ejecuta el siguiente comando systemctl. Con el nombre de servicio wg-quick@wg0, iniciaras el Wireguard dentro de la interfaz wg0, que se basa en la configuracion /etc/wireguard/wg0.conf.
sudo systemctl start wg-quick@wg0.service
sudo systemctl enable wg-quick@wg0.serviceComprobamos:
sudo systemctl status wg-quick@wg0.serviceA continuacion, ejecuta el siguiente comando ip para mostrar los detalles de la interfaz wg0 de wireguard. Y deberias ver que la interfaz wg0 de wireguard tiene una direccion IP 10.10.0.1.
sudo ip a show wg0Tambien puedes iniciar o detener el wireguard manualmente mediante el comando wg-quick que aparece a continuacion.
sudo wg-quick up /etc/wireguard/wg0.conf
sudo wg-quick down /etc/wireguard/wg0.confAñadimos este paso en debian porque en windows no tiene mucha complicacion
sudo apt install wireguard wireguard-tools resolvconfRecuerda crear el archivo del usuario con el nombre que quieras
sudo nano /etc/wireguard/usuario.conf[Interface]
# IP del cliente dentro de la LAN VPN
Address = 10.10.0.2/24
# specific DNS Server
DNS = 8.8.8.8
# Clave privada del clietne usuario
PrivateKey = cPDg6SQHz/3l2R83lMWPzmR6/mMKnKp9PNImbtB6nGI=
[Peer]
# Public key of the Wireguard server - server.pub
PublicKey = APyBQvTkYVm0oakzcQUQViarwx1aIYz5wb/g2v2xdUE=
# Allow all traffic to be routed via Wireguard VPN
AllowedIPs = 0.0.0.0/0
# Public IP address of the Wireguard Server
Endpoint = 192.168.128.15:51820
# Sending Keepalive every 25 sec
PersistentKeepalive = 25palive = 25
