¿Qué es WireGuard?
Es una nueva manera de establecer conexiones privadas, usando nuevos métodos criptográficos que permiten una mayor eficiencia y fluidez del trafico, pudiendo alcanzar mayores velocidades de conexión en un hardware más austero, inicialmente fue desarrollado para integrarse en el Kernel de Linux, aunque cada vez se esta extendiendo a más plataformas.
Al estar integrado en el sistema, permite mayor elasticidad en la configuración de redes, rutas y reglas de firewall, a la vez que simplifica el proceso de configuración y gestión de los servicios VPN. También se empieza a encontrar integrado en routers con OpenWRT, Ubiquiti y se pretende integrar también en RouterOS, por lo que es una alternativa a OpenVPN que merece la pena ser tomada en consideración.
¿Cómo instalar WireGuard?
Actualmente esta disponible para múltiples plataformas basadas en Unix, aunque se esta desarrollando también una versión para Windows, actualmente y de manera oficial existe para Linux, FreeBSD, macOS, Android y IOS entre otros muchos.
Puedes consultar como instalar WireGuard en su web https://www.wireguard.com/install/
Configurando el servidor de WireGuard en linux
Primero de todo debemos crear una carpeta wireguard en /etc/wireguard
y dentro de ella un fichero con el nombre de la interfaz de red para WireGuard, por ejemplo wg0.conf
mkdir /etc/wireguard && cd /etc/wireguard
bash -c 'umask 077; touch wg0.conf'
A continuación debemos crear una interfaz de red para WireGuard, en este ejemplo se denominara wg0, se debe declarar como tipo WireGuard y establecer una IP privada para la VPN.
ip link add dev wg0 type wireguard
ip addr add dev wg0 10.0.0.1/24
Por último debemos levantar el servicio y generar una llave privada que solo el servidor deberá conocer, pues a los clientes se les debe facilitar una llave pública, generada a partir de esta llave privada.
wg set wg0 listen-port 51820 private-key <(wg genkey)
Una vez levantado el servicio procedemos a guardar la configuración en el fichero anteriormente generado en /etc/wireguard/wg0.conf para ello existe la siguiente utilidad que lo permite hacer automáticamente
wg-quick save wg0
Podemos revisar la configuración del fichero
cat wg0.conf
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = iHttyqFa88iy817ZsIXB8FE/EsLoowVCRSR0RnJd6UQ=
Ahora solo nos falta conocer la llave pública para añadirla a los clientes, con el comando wg, podemos ver el estado de las interfaces de WireGuard y nos va a mostrar la llave pública
wg
interface: wg0
public key: pLUN+t1V+exuWH9e8ETrrP9EqE4RTvgV6PN7dguTrQU=
private key: (hidden)
listening port: 51820
Para que el servidor VPN se levante como servicio cada vez que iniciamos el sistema debemos añadirlo como servicio
systemctl start wg-quick@wg0.service
Configurando el cliente de WireGuard en linux
Todo el proceso es muy similar al servidor, al igual debemos crear una carpeta wireguard en /etc/wireguardy dentro de ella un fichero con el nombre de la interfaz de red para WireGuard, por ejemplo wg0.conf
mkdir /etc/wireguard && cd /etc/wireguard
bash -c 'umask 077; touch wg0.conf'
También debemos crear una interfaz de red
ip link add dev wg0 type wireguard
ip addr add dev wg0 10.0.0.2/24
Por último debemos levantar el servicio y generar una llave privada que solo el cliente deberá conocer, pues al servidor se le debe facilitar una llave pública, generada a partir de esta llave privada y a diferencia del servidor no le vamos a indicar un puerto de escucha, pues generalmente el cliente va a estar detrás de una NAT y no se van a abrir puertos para el.
wg set wg0 private-key <(wg genkey)
Podemos revisar la configuración del fichero
cat wg0.conf
[Interface]
Address = 10.0.0.2/24
PrivateKey = wCFZU9SDhS8a1fii1nOnJ+ylaJg2RTnhVRZJktjvjUg=
Ahora solo nos falta conocer la llave pública para añadirla al servidor, con el comando wg
wg
interface: wg0test
public key: zA2kElEnt/zv0tXW+p5q03AWZ2KNJ5F596uE/ziMxnE=
private key: (hidden)
Hasta aquí la configuración es muy similar a la del servidor, con la diferencia de que no se va a levantar un servicio de escucha en ningún puerto. Ahora falta que el cliente sepa como llegar al servidor, para ello debemos recurrir al fichero generado wg0.conf y añadir la configuración del servidor, IP pública y puerto en el que se encuentra el servicio de WireGuard, también las IP de destino que queremos que se encaminen por la VPN, esto es muy interesante, pues podemos definir varios rangos e incluso todos los rangos mediante 0.0.0.0/0, también podemos forzar que la conexión se mantenga activa monitorizando cada N segundos el estado.
Añadimos las siguientes lineas en wg0.conf
[Peer]
PublicKey = la llave pública del servidor
Endpoint = ip.del.servidor.vpn:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 15
Para aplicar esta nueva configuración debemos reiniciar la conexión
wg-quick down wg0
[#] ip link delete dev wg0
wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip address add 10.0.0.2/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
Siempre que queramos levantar la VPN deberemos usar el comando wg-quick up wg0 si queremos que se levante con el inicio del sistema debemos ejecutarlo como servicio
systemctl start wg-quick@wg0.service
Añadimos el cliente en el servidor
Al igual que en el cliente, debemos añadir el cliente como Peer en el servidor, para ello modificamos el fichero wg0.com y añadimos las siguientes lineas
[Peer]
PublicKey = la llave pública del cliente
AllowedIPs = 10.0.0.2/32
Debemos aplicar la nueva configuración reiniciando la conexión
wg-quick down wg0
[#] ip link delete dev wg0
wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip address add 10.0.0.1/24 dev wg0
[#] ip link set mtu 1420 up dev wg0
Andres dice
Muy buen articulo, ¿pero no haces la configuración en el servidor PostDown y UpDown?