Cómo configurar WireGuard VPN en Ubuntu 22.04

Wireguard es una implementación de Red Privada Virtual (VPN) multiplataforma de código abierto que utiliza criptografía de última generación. Admite conexiones IPv4 e IPv6. Es más rápida, sencilla y funcional que los protocolos IPSec y OpenVPN. Está diseñado como una VPN de uso general para funcionar en interfaces integradas y superordenadores, y se ejecuta en Linux, Windows, macOS, iOS, Android y otras plataformas diversas.

El cifrado de Wireguard funciona utilizando claves privadas y públicas para que los pares establezcan un túnel cifrado entre ellos.

Este tutorial cubrirá cómo instalar Wireguard VPN en un servidor Ubuntu 22.04 y conectarse a él utilizando un cliente Ubuntu.

Requisitos previos

  • Un servidor que ejecute Ubuntu 22.04 admite conexiones IPv4 e IPv6.
  • Un cliente que ejecute Ubuntu 22.04 para conectarse al servidor Wireguard. Para nuestro tutorial, utilizaremos nuestra máquina local como cliente, pero puedes utilizar un servidor remoto para ello.
  • Un usuario no root con privilegios sudo.
  • El cortafuegos sin complicaciones (UFW) está activado y en ejecución.
  • Todo está actualizado.
    $ sudo apt update && sudo apt upgrade
    

Paso 1 – Instalar Wireguard y generar un par de claves

Ubuntu 22.04 incluye la última versión de Wireguard. Instala Wireguard.

$ sudo apt install wireguard

El siguiente paso es generar un par de claves privada y pública para el servidor. Crea una clave privada para el servidor utilizando el comando wg genkey.

$ wg genkey | sudo tee /etc/wireguard/private.key

Cambia los permisos para proteger la clave privada. El comando chmod go= bloquea el acceso de otros usuarios y grupos al archivo. Recibirás la clave codificada en tu terminal. Anota la clave porque será necesaria más adelante.

$ sudo chmod go= /etc/wireguard/private.key

A continuación, genera la correspondiente clave pública derivada de la clave privada. Utiliza wg pubkey para generar la clave pública. El siguiente comando consta de tres partes, en la primera se obtiene la clave privada, que es utilizada por el comando wg pubkey para generar la clave pública, que se almacena en el archivo correspondiente.

$ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

Recibirás de nuevo la clave pública en el terminal. Anótala.

Paso 2 – Elegir las direcciones IPv4 e IPv6

Tenemos que definir las direcciones IPv4 e IPv6 privadas que utilizarás con tu servidor Wireguard y tus pares.

Elegir un rango IPv4

Para utilizar Wireguard con pares IPv4, el servidor necesita un rango de direcciones IPv4 privadas para su interfaz de túnel. Puedes elegir cualquier rango de direcciones IP de entre los siguientes bloques de direcciones reservados:

  • 10.0.0.0 a 10.255.255.255 (prefijo 10/8)
  • 172.16.0.0 a 172.31.255.255 (prefijo 172.16/12)
  • 192.168.0.0 a 192.168.255.255 (prefijo 192.168/16)

Para nuestro tutorial, utilizaremos 10.8.0.0/24 como bloque de direcciones IP del primer rango de IP reservadas. Este rango permite hasta 255 conexiones entre iguales. También puedes utilizar el rango de IP privadas que te proporcione tu empresa de alojamiento.

Elegir un rango IPv6

Según el algoritmo RFC, la forma recomendada de obtener un prefijo IPv6 único es combinar la hora del día con un valor único como el ID de máquina. A continuación, esos valores se convierten en hash y se truncan para utilizarlos como dirección única dentro del bloque privado reservado fd00::/8 de IPs.

El primer paso es recopilar una marca de tiempo de 64 bits utilizando la utilidad date.

$ date +%s%N

Generará una salida similar a la siguiente, que es el número de segundos transcurridos desde la hora Unix Epoch (00:00 UTC del 1 de enero de 1970).

1659342559092041940

Anota el valor para utilizarlo más adelante. A continuación, copia el valor machine-id de tu servidor. Este valor es único para cada sistema.

$ cat /var/lib/dbus/machine-id

Obtendrás un resultado similar.

d97e195db6584d63aeedfdc35dc83c7f

A continuación, combina la marca de tiempo con machine-id y haz un hash de la cadena utilizando el algoritmo SHA-1.

printf <timestamp><machine-id> | sha1sum

Sustituye los valores <timestamp> y <machine-id> en el comando anterior. Recibirás otro valor hash.

$ printf 1659342559092041940d97e195db6584d63aeedfdc35dc83c7f | sha1sum
d789c02d9d8faef806d40ec15b307d4d9c8ec4bc  -

Ejecuta el siguiente comando para recortar la salida printf de acuerdo con el algoritmo RFC.

$ printf d789c02d9d8faef806d40ec15b307d4d9c8ec4bc | cut -c 31-

Deberías obtener la siguiente salida.

4d9c8ec4bc

En la salida anterior, el conjunto de bytes es 4d 9c 8e c4 bc. Genera la dirección IPv6 añadiendo los 5 bytes anteriores con el prefijo fd de la siguiente manera.

Utilizando los bytes generados anteriormente con el tamaño de subred /64 el prefijo resultante será el siguiente.

Unique Local IPv6 Address Prefix
fd4d:9c8e:c4bc::/64

Para asignar una IP al servidor, añade 1 después de los últimos caracteres ::. La dirección resultante será fd4d:9c8e:c4bc::1/64. Los pares utilizan la dirección IP añadiendo otro incremento como fd4d:9c8e:c4bc::2/64.

Paso 3 – Configurar Wireguard

Genera un archivo de configuración y ábrelo para editarlo.

$ sudo nano /etc/wireguard/wg0.conf

Pega en él el siguiente código. Sustituye el server_private_key por la clave privada generada en el paso 1. Puedes cambiar el puerto de escucha por el que quieras.

[Interface]
PrivateKey = server_private_key
Address = 10.8.0.1/24, fd4d:9c8e:c4bc::/64
ListenPort = 51820
SaveConfig = true

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Paso 4 – Configurar la red Wireguard

Para dirigir el tráfico del peer a través del servidor Wireguard, tienes que configurar el reenvío de IP. Abre el archivo /etc/sysctl.conf para editarlo.

$ sudo nano /etc/sysctl.conf

Descomenta las siguientes líneas eliminando el signo de almohadilla que aparece delante.

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv6
#  Enabling this option disables Stateless Address Autoconfiguration
#  based on Router Advertisements for this host
net.ipv6.conf.all.forwarding=1

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite. Comprueba los nuevos valores utilizando el siguiente comando.

$ sudo sysctl -p
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
vm.swappiness = 0

Ahora tu servidor Wireguard reenviará todo el tráfico entrante desde el dispositivo ethernet VPN a otros del servidor, y desde allí a la Internet pública. De este modo, el servidor enrutará todo el tráfico web del par a través de la dirección IP del servidor y ocultará la dirección IP del cliente.

El siguiente paso es configurar las reglas del cortafuegos para que el reenvío funcione correctamente.

Paso 5 – Configurar el cortafuegos del servidor Wireguard

Para permitir que el tráfico VPN atraviese el cortafuegos del servidor, tienes que activar el enmascaramiento que proporciona traducción dinámica de direcciones de red (NAT) sobre la marcha para enrutar las conexiones de los clientes.

Busca la interfaz de red pública de tu servidor Wireguard.

$ ip route list default
default via 209.23.8.1 dev eth0 proto static

Según el comando anterior, eth0 es la interfaz pública.

Abre el archivo de configuración de Wireguard para añadir las reglas del cortafuegos a tu servidor Wireguard.

$ sudo nano /etc/wireguard/wg0.conf

Pega las siguientes líneas en la parte inferior del archivo, después de la línea SaveConfig = true.

. . .
PostUp = ufw route allow in on wg0 out on eth0
PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on eth0
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

Las líneas PostUp se ejecutan cuando el servidor Wireguard inicia el túnel VPN. La primera regla permite reenviar tráfico IPv4 e IPv6. La segunda y la tercera regla configuran el enmascaramiento para el tráfico IPv4 e IPv6. Las líneas PreDown se ejecutan cuando el servidor Wireguard detiene el túnel VPN.

El último paso para configurar el cortafuegos es permitir el tráfico hacia y desde el puerto UDP de Wireguard. Utiliza el Cortafuegos sin complicaciones (UFW) para abrir el puerto Wireguard.

Comprueba el estado del cortafuegos.

$ sudo ufw status

Deberías ver algo como lo siguiente

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Abre el puerto 51820 configurado en el paso 1. Si utilizas otro puerto para Wireguard, ábrelo.

$ sudo ufw allow 51820/udp

Desactiva y vuelve a activar el cortafuegos UFW para cargar los cambios de todos los archivos modificados en este paso.

$ sudo ufw disable
$ sudo ufw enable

Comprueba de nuevo el estado para confirmarlo.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
51820/udp                  ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
51820/udp (v6)             ALLOW       Anywhere (v6)

Tu servidor Wireguard está configurado para gestionar el tráfico VPN, incluyendo el reenvío y el enmascaramiento para los pares.

Paso 6 – Iniciar el servidor WireGuard

Wireguard puede configurarse para ejecutarse como un servicio utilizando el script wg-quick. Habilita el servicio Wireguard.

$ sudo systemctl enable [email protected]

La parte wg0 del nombre del servicio corresponde al archivo /etc/wireguard/wg0.conf. Esto significa que puedes crear tantos túneles VPN como quieras utilizando un archivo de configuración y un servicio diferentes.

Inicia el servicio Wireguard.

$ sudo systemctl start [email protected]

Comprueba el estado del servicio.

$ sudo systemctl status [email protected]

Obtendrás una salida similar.

? [email protected] - WireGuard via wg-quick(8) for wg0
     Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
     Active: active (exited) since Mon 2022-08-01 11:35:59 UTC; 6s ago
       Docs: man:wg-quick(8)
             man:wg(8)
             https://www.wireguard.com/
             https://www.wireguard.com/quickstart/
             https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
             https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
    Process: 3935 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
   Main PID: 3935 (code=exited, status=0/SUCCESS)
        CPU: 216ms

Aug 01 11:35:58 wireguard wg-quick[3935]: [#] wg setconf wg0 /dev/fd/63
Aug 01 11:35:58 wireguard wg-quick[3935]: [#] ip -4 address add 10.8.0.1/24 dev wg0
Aug 01 11:35:58 wireguard wg-quick[3935]: [#] ip -6 address add fd4d:9c8e:c4bc::/64 dev wg0
Aug 01 11:35:59 wireguard wg-quick[3935]: [#] ip link set mtu 1420 up dev wg0
Aug 01 11:35:59 wireguard wg-quick[3935]: [#] ufw route allow in on wg0 out on eth0
Aug 01 11:35:59 wireguard wg-quick[3978]: Rule added
Aug 01 11:35:59 wireguard wg-quick[3978]: Rule added (v6)
Aug 01 11:35:59 wireguard wg-quick[3935]: [#] iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
Aug 01 11:35:59 wireguard wg-quick[3935]: [#] ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
Aug 01 11:35:59 wireguard systemd[1]: Finished WireGuard via wg-quick(8) for wg0.

Paso 7 – Instalación y configuración de un par Wireguard

Instala el cliente Wireguard en el peer basado en Ubuntu 22.04.

$ sudo apt update
$ sudo apt install wireguard

Si lo instalas en un escritorio local de Ubuntu, es probable que Wireguard esté preinstalado.

Crea el par de claves del par Wireguard

Genera un par de claves en el par de la misma forma que hiciste en el paso 1. Además, da permisos a la clave privada.

$ wg genkey | sudo tee /etc/wireguard/private.key
$ sudo chmod go= /etc/wireguard/private.key

Crea la clave pública.

$ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

Crea el archivo de configuración del par

Para crear el archivo de configuración del par necesitas lo siguiente

  • La clave privada codificada en base64 generada en el par.
  • Los rangos de direcciones IPv4 e IPv6 definidos en el servidor Wireguard.
  • La clave pública codificada base64 del servidor Wireguard.
  • La dirección IP pública y el número de puerto del servidor Wireguard. Si tu servidor y el cliente tienen una conexión IPv6, debes utilizar la dirección IPv6.

Crea y abre el archivo de configuración Peer para editarlo.

$ sudo nano /etc/wireguard/wg0.conf

Pega en él el siguiente código.

[Interface]
PrivateKey = peer_private_key
Address = 10.8.0.2/24
Address = fd4d:9c8e:c4bc::2/64

[Peer]
PublicKey = JySX9hMJFyAqZA+mNvJsArKW7yY8I7ROsQKTZZR/RH8=
AllowedIPs = 10.8.0.0/24, fd4d:9c8e:c4bc::/64
Endpoint = 209.23.10.202:51820
PersistentKeepalive = 15

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

La primera clave es la clave privada generada en el peer. La primera línea de dirección utiliza una dirección IPv4 de la subred elegida anteriormente. La segunda línea de dirección utiliza una dirección IPv6 de la subred elegida anteriormente.

La segunda clave es la clave pública generada en el servidor. El AllowedIPs utiliza los rangos IPv4 e IPv6 elegidos anteriormente, que indican al peer que sólo envíe tráfico a través de la VPN si el sistema de destino tiene una dirección IP en cualquiera de los rangos. Puedes omitir las direcciones IPv6 si sólo utilizas la conexión IPv4.

Configurar el Peer para enrutar todo el tráfico a través del Túnel

Busca la dirección IP que el sistema utiliza como pasarela por defecto. Ejecuta el siguiente comando ip route.

$ ip route list table main default

Obtendrás una salida similar.

default via 69.28.84.1 dev eth0 proto static

Anota la dirección IP de la pasarela y el nombre del dispositivo. Busca la IP pública del peer.

$ ip -brief address show eth0

Obtendrás un resultado similar.

eth0             UP             69.28.84.160/23 2607:f170:14:13::910/64 fe80::200:45ff:fe1c:54a0/64

Abre el archivo de configuración del par para editarlo.

$ sudo nano /etc/wireguard/wg0.conf

Pega las siguientes líneas antes de la sección [Peer].

PostUp = ip rule add table 200 from 69.28.84.160
PostUp = ip route add table 200 default via 69.28.84.1
PreDown = ip rule delete table 200 from 69.28.84.160
PreDown = ip route delete table 200 default via 69.28.84.1

[Peer]
. . .

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.

El comando PostUp crea una regla para comprobar si hay entradas de enrutamiento en la tabla 200 cuando la IP coincide con la IP pública del sistema. El comando PreDown garantiza que el tráfico procesado por la tabla 200 utiliza la pasarela 203.0.113.1 para el enrutamiento en lugar de la interfaz Wireguard.

Configurar los Resolvers DNS del Par

Ejecuta el siguiente comando en el servidor sustituyendo eth0 por el nombre de dispositivo de tu ethernet si es diferente.

$ resolvectl dns eth0

Recibirás un resultado similar.

Link 2 (eth0): 209.208.127.65 209.208.25.18 2001:4860:4860::8888 2001:4860:4860::8844

Abre el archivo de configuración del peer.

$ sudo nano /etc/wireguard/wg0.conf

Añade el siguiente código antes de la línea [Peer].

DNS = 209.208.127.65 2001:4860:4860::8888

[Peer]
. . .

Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.

Paso 8 – Añadir la clave pública del par al servidor Wireguard

Comprueba la clave pública del par Wireguard.

$ sudo cat /etc/wireguard/public.key
PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=

Ejecuta el siguiente comando en tu servidor Wireguard.

$ sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2

Para actualizar el allowed-ips de un peer existente, vuelve a ejecutar el comando anterior cambiando la dirección IP.

Comprueba el estado del túnel en el servidor.

$ sudo wg
interface: wg0
 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
 private key: (hidden)
 listening port: 51820

peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
 allowed ips: 10.8.0.2/32, fd24:609a:6c18::2/128

Paso 9 – Conectar el Peer al Túnel

Instala el paquete resolvconf en caso de que enrutes todo el tráfico a través de la VPN.

$ sudo apt install resolvconf

Inicia el túnel en el peer.

$ sudo wg-quick up wg0

Recibirás un resultado similar.

[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.8.0.2/24 dev wg0
[#] ip -6 address add fd4d:9c8e:c4bc::2/64 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a tun.wg0 -m 0 -x
[#] ip rule add table 200 from 69.28.84.160
[#] ip route add table 200 default via 69.28.84.1

Comprueba el estado del túnel en el par.

$ sudo wg
interface: wg0
 public key: nbkscqPcItMsFtv3R/ylrcC9knA+3F0Z/UVCkGx/DFw=
 private key: (hidden)
 listening port: 45392

peer: JySX9hMJFyAqZA+mNvJsArKW7yY8I7ROsQKTZZR/RH8=
 endpoint: 209.23.10.202:51820
 allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64
 latest handshake: 23 seconds ago
 transfer: 92 B received, 212 B sent
 persistent keepalive: every 15 seconds

Esto confirma la conexión entre el peer y la VPN.

Comprueba que el peer está utilizando la VPN.

$ ip route get 10.0.8.1
10.0.8.1 dev wg0 table 51820 src 10.8.0.2 uid 1000
   cache

Si estás utilizando IPv6, utiliza en su lugar el siguiente comando.

$ ip -6 route get fd24:609a:6c18::1
fd24:609a:6c18::1 from :: dev wg0 proto kernel src fd24:609a:6c18::2 metric 256 pref medium

Utiliza el siguiente comando para desconectar al peer.

$ sudo wg-quick down wg0
[#] ip link delete dev wg0
[#] resolvconf -d tun.wg0 -f

Utiliza el siguiente comando para eliminar la configuración del peer en el servidor.

$ sudo wg set wg0 peer nbkscqPcItMsFtv3R/ylrcC9knA+3F0Z/UVCkGx/DFw= remove

Conclusión

Esto completa el tutorial sobre cómo establecer y configurar una VPN Wireguard en un servidor Ubuntu 22.04 y conectarlo con un cliente. Si tienes alguna pregunta, publícala en los comentarios a continuación.

También te podría gustar...