Introducción
WireGuard es una red privada virtual (VPN) ligera que admite conexiones IPv4 e IPv6. Una VPN te permite atravesar redes no confiables como si estuvieras en una red privada. Te brinda la libertad de acceder a internet de manera segura desde tu smartphone o portátil cuando estás conectado a una red no confiable, como el WiFi en un hotel o cafetería.
La encriptación de WireGuard se basa en claves públicas y privadas para que los pares establezcan un túnel encriptado entre ellos. Cada versión de WireGuard utiliza un conjunto de cifrado criptográfico específico para garantizar simplicidad, seguridad y compatibilidad con los pares.
En comparación, otros software de VPN como OpenVPN e IPSec utilizan Seguridad de la Capa de Transporte (TLS) y certificados para autenticar y establecer túneles encriptados entre sistemas. Diferentes versiones de TLS incluyen soporte para cientos de suites y algoritmos criptográficos diferentes, y aunque esto permite una gran flexibilidad para admitir diferentes clientes, también hace que configurar una VPN que use TLS sea más lento, complejo y propenso a errores.
En este tutorial, configurarás WireGuard en un servidor Ubuntu 22.04 y luego configurarás otra máquina para conectarse a él como un par utilizando conexiones IPv4 e IPv6 (comúnmente conocida como una conexión dual stack). También aprenderás cómo enrutar el tráfico de Internet del par a través del servidor WireGuard en una configuración de puerta de enlace, además de usar la VPN para un túnel punto a punto cifrado.
Para los propósitos de este tutorial, configuraremos otro sistema Ubuntu 22.04 como el par (también conocido como cliente) del servidor WireGuard. Los tutoriales posteriores en esta serie explicarán cómo instalar y ejecutar WireGuard en sistemas y dispositivos Windows, macOS, Android e iOS.
Nota: Si planeas configurar WireGuard en un Droplet de DigitalOcean, ten en cuenta que nosotros, al igual que muchos proveedores de alojamiento, cobramos por excedentes de ancho de banda. Por esta razón, por favor, ten en cuenta cuánto tráfico está manejando tu servidor. Consulta esta página para obtener más información.
Requisitos previos
Para seguir este tutorial, necesitarás:
- Un servidor Ubuntu 22.04 con un usuario no root con permisos de sudo y un cortafuegos habilitado. Para configurar esto, puedes seguir nuestro tutorial Configuración inicial del servidor con Ubuntu 22.04. Nos referiremos a esto como el Servidor WireGuard a lo largo de esta guía.
- Necesitarás una máquina cliente que utilizarás para conectarte a tu servidor WireGuard. En este tutorial nos referiremos a esta máquina como el Peer de WireGuard. Para los propósitos de este tutorial, se recomienda que uses tu máquina local como el Peer de WireGuard, pero puedes utilizar servidores remotos o teléfonos móviles como clientes si lo prefieres. Si estás utilizando un sistema remoto, asegúrate de seguir todas las secciones opcionales más adelante en este tutorial o podrías quedarte bloqueado fuera del sistema.
- Para usar WireGuard con IPv6, también deberás asegurarte de que tu servidor esté configurado para admitir ese tipo de tráfico. Si deseas habilitar el soporte IPv6 con WireGuard y estás utilizando un Droplet de DigitalOcean, consulta esta página de documentación Cómo Habilitar IPv6 en Droplets. Puedes agregar soporte IPv6 al crear un Droplet o después utilizando las instrucciones en esa página.
Paso 1 — Instalación de WireGuard y Generación de un Par de Claves
El primer paso en este tutorial es instalar WireGuard en tu servidor. Para empezar, actualiza el índice de paquetes de tu servidor WireGuard e instala WireGuard usando los siguientes comandos. Es posible que se te solicite proporcionar la contraseña de tu usuario sudo si es la primera vez que estás utilizando sudo
en esta sesión:
Ahora que tienes instalado WireGuard, el siguiente paso es generar un par de claves privada y pública para el servidor. Utilizarás los comandos integrados wg genkey
y wg pubkey
para crear las claves, y luego agregarás la clave privada al archivo de configuración de WireGuard.
También necesitarás cambiar los permisos en la clave que acabas de crear usando el comando chmod
, ya que por defecto el archivo es legible por cualquier usuario en tu servidor.
Crea la clave privada para WireGuard y cambia sus permisos usando los siguientes comandos:
El comando sudo chmod go=...
elimina cualquier permiso en el archivo para usuarios y grupos que no sean el usuario root para asegurarse de que solo él pueda acceder a la clave privada.
Deberías recibir una línea única de salida codificada en base64
, que es la clave privada. Una copia de la salida también se almacena en el archivo /etc/wireguard/private.key
para referencia futura mediante la porción tee
del comando. Asegúrate de tomar nota cuidadosamente de la clave privada que se muestra, ya que la necesitarás agregar al archivo de configuración de WireGuard más adelante en esta sección.
El siguiente paso es crear la clave pública correspondiente, que se deriva de la clave privada. Utiliza el siguiente comando para crear el archivo de clave pública:
Este comando consta de tres comandos individuales que se encadenan utilizando el operador |
(pipe):
sudo cat /etc/wireguard/private.key
: este comando lee el archivo de clave privada y lo imprime en el flujo de salida estándar.wg pubkey
: el segundo comando toma la salida del primer comando como su entrada estándar y la procesa para generar una clave pública.sudo tee /etc/wireguard/public.key
: el comando final toma la salida del comando de generación de clave pública y la redirige al archivo llamado/etc/wireguard/public.key
.
Al ejecutar el comando, recibirás nuevamente una línea única de salida codificada en base64
, que es la clave pública de tu servidor WireGuard. Copia este valor en algún lugar para referencia, ya que necesitarás distribuir la clave pública a cualquier par que se conecte al servidor.
Paso 2 — Elección de direcciones IPv4 e IPv6
En la sección anterior, instalaste WireGuard y generaste un par de claves que se utilizarán para cifrar el tráfico hacia y desde el servidor. En esta sección, crearás un archivo de configuración para el servidor y configurarás WireGuard para que se inicie automáticamente cuando se reinicie el servidor. También definirás direcciones IPv4 e IPv6 privadas para usar con tu servidor WireGuard y pares.
Si planeas utilizar tanto direcciones IPv4 como IPv6, sigue ambas de estas secciones. De lo contrario, sigue las instrucciones en la sección apropiada para las necesidades de red de tu VPN.
Paso 2(a) — Elección de un Rango IPv4
Si estás utilizando tu servidor WireGuard con compañeros IPv4, el servidor necesita un rango de direcciones IPv4 privadas para usar con clientes y para su interfaz de túnel. Puedes elegir cualquier rango de direcciones IP de los siguientes bloques reservados de direcciones (si deseas aprender más sobre cómo se asignan estos bloques, visita la especificación RFC 1918):
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 los propósitos de este tutorial, utilizaremos 10.8.0.0/24
como un bloque de direcciones IP del primer rango de IPs reservadas. Este rango permitirá hasta 255 conexiones de pares diferentes y generalmente no debería tener direcciones superpuestas o conflictivas con otros rangos de IP privadas. Si este rango de ejemplo no es compatible con tu configuración de red, siéntete libre de elegir un rango de direcciones que funcione con tu configuración de red.
El servidor WireGuard utilizará una sola dirección IP del rango para su dirección de túnel privado IPv4. Usaremos 10.8.0.1/24
aquí, pero se puede usar cualquier dirección en el rango de 10.8.0.1
a 10.8.0.255
. Tome nota de la dirección IP que elija si utiliza algo diferente de 10.8.0.1/24
. Agregará esta dirección IPv4 al archivo de configuración que defina en Paso 3 — Creación de una configuración de servidor WireGuard.
Paso 2(b) — Elección de un rango IPv6
Si está utilizando WireGuard con IPv6, entonces necesitará generar un prefijo de dirección única local de IPv6 unicast basado en el algoritmo en RFC 4193. Las direcciones que use con WireGuard estarán asociadas con una interfaz de túnel virtual. Deberá completar algunos pasos para generar un prefijo IPv6 aleatorio y único dentro del bloque reservado fd00::/8
de direcciones IPv6 privadas.
Según el RFC, la forma recomendada de obtener un prefijo IPv6 único es combinar la hora del día con un valor de identificación único de un sistema como un número de serie o ID de dispositivo. Luego, esos valores se hashan y truncan, lo que resulta en un conjunto de bits que se pueden usar como una dirección única dentro del bloque privado reservado fd00::/8
de IPs.
Para empezar a generar un rango IPv6 para tu servidor WireGuard, recopila un timestamp de 64 bits utilizando la utilidad date
con el siguiente comando:
Recibirás un número como el siguiente, que es el número de segundos (el %s
en el comando date
) y nanosegundos (el %N
) desde 1970-01-01 00:00:00 UTC combinados juntos:
Output1650301699497770167
Registra el valor en algún lugar para usarlo más adelante en esta sección. A continuación, copia el valor de machine-id
de tu servidor del archivo /var/lib/dbus/machine-id
. Este identificador es único para tu sistema y no debería cambiar mientras el servidor exista.
Recibirás una salida como la siguiente:
/var/lib/dbus/machine-id610cef4946ed46da8f71dba9d66c67fb
Ahora necesitas combinar el timestamp con el machine-id
y hashear el valor resultante utilizando el algoritmo SHA-1. El comando utilizará el siguiente formato:
printf <timestamp><machine-id> | sha1sum
Ejecuta el comando sustituyendo en tus valores de timestamp e identidad de máquina:
Recibirás un valor de hash como el siguiente:
Output442adea1488d96388dae9ab816045b24609a6c18 -
Ten en cuenta que la salida del comando sha1sum
está en hexadecimal, por lo que la salida usa dos caracteres para representar un solo byte de datos. Por ejemplo, 4f
y 26
en la salida de ejemplo son los primeros dos bytes de los datos hasheados.
El algoritmo en el RFC solo requiere los 40 bits menos significativos (trailing), o 5 bytes, de la salida hasheada. Usa el comando cut
para imprimir los últimos 5 bytes codificados en hexadecimal del hash:
El argumento -c
indica al comando cut
que seleccione solo un conjunto especificado de caracteres. El argumento 31-
indica a cut
que imprima todos los caracteres desde la posición 31 hasta el final de la línea de entrada.
Deberías recibir una salida como la siguiente:
Output24609a6c18
En este ejemplo de salida, el conjunto de bytes es: 24 60 9a 6c 18
.
Ahora puedes construir tu prefijo de red IPv6 único agregando los 5 bytes que has generado con el prefijo fd
, separando cada 2 bytes con dos puntos :
para mayor legibilidad. Dado que cada subred en tu prefijo único puede contener un total de 18,446,744,073,709,551,616 posibles direcciones IPv6, puedes restringir la subred a un tamaño estándar de /64
para simplificar.
Utilizando los bytes generados anteriormente con el tamaño de subred /64
, el prefijo resultante será el siguiente:
Unique Local IPv6 Address Prefixfd24:609a:6c18::/64
Este rango fd24:609a:6c18::/64
es el que utilizarás para asignar direcciones IP individuales a las interfaces de túneles WireGuard en el servidor y los pares. Para asignar una IP al servidor, agrega un 1
después de los caracteres finales ::
. La dirección resultante será fd24:609a:6c18::1/64
. Los pares pueden utilizar cualquier IP en el rango, pero típicamente incrementarás el valor en uno cada vez que agregues un par, por ejemplo, fd24:609a:6c18::2/64
. Toma nota de la IP y procede a configurar el Servidor WireGuard en la siguiente sección de este tutorial.
Paso 3 — Creación de una Configuración de Servidor WireGuard
Antes de crear la configuración de su servidor WireGuard, necesitará la siguiente información:
-
Asegúrese de tener disponible la clave privada obtenida en Paso 1 — Instalación de WireGuard y Generación de un Par de Claves.
-
Si está utilizando WireGuard con IPv4, necesitará la dirección IP que eligió para el servidor en Paso 2(a) — Elección de un Rango IPv4, que en este ejemplo es
10.8.0.1/24
. -
Si está utilizando WireGuard con IPv6, necesitará la dirección IP para el servidor que generó en Paso 2(b) — Elección de un Rango IPv6. En este ejemplo, la IP es
fd24:609a:6c18::1/64
.
Una vez que tengas la clave privada requerida y la(s) dirección(es) IP, crea un nuevo archivo de configuración usando nano
o tu editor preferido ejecutando el siguiente comando:
Agrega las siguientes líneas al archivo, sustituyendo tu clave privada en lugar del valor destacado base64_encoded_private_key_goes_here
, y la(s) dirección(es) IP en la línea Address
. También puedes cambiar la línea ListenPort
si deseas que WireGuard esté disponible en un puerto diferente:
/etc/wireguard/wg0.conf[Interface]
PrivateKey = base64_encoded_private_key_goes_here
Address = 10.8.0.1/24, fd24:609a:6c18::1/64
ListenPort = 51820
SaveConfig = true
La línea SaveConfig
asegura que cuando una interfaz de WireGuard se apague, cualquier cambio se guardará en el archivo de configuración.
Guarda y cierra el archivo /etc/wireguard/wg0.conf
. Si estás usando nano
, puedes hacerlo con CTRL+X
, luego Y
y ENTER
para confirmar. Ahora tienes una configuración inicial del servidor que puedes modificar dependiendo de cómo planeas usar tu servidor VPN de WireGuard.
Paso 4 — Ajuste de la Configuración de Red del Servidor de WireGuard
Si estás utilizando WireGuard para conectar un par al servidor de WireGuard para acceder solo a los servicios en el servidor, entonces no necesitas completar esta sección. Si deseas dirigir el tráfico de Internet de tu par de WireGuard a través del servidor de WireGuard, entonces necesitarás configurar el reenvío de IP siguiendo esta sección del tutorial.
Para configurar el reenvío, abre el archivo /etc/sysctl.conf
usando nano
o tu editor preferido:
Si estás utilizando IPv4 con WireGuard, añade la siguiente línea al final del archivo:
net.ipv4.ip_forward=1
Si estás utilizando IPv6 con WireGuard, añade esta línea al final del archivo:
net.ipv6.conf.all.forwarding=1
Si estás utilizando tanto IPv4 como IPv6, asegúrate de incluir ambas líneas. Guarda y cierra el archivo cuando hayas terminado.
Para leer el archivo y cargar los nuevos valores para tu sesión terminal actual, ejecuta:
Outputnet.ipv6.conf.all.forwarding = 1
net.ipv4.ip_forward = 1
Ahora tu servidor de WireGuard podrá reenviar el tráfico entrante desde el dispositivo de red virtual VPN hacia otros en el servidor, y desde allí hacia Internet público. Usando esta configuración, podrás dirigir todo el tráfico web desde tu par de WireGuard a través de la dirección IP de tu servidor, y la dirección IP pública de tu cliente estará efectivamente oculta.
Sin embargo, antes de que el tráfico pueda ser dirigido correctamente a través de tu servidor, necesitarás configurar algunas reglas de firewall. Estas reglas asegurarán que el tráfico hacia y desde tu servidor de WireGuard y pares fluya correctamente.
Paso 5 — Configuración del Firewall del Servidor WireGuard
En esta sección editarás la configuración del servidor WireGuard para agregar reglas de firewall que garantizarán que el tráfico hacia y desde el servidor y los clientes se enrutará correctamente. Al igual que en la sección anterior, omite este paso si solo estás utilizando tu VPN de WireGuard para una conexión de máquina a máquina para acceder a recursos que están restringidos a tu VPN.
Para permitir el tráfico de la VPN de WireGuard a través del firewall del servidor, deberás habilitar el enmascaramiento, que es un concepto de iptables que proporciona traducción de direcciones de red (NAT) dinámica sobre la marcha para enrutar correctamente las conexiones de los clientes.
Primero, encuentra la interfaz de red pública de tu servidor WireGuard usando el subcomando ip route
:
La interfaz pública es la cadena encontrada dentro de la salida de este comando que sigue a la palabra “dev”. Por ejemplo, este resultado muestra la interfaz llamada eth0
, que se resalta a continuación:
Outputdefault via 203.0.113.1 dev eth0 proto static
Toma nota del nombre de tu dispositivo ya que lo agregarás a las reglas de iptables
en el próximo paso.
Para agregar reglas de firewall a tu servidor WireGuard, abre el archivo /etc/wireguard/wg0.conf
nuevamente con nano
o tu editor preferido.
En la parte inferior del archivo, después de la línea SaveConfig = true
, pega las siguientes líneas:
/etc/wireguard/wg0.conf. . .
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
Las líneas PostUp
se ejecutarán cuando el servidor WireGuard inicie el túnel VPN virtual. En el ejemplo aquí, agregará tres reglas de ufw
y iptables
:
ufw route allow in on wg0 out on eth0
– Esta regla permitirá el reenvío de tráfico IPv4 e IPv6 que ingrese en la interfaz VPNwg0
a la interfaz de redeth0
en el servidor. Funciona en conjunto con los valores sysctlnet.ipv4.ip_forward
ynet.ipv6.conf.all.forwarding
que configuraste en la sección anterior.iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
– Esta regla configura el enmascaramiento y reescribe el tráfico IPv4 que ingresa en la interfaz VPNwg0
para que parezca que proviene directamente de la dirección IPv4 pública del servidor WireGuard.ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
– Esta regla configura el enmascaramiento y reescribe el tráfico IPv6 que ingresa en la interfaz VPNwg0
para que parezca que proviene directamente de la dirección IPv6 pública del servidor WireGuard.
Las reglas PreDown
se ejecutan cuando el servidor WireGuard detiene el túnel VPN virtual. Estas reglas son el inverso de las reglas PostUp
y funcionan para deshacer las reglas de reenvío y enmascaramiento para la interfaz VPN cuando se detiene la VPN.
En ambos casos, edita la configuración para incluir o excluir las reglas IPv4 e IPv6 que sean apropiadas para tu VPN. Por ejemplo, si solo estás utilizando IPv4, entonces puedes excluir las líneas con los comandos ip6tables
.
Por otro lado, si solo estás utilizando IPv6, entonces edita la configuración para incluir únicamente los comandos ip6tables
. Las líneas de ufw
deben existir para cualquier combinación de redes IPv4 e IPv6. Guarda y cierra el archivo cuando hayas terminado.
La última parte de la configuración del firewall en tu Servidor WireGuard es permitir el tráfico hacia y desde el puerto UDP de WireGuard en sí. Si no cambiaste el puerto en el archivo /etc/wireguard/wg0.conf
del servidor, el puerto que abrirás es 51820
. Si elegiste un puerto diferente al editar la configuración, asegúrate de sustituirlo en el siguiente comando de UFW.
En caso de que hayas olvidado abrir el puerto SSH al seguir el tutorial previo, agrégalo aquí también:
Nota: Si estás utilizando un firewall diferente o has personalizado tu configuración de UFW, es posible que necesites agregar reglas de firewall adicionales. Por ejemplo, si decides canalizar todo el tráfico de red a través de la conexión VPN, deberás asegurarte de que el tráfico del puerto 53
esté permitido para las solicitudes DNS, y los puertos como 80
y 443
para el tráfico HTTP y HTTPS respectivamente. Si hay otros protocolos que estás utilizando a través de la VPN, entonces deberás agregar reglas para ellos también.
Después de agregar esas reglas, desactiva y vuelve a activar UFW para reiniciarlo y cargar los cambios de todos los archivos que has modificado:
Puedes confirmar que las reglas están en su lugar ejecutando el comando ufw status
. Ejecútalo y deberías recibir una salida como la siguiente:
OutputStatus: active
To Action From
-- ------ ----
51280/udp ALLOW Anywhere
22/tcp ALLOW Anywhere
51280/udp (v6) ALLOW Anywhere (v6)
22/tcp (v6) ALLOW Anywhere (v6)
Tu servidor WireGuard está ahora configurado para manejar correctamente el tráfico de la VPN, incluyendo el reenvío y enmascaramiento para los pares. Con las reglas de firewall en su lugar, puedes iniciar el servicio de WireGuard para escuchar las conexiones de los pares.
Paso 6 — Iniciando el Servidor WireGuard
WireGuard puede configurarse para ejecutarse como un servicio de systemd
utilizando su script integrado wg-quick
. Aunque podrías usar manualmente el comando wg
para crear el túnel cada vez que desees utilizar la VPN, hacerlo es un proceso manual que se vuelve repetitivo y propenso a errores. En cambio, puedes utilizar systemctl
para gestionar el túnel con la ayuda del script wg-quick
.
Usar un servicio de systemd
significa que puedes configurar WireGuard para iniciarse en el arranque para que puedas conectarte a tu VPN en cualquier momento siempre que el servidor esté en funcionamiento. Para hacer esto, habilita el servicio wg-quick
para el túnel wg0
que has definido agregándolo a systemctl
:
Observa que el comando especifica el nombre del dispositivo del túnel wg0
como parte del nombre del servicio. Este nombre se mapea al archivo de configuración /etc/wireguard/wg0.conf
. Este enfoque de nombrado significa que puedes crear tantos túneles VPN separados como desees utilizando tu servidor.
Por ejemplo, podrías tener un dispositivo de túnel con el nombre prod
y su archivo de configuración sería /etc/wireguard/prod.conf
. Cada configuración de túnel puede contener diferentes ajustes de firewall IPv4, IPv6 y de cliente. De esta manera, puedes admitir múltiples conexiones de pares diferentes, cada una con sus propias direcciones IP únicas y reglas de enrutamiento.
Ahora inicia el servicio:
Verifica que el servicio de WireGuard esté activo con el siguiente comando. Deberías ver active (running)
en la salida:
Output● [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-04-18 17:22:13 UTC; 2s 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: 98834 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
Main PID: 98834 (code=exited, status=0/SUCCESS)
CPU: 193ms
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] wg setconf wg0 /dev/fd/63
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -4 address add 10.8.0.1/24 dev wg0
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -6 address add fd24:609a:6c18::1/64 dev wg0
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip link set mtu 1420 up dev wg0
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ufw route allow in on wg0 out on ens3
Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added
Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added (v6)
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip6tables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
Apr 18 17:22:13 thats-my-jam systemd[1]: Finished WireGuard via wg-quick(8) for wg0.
La salida muestra los comandos ip
que se utilizan para crear el dispositivo virtual wg0
y asignarle las direcciones IPv4 e IPv6 que agregaste al archivo de configuración. Puedes usar estas reglas para solucionar problemas del túnel, o con el comando wg
en sí si deseas intentar configurar manualmente la interfaz VPN.
Con el servidor configurado y en funcionamiento, el siguiente paso es configurar tu máquina cliente como un Par de WireGuard y conectarlo al Servidor de WireGuard.
Paso 7 — Configuración de un Par de WireGuard
Configurar un par de WireGuard es similar a configurar el Servidor de WireGuard. Una vez que tengas instalado el software cliente, generarás un par de claves pública y privada, decidirás una dirección IP o direcciones para el par, definirás un archivo de configuración para el par y luego iniciarás el túnel usando el script wg-quick
.
Puede agregar tantos pares como desee a su VPN generando un par de claves y una configuración utilizando los siguientes pasos. Si agrega múltiples pares a la VPN, asegúrese de llevar un registro de sus direcciones IP privadas para evitar colisiones.
Para configurar el Par de WireGuard, asegúrese de tener instalado el paquete WireGuard usando los siguientes comandos apt
. En el par de WireGuard, ejecute:
Creación del Par de Claves de WireGuard
A continuación, deberá generar el par de claves en el par utilizando los mismos pasos que utilizó en el servidor. Desde su máquina local o servidor remoto que servirá como par, proceda y cree la clave privada para el par utilizando los siguientes comandos:
Nuevamente recibirá una sola línea de salida codificada en base64
, que es la clave privada. Una copia de la salida también se almacena en /etc/wireguard/private.key
. Haga una nota cuidadosa de la clave privada que se muestra, ya que deberá agregarla al archivo de configuración de WireGuard más adelante en esta sección.
A continuación, use el siguiente comando para crear el archivo de clave pública:
Recibirá nuevamente una sola línea de salida codificada en base64
, que es la clave pública de su Par de WireGuard. Cópiela en algún lugar para referencia, ya que deberá distribuir la clave pública al Servidor de WireGuard para establecer una conexión cifrada.
Creación del archivo de configuración del par de WireGuard
Ahora que tienes un par de claves, puedes crear un archivo de configuración para el par que contenga toda la información que necesita para establecer una conexión con el servidor WireGuard.
Necesitarás algunas piezas de información para el archivo de configuración:
-
La clave privada codificada en base64 que generaste en el par.
-
Los rangos de direcciones IPv4 e IPv6 que definiste en el servidor WireGuard.
-
La clave pública codificada en base64 del servidor WireGuard.
-
La dirección IP pública y el número de puerto del servidor WireGuard. Normalmente esto será la dirección IPv4, pero si tu servidor tiene una dirección IPv6 y tu máquina cliente tiene una conexión IPv6 a internet, puedes usar esto en lugar de IPv4.
Con toda esta información a mano, abre un nuevo archivo /etc/wireguard/wg0.conf
en la máquina Peer de WireGuard usando nano
o tu editor preferido:
Agrega las siguientes líneas al archivo, sustituyendo los diferentes datos en las secciones resaltadas según sea necesario:
/etc/wireguard/wg0.conf[Interface]
PrivateKey = base64_encoded_peer_private_key_goes_here
Address = 10.8.0.2/24
Address = fd24:609a:6c18::2/64
[Peer]
PublicKey = U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
AllowedIPs = 10.8.0.0/24, fd24:609a:6c18::/64
Endpoint = 203.0.113.1:51820
Observa cómo la primera línea de Address
utiliza una dirección IPv4 de la subred 10.8.0.0/24
que elegiste anteriormente. Esta dirección IP puede ser cualquier cosa en la subred siempre y cuando sea diferente de la IP del servidor. Incrementar las direcciones por 1 cada vez que agregues un par es generalmente la forma más fácil de asignar IPs.
Del mismo modo, observa cómo la segunda línea de Address
utiliza una dirección IPv6 de la subred que generaste anteriormente e incrementa la dirección del servidor en uno. De nuevo, cualquier IP en el rango es válida si decides usar una dirección diferente.
Otra parte notable del archivo es la última línea de AllowedIPs
. Estos dos rangos IPv4 e IPv6 instruyen al par a enviar tráfico solo a través de la VPN si el sistema de destino tiene una dirección IP en alguno de los rangos. Utilizando la directiva AllowedIPs
, puedes restringir la VPN en el par para que solo se conecte a otros pares y servicios en la VPN, o puedes configurar el ajuste para enviar todo el tráfico a través de la VPN y utilizar el Servidor WireGuard como una puerta de enlace.
Si solo estás usando IPv4, entonces omite el rango fd24:609a:6c18::/64
al final (incluyendo la coma ,
). Por el contrario, si solo estás usando IPv6, entonces solo incluye el prefijo fd24:609a:6c18::/64
y omite el rango IPv4 10.8.0.0/24
.
En ambos casos, si deseas enviar todo el tráfico de tus pares a través de la VPN y usar el servidor WireGuard como puerta de enlace para todo el tráfico, entonces puedes utilizar 0.0.0.0/0
, que representa todo el espacio de direcciones IPv4, y ::/0
para todo el espacio de direcciones IPv6.
(Opcional) Configuración de un Par para Enrutar Todo el Tráfico a Través del Túnel
Si has optado por enrutar todo el tráfico del par a través del túnel utilizando las rutas 0.0.0.0/0
o ::/0
y el par es un sistema remoto, entonces deberás completar los pasos de esta sección. Si tu par es un sistema local, lo mejor es omitir esta sección.
Para pares remotos a los que accedes mediante SSH u algún otro protocolo utilizando una dirección IP pública, deberás agregar algunas reglas adicionales al archivo wg0.conf
del par. Estas reglas garantizarán que aún puedas conectarte al sistema desde fuera del túnel cuando esté conectado. De lo contrario, cuando se establezca el túnel, todo el tráfico que normalmente se manejaría en la interfaz de red pública no se enrutaría correctamente para evitar la interfaz de túnel wg0
, lo que llevaría a un sistema remoto inaccesible.
Primero, deberás determinar la dirección IP que el sistema utiliza como su puerta de enlace predeterminada. Ejecuta el siguiente comando ip route
:
Recibirás una salida como la siguiente:
Outputdefault via 203.0.113.1 dev eth0 proto static
Toma nota de la dirección IP resaltada del gateway 203.0.113.1
para usarla más tarde, y del dispositivo eth0
. El nombre de tu dispositivo puede ser diferente. Si es así, sustitúyelo en lugar de eth0
en los siguientes comandos.
A continuación, encuentra la IP pública del sistema examinando el dispositivo con el comando ip address show
:
Recibirás una salida como la siguiente:
Outputeth0 UP 203.0.113.5/20 10.20.30.40/16 2604:a880:400:d1::3d3:6001/64 fe80::68d5:beff:feff:974c/64
En este ejemplo de salida, la IP resaltada 203.0.113.5
(sin el /20
al final) es la dirección pública asignada al dispositivo eth0
que necesitarás agregar a la configuración de WireGuard.
Ahora abre el archivo /etc/wireguard/wg0.conf
del Peer de WireGuard con nano
o tu editor preferido.
Antes de la línea [Peer]
, agrega las siguientes 4 líneas:
PostUp = ip rule add table 200 from 203.0.113.5
PostUp = ip route add table 200 default via 203.0.113.1
PreDown = ip rule delete table 200 from 203.0.113.5
PreDown = ip route delete table 200 default via 203.0.113.1
[Peer]
. . .
Estas líneas crearán una regla de enrutamiento personalizada y agregarán una ruta personalizada para asegurar que el tráfico público hacia el sistema utilice la puerta de enlace predeterminada.
PostUp = ip rule add table 200 from 203.0.113.5
– Este comando crea una regla que verifica cualquier entrada de enrutamiento en la tabla numerada200
cuando la IP coincide con la dirección pública203.0.113.5
del sistema.PostUp = ip route add table 200 default via 203.0.113.1
– Este comando asegura que cualquier tráfico procesado por la tabla200
utilice la puerta de enlace203.0.113.1
para enrutamiento, en lugar de la interfaz WireGuard.
Las líneas PreDown
eliminan la regla y la ruta personalizadas cuando el túnel se apaga.
Nota: El número de tabla 200
es arbitrario al construir estas reglas. Puede usar un valor entre 2 y 252, o puede usar un nombre personalizado agregando una etiqueta al archivo /etc/iproute2/rt_tables
y luego haciendo referencia al nombre en lugar del valor numérico.
Para obtener más información sobre cómo funcionan las tablas de enrutamiento en Linux, visite la Sección de Tablas de Enrutamiento de la Guía de Administración de Red de Capa IP con Linux.
Si está enrutando todo el tráfico del par a través de la VPN, asegúrese de haber configurado las reglas correctas de sysctl
e iptables
en el Servidor WireGuard en Paso 4 — Ajuste de la Configuración de Red del Servidor WireGuard y Paso 5 — Configuración del Firewall del Servidor WireGuard.
(Opcional) Configuración de los Resolutores DNS del Par de WireGuard
Si estás utilizando el servidor WireGuard como una puerta de enlace VPN para todo el tráfico de tus pares, necesitarás agregar una línea a la sección [Interface]
que especifique los servidores DNS. Si no agregas esta configuración, es posible que tus solicitudes DNS no estén aseguradas por la VPN, o que sean reveladas a tu proveedor de servicios de Internet u otros terceros.
Si solo estás utilizando WireGuard para acceder a recursos en la red VPN o en una configuración de igual a igual, entonces puedes omitir esta sección.
Para agregar servidores DNS a la configuración de tus pares, primero determina qué servidores DNS está utilizando tu servidor WireGuard. Ejecuta el siguiente comando en el Servidor WireGuard, sustituyendo el nombre de tu dispositivo Ethernet en lugar de eth0
si es diferente a este ejemplo:
Deberías recibir una salida como la siguiente:
OutputLink 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888
Las direcciones IP que se muestran son los servidores DNS que está utilizando el servidor. Puedes elegir usar cualquiera o todos ellos, o solo IPv4 o IPv6 según tus necesidades. Toma nota de los servidores que usarás.
A continuación, necesitarás agregar tus servidores elegidos al archivo de configuración del par de WireGuard. De vuelta en el Par de WireGuard, abre el archivo /etc/wireguard/wg0.conf
utilizando nano
o tu editor preferido:
Antes de la línea [Peer]
, agrega lo siguiente:
DNS = 67.207.67.2 2001:4860:4860::8844
[Peer]
. . .
Nuevamente, según tu preferencia o requisitos para IPv4 e IPv6, puedes editar la lista según tus necesidades.
Una vez que estés conectado a la VPN en el siguiente paso, puedes verificar que estás enviando consultas DNS a través de la VPN utilizando un sitio como DNS leak test.com.
También puedes verificar que tu par está utilizando los servidores de nombres configurados con el comando resolvectl dns
como lo hiciste en el servidor. Deberías recibir una salida como la siguiente, que muestra los servidores de nombres DNS que configuraste para el túnel VPN:
OutputGlobal: 67.207.67.2 67.207.67.3
. . .
Con todas estas configuraciones de servidores de nombres DNS en su lugar, ahora estás listo para agregar la clave pública del par al servidor y luego iniciar el túnel WireGuard en el par.
Paso 8 — Agregar la Clave Pública del Par al Servidor WireGuard
Antes de conectar el par al servidor, es importante agregar la clave pública del par al Servidor WireGuard. Este paso garantiza que podrás conectarte y enrutar el tráfico a través de la VPN. Sin completar este paso, el servidor WireGuard no permitirá que el par envíe o reciba ningún tráfico a través del túnel.
Asegúrate de tener una copia de la clave pública codificada en base64
para el Par de WireGuard ejecutando:
OutputPeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
Ahora inicia sesión en el servidor WireGuard y ejecuta el siguiente comando:
Tenga en cuenta que la parte allowed-ips
del comando toma una lista separada por comas de direcciones IPv4 e IPv6. Puede especificar IPs individuales si desea restringir la dirección IP que un par puede asignarse a sí mismo, o un rango como en el ejemplo si sus pares pueden usar cualquier dirección IP en el rango de VPN. También tenga en cuenta que ningún par puede tener la misma configuración de allowed-ips
.
Si desea actualizar el allowed-ips
para un par existente, puede ejecutar el mismo comando nuevamente, pero cambiar las direcciones IP. Se admiten múltiples direcciones IP. Por ejemplo, para cambiar el Peer de WireGuard que acaba de agregar para agregar una IP como 10.8.0.100
a las IPs existentes 10.8.0.2
y fd24:609a:6c18::2
, ejecutaría lo siguiente:
Una vez que haya ejecutado el comando para agregar el par, verifique el estado del túnel en el servidor usando el comando wg
:
Outputinterface: wg0
public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
private key: (hidden)
listening port: 51820
peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
allowed ips: 10.8.0.2/32, fd24:609a:6c18::/128
Observe cómo la línea peer
muestra la clave pública del Peer de WireGuard y las direcciones IP, o rangos de direcciones que se le permiten usar para asignarse una IP.
Ahora que ha definido los parámetros de conexión del par en el servidor, el siguiente paso es iniciar el túnel en el par.
Paso 9 — Conexión del Peer de WireGuard al Túnel
Ahora que su servidor y su par están configurados para admitir su elección de IPv4, IPv6, reenvío de paquetes y resolución DNS, es hora de conectar el par al túnel VPN.
Dado que es posible que solo desee que la VPN esté activada para ciertos casos de uso, utilizaremos el comando wg-quick
para establecer la conexión manualmente. Si desea automatizar el inicio del túnel como lo hizo en el servidor, siga esos pasos en la sección Paso 6 — Iniciando el Servidor WireGuard en lugar de usar el comando wq-quick
.
En caso de que esté enrutando todo el tráfico a través de la VPN y haya configurado el reenvío de DNS, deberá instalar la utilidad resolvconf
en el Par de WireGuard antes de iniciar el túnel. Ejecute el siguiente comando para configurarlo:
Para iniciar el túnel, ejecute lo siguiente en el Par de WireGuard:
Recibirá una salida como la siguiente:
Output[#] 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 fd24:609a:6c18::2/64 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a tun.wg0 -m 0 -x
Observe las direcciones IPv4 e IPv6 resaltadas que asignó al par.
Si configuró los AllowedIPs
en el par como 0.0.0.0/0
y ::/0
(o para usar rangos diferentes a los que eligió para la VPN), entonces su salida se parecerá a la siguiente:
Output[#] 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 fd24:609a:6c18::2/64 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a tun.wg0 -m 0 -x
[#] wg set wg0 fwmark 51820
[#] ip -6 route add ::/0 dev wg0 table 51820
[#] ip -6 rule add not fwmark 51820 table 51820
[#] ip -6 rule add table main suppress_prefixlength 0
[#] ip6tables-restore -n
[#] 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
En este ejemplo, observe las rutas resaltadas que el comando agregó, que corresponden a los AllowedIPs
en la configuración del par.
Puede verificar el estado del túnel en el par usando el comando wg
:
Outputinterface: wg0
public key: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
private key: (hidden)
listening port: 49338
fwmark: 0xca6c
peer: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
endpoint: 203.0.113.1:51820
allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64
latest handshake: 1 second ago
transfer: 6.50 KiB received, 15.41 KiB sent
También puede verificar el estado en el servidor nuevamente, y recibirá una salida similar.
Verifica que tu par esté utilizando la VPN mediante los comandos ip route
y ip -6 route
. Si estás utilizando la VPN como puerta de enlace para todo tu tráfico de Internet, comprueba qué interfaz se utilizará para el tráfico destinado a los resolutores DNS de CloudFlare 1.1.1.1
y 2606:4700:4700::1111
.
Si solo estás utilizando WireGuard para acceder a recursos en la VPN, sustituye una dirección IPv4 o IPv6 válida como la misma puerta de enlace en estos comandos. Por ejemplo, 10.8.0.1
o fd24:609a:6c18::1
.
Output1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000
cache
Observa el dispositivo wg0
que se está utilizando y la dirección IPv4 10.8.0.2
que asignaste al par. Del mismo modo, si estás utilizando IPv6, ejecuta lo siguiente:
Output2606:4700:4700::1111 from :: dev wg0 table 51820 src fd24:609a:6c18::2 metric 1024 pref medium
Nuevamente, nota la interfaz wg0
, y la dirección IPv6 fd24:609a:6c18::2
que asignaste al par.
Si tu par tiene un navegador instalado, también puedes visitar ipleak.net y ipv6-test.com para confirmar que tu par está dirigiendo su tráfico a través de la VPN.
Cuando estés listo para desconectar la VPN en el par, utiliza el comando wg-quick
:
Recibirás una salida como la siguiente que indica que el túnel VPN está cerrado:
Output[#] ip link delete dev wg0
[#] resolvconf -d tun.wg0 -f
Si estableciste los AllowedIPs
en el par a 0.0.0.0/0
y ::/0
(o para usar rangos diferentes a los que elegiste para la VPN), entonces tu salida se parecerá a la siguiente:
Output[#] ip rule delete table 200 from 203.0.113.5
[#] ip route delete table 200 default via 203.0.113.1
[#] ip -4 rule delete table 51820
[#] ip -4 rule delete table main suppress_prefixlength 0
[#] ip -6 rule delete table 51820
[#] ip -6 rule delete table main suppress_prefixlength 0
[#] ip link delete dev wg0
[#] resolvconf -d tun.wg0 -f
[#] iptables-restore -n
[#] ip6tables-restore -n
Para volver a conectarse a la VPN, ejecuta el comando wg-quick up wg0
nuevamente en el peer. Si deseas eliminar completamente la configuración de un peer del Servidor WireGuard, puedes ejecutar el siguiente comando, asegurándote de sustituir la clave pública correcta del peer que deseas eliminar:
Normalmente solo necesitarás eliminar una configuración de peer si el peer ya no existe, o si sus claves de cifrado se ven comprometidas o cambian. De lo contrario, es mejor dejar la configuración en su lugar para que el peer pueda volver a conectarse a la VPN sin necesidad de agregar su clave y allowed-ips
cada vez.
Conclusión
En este tutorial, instalaste el paquete y las herramientas de WireGuard en los sistemas servidor y cliente de Ubuntu 22.04. Configuraste reglas de firewall para WireGuard y configuraste ajustes del kernel para permitir el reenvío de paquetes utilizando el comando sysctl
en el servidor. Aprendiste cómo generar claves de cifrado privadas y públicas de WireGuard, y cómo configurar el servidor y el peer (o peers) para conectarse entre sí.
Si tu red utiliza IPv6, también aprendiste cómo generar un rango de direcciones locales únicas para usar con conexiones de peer. Finalmente, aprendiste cómo limitar qué tráfico debe pasar por la VPN al restringir los prefijos de red que el peer puede usar, así como cómo usar el Servidor WireGuard como una puerta de enlace VPN para manejar todo el tráfico de Internet para los peers.
Si deseas aprender más sobre WireGuard, incluyendo cómo configurar túneles más avanzados o utilizar WireGuard con contenedores, visita la documentación oficial de WireGuard.
Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-wireguard-on-ubuntu-22-04