Creación de una VPN de acceso remoto con WireGuard
- Javi Huete
- Seguridad
- January 29, 2025
Índice
En este escenario un servidor VPN permite el acceso a un equipo conectado a su red interna a los clientes conectados a él a través de la red VPN.
El escenario queda configurado de la siguiente forma:

Instalación de WireGuard
Para instalar WireGuard en Debian 12 se puede usar el paquete wireguard
incluido en los repositorios de la distribución.
sudo apt update
sudo apt install wireguard
Creación de las claves
La VPN necesita un par de claves para identificar al servidor frente a los clientes. Para generarlo, se pueden usar las herramientas que se instalan con el paquete wireguard
. Este par de claves se alamacena en el directorio /etc/wireguard del servidor.
wg genkey > private
cat private | wg pubkey > publickey
Configuración del servidor VPN
En el servidor se debe establecer la configuración necesaria para permitir el enrutamiento de paquetes. Para ello, en el fichero /etc/sysctl.conf se descomenta la siguiente línea:
net.ipv4.ip_forward = 1
Y después se aplican los cambios.
sysctl -p
A continuación, se debe crear la interfaz virtual que usará WireGuard para establecer la red VPN. Existen varias alternativas para establecer esta configuración. De forma temporal se puede hacer con los comandos ip l
e ip a
junto a la herramienta wg
incluida en el paquete wireguard
. Usando el método tradicional, se puede configurar en el fichero /etc/network/interfaces pero desde la versión 237, systemd incluye soporte para configurar las VPN de WireGuard. Esta configuración se establece en una unidad de systemd de tipo .netdev
en el directorio /etc/systemd/network/ y, a partir de esta unidad, se debe crear también otra de tipo .network
en el mismo directorio. Sin embargo, la opción persistente más sencilla es definir esta unidad en un fichero de configuración propio dentro del directorio /etc/wirguard.
[Interface]
Address = 10.99.99.1
PrivateKey = SG9uVVohWxX396k6pateLErGyuJqOLNDiG1V9ewuflY=
ListenPort = 51820
[Peer]
Publickey = Dfcin5MIdoNQgYP9KpsSm4vNe6kBalF4OjJkFcUFfG0=
AllowedIPs = 10.99.99.2/24
PersistentKeepAlive = 25
En este fichero se incluye, en primer lugar, la definición de la interfaz ([Interface]
), en la que se especifica su dirección IP, la clave privada del servidor y el puerto de escucha. En este caso, se mantiene el puerto de escucha por defecto de Wireguard, el 51820.
A continuación, se incluye la información que define la conexión con el cliente ([Peer]
), incluyendo la clave pública del cliente, la IP desde la que se puede establecer la VPN desde el cliente y el tiempo durante el cual el túnel VPN sigue funcionando mientras no haya tráfico entre ambos extremos.
Igualmente, existen varias formas de levantar la interfaz. El paquete wireguard
ofrece una herramienta que permite levantar la interfaz de manera rápida y sencilla: wg-quick
:
root@debian:/etc/wireguard# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
Warning: AllowedIP has nonzero host part: 10.99.99.2/24
[#] ip -4 address add 10.99.99.1 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] ip -4 route add 10.99.99.0/24 dev wg0
Al levantar y configurar esta nueva interfaz virtual se crea la interfaz wg0
:
4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.99.99.2/24 scope global wg0
valid_lft forever preferred_lft forever
Y, además, se crea la ruta necesaria para dirigir el tráfico al servidor a través de la VPN.
root@debian:/etc/wireguard# ip r
default via 192.168.122.1 dev ens4
10.99.99.0/24 dev wg0 proto kernel scope link src 10.99.99.2
192.168.122.0/24 dev ens4 proto kernel scope link src 192.168.122.70
Configuración del cliente VPN
En el cliente también se debe crear la interfaz virtual para establecer el túnel VPN con el servidor. Esta configuración se puede hacer usando las mismas opciones listadas en el apartado anterior.En este caso, el contenido del fichero de configuración de la interfaz es muy similar al de la interfaz del servidor.
[Interface]
Address = 10.99.99.2/24
PrivateKey = 8BjZyjtUg+5IWiDMcp4rpy5MRrFY5Sc9oAjIyAGNHUk=
ListenPort = 51820
[Peer]
PublicKey = pX17efJapqPoef5dGrQKZBduutknEuOUjBkPMyFyJWI=
AllowedIPs = 0.0.0.0/0
Endpoint = 90.0.0.2:51820
PersistentKeepalive = 25
En este caso, el apartado [Interface]
del fichero de configuración recoge la dirección IP de la interfaz, la clave privada del cliente y el puerto de escucha y el apartado [Peer]
incluye la clave pública del servidor, las direcciones IP desde las que se pueden establecer las conexiones VPN con el cliente, la IP del otro extremo de la VPN en el servidor y el tiempo durante el que el túnel VPN sigue funcionando mientras no haya tráfico entre ambos extremos.
Tras configurar la interfaz, el comando wg-quick
permite levantarla y configurar las rutas necesarias para el funcionamiento de la VPN.
root@debian:/etc/wireguard# wg-quick up wg0
[#] ip link add wg0 type wireguard
[ 1160.345197] wireguard: WireGuard 1.0.0 loaded. See www.wireguard.com for information.
[ 1160.346867] wireguard: Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.99.99.2/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] wg set wg0 fwmark 51820
[#] 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
Tras haber completado correctamente la configuración de la VPN, desde el cliente se puede establecer conexión con las máquinas internas conectadas a la red privada del servidor.
root@debian:/etc/wireguard# ping -c4 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=63 time=4.39 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=63 time=0.963 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=63 time=2.73 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=63 time=1.48 ms
--- 10.0.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 0.963/2.391/4.392/1.321 ms
Con el comando traceroute
se comprueba, además, que el tráfico se enruta a través de la VPN.
root@debian:/etc/wireguard# traceroute 10.0.0.2
traceroute to 10.0.0.2 (10.0.0.2), 30 hops max, 60 byte packets
1 10.99.99.1 (10.99.99.1) 1.146 ms 1.143 ms 2.143 ms
2 10.0.0.2 (10.0.0.2) 3.978 ms 4.137 ms 4.280 ms