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
a10.255.255.255
(prefijo 10/8)172.16.0.0
a172.31.255.255
(prefijo 172.16/12)192.168.0.0
a192.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.