GNU/Linux >> Tutoriales Linux >  >> Panels >> OpenVPN

Cómo configurar WireGuard en Ubuntu 22.04

Introducción

WireGuard es una red privada virtual (VPN) ligera que admite conexiones IPv4 e IPv6. Una VPN le permite atravesar redes que no son de confianza como si estuviera en una red privada. Le brinda la libertad de acceder a Internet de manera segura desde su teléfono inteligente o computadora portátil cuando está conectado a una red que no es de confianza, como el WiFi en un hotel o una cafetería.

El cifrado de WireGuard se basa en claves públicas y privadas para que los pares establezcan un túnel cifrado entre ellos. Cada versión de WireGuard utiliza un conjunto de cifrado criptográfico específico para garantizar la simplicidad, la seguridad y la compatibilidad con los pares.

En comparación, otro software de VPN, como OpenVPN e IPSec, usa Transport Layer Security (TLS) y certificados para autenticar y establecer túneles encriptados entre sistemas. Las diferentes versiones de TLS incluyen soporte para cientos de paquetes y algoritmos criptográficos diferentes y, si bien esto permite una gran flexibilidad para admitir diferentes clientes, también hace que la configuración de una VPN que use TLS sea más lenta, compleja y propensa a errores.

En este tutorial, configurará WireGuard en un servidor Ubuntu 22.04 y luego configurará otra máquina para conectarse a ella como un par mediante conexiones IPv4 e IPv6 (comúnmente denominadas doble pila). conexión). También aprenderá 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 entre pares encriptado.

A los efectos de este tutorial, configuraremos otro sistema Ubuntu 22.04 como el par (también conocido como cliente) del servidor WireGuard. Los tutoriales posteriores de esta serie explicarán cómo instalar y ejecutar WireGuard en sistemas y dispositivos Windows, macOS, Android e iOS.

Nota: Si planea configurar WireGuard en un Droplet de DigitalOcean, tenga en cuenta que nosotros, al igual que muchos proveedores de alojamiento, cobramos por los excesos de ancho de banda. Por esta razón, tenga en cuenta la cantidad de tráfico que maneja su servidor. Consulte esta página para obtener más información.

Requisitos

Para seguir este tutorial, necesitará:

  • Un servidor Ubuntu 22.04 con un usuario sudo no root y un firewall habilitado. Para configurar esto, puede seguir nuestro tutorial Configuración inicial del servidor con Ubuntu 22.04. Nos referiremos a esto como el WireGuard Server a lo largo de esta guía.
  • Necesitará una máquina cliente que usará para conectarse a su servidor WireGuard. En este tutorial nos referiremos a esta máquina como WireGuard Peer . Para los propósitos de este tutorial, se recomienda que use su máquina local como WireGuard Peer, pero puede usar servidores remotos o teléfonos móviles como clientes si lo prefiere. Si está utilizando un sistema remoto, asegúrese de seguir todas las secciones opcionales más adelante en este tutorial o puede bloquearse el sistema.
  • Para usar WireGuard con IPv6, también deberá asegurarse de que su servidor esté configurado para admitir ese tipo de tráfico. Si desea habilitar la compatibilidad con IPv6 con WireGuard y está utilizando un Droplet de DigitalOcean, consulte esta página de documentación Cómo habilitar IPv6 en Droplets. Puede agregar compatibilidad con IPv6 cuando crea un Droplet o después siguiendo las instrucciones de esa página.

Paso 1:Instalación de WireGuard y generación de un par de claves

El primer paso de este tutorial es instalar WireGuard en su servidor. Para comenzar, actualice el índice de paquetes de su servidor WireGuard e instale WireGuard usando los siguientes comandos. Es posible que se le solicite que proporcione la contraseña de su usuario sudo si es la primera vez que usa sudo en esta sesión:

  1. sudo apt update
  2. sudo apt install wireguard

Ahora que tiene instalado WireGuard, el siguiente paso es generar un par de claves públicas y privadas para el servidor. Usarás el wg genkey incorporado y wg pubkey comandos para crear las claves y luego agregar la clave privada al archivo de configuración de WireGuard.

También deberá cambiar los permisos en la clave que acaba de crear usando chmod comando, ya que por defecto el archivo es legible por cualquier usuario en su servidor.

Cree la clave privada para WireGuard y cambie sus permisos usando los siguientes comandos:

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

El sudo chmod go=... El comando elimina cualquier permiso en el archivo para usuarios y grupos que no sean el usuario raíz para garantizar que solo él pueda acceder a la clave privada.

Debería recibir una sola línea de base64 salida codificada, que es la clave privada. También se almacena una copia de la salida en /etc/wireguard/private.key archivo para referencia futura por parte del tee parte del comando. Tome nota con cuidado de la clave privada que se emite, ya que deberá agregarla 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. Utilice el siguiente comando para crear el archivo de clave pública:

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

Este comando consiste en tres comandos individuales que se encadenan usando el | (tubería) operador:

  • sudo cat /etc/wireguard/private.key :este comando lee el archivo de clave privada y lo envía al flujo de salida estándar.
  • wg pubkey :el segundo comando toma la salida del primer comando como entrada estándar y la procesa para generar una clave pública.
  • sudo tee /etc/wireguard/public.key :el comando final toma el resultado del comando de generación de clave pública y lo redirige al archivo llamado /etc/wireguard/public.key .

Cuando ejecute el comando, volverá a recibir una sola línea de base64 salida codificada, que es la clave pública para su servidor WireGuard. Cópielo en algún lugar como referencia, ya que deberá distribuir la clave pública a cualquier par que se conecte al servidor.

Paso 2:elegir direcciones IPv4 e IPv6

En la sección anterior, instaló WireGuard y generó un par de claves que se usará para encriptar el tráfico hacia y desde el servidor. En esta sección, creará un archivo de configuración para el servidor y configurará WireGuard para que se inicie automáticamente cuando se reinicie el servidor. También definirá direcciones IPv4 e IPv6 privadas para usar con su WireGuard Server y sus pares.

Si planea usar direcciones IPv4 e IPv6, siga estas dos secciones. De lo contrario, siga las instrucciones en la sección correspondiente para las necesidades de red de su VPN.

Paso 2(a):elegir un rango de IPv4

Si está utilizando su servidor WireGuard con pares IPv4, el servidor necesita un rango de direcciones IPv4 privadas para usar con los clientes y para su interfaz de túnel. Puede elegir cualquier rango de direcciones IP de los siguientes bloques de direcciones reservados (si desea obtener más información sobre cómo se asignan estos bloques, visite la especificación RFC 1918):

  • 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)

A los efectos de este tutorial, usaremos 10.8.0.0/24 como un bloque de direcciones IP del primer rango de IP reservadas. Este rango permitirá hasta 255 conexiones de pares diferentes y, en general, no debería tener direcciones superpuestas o en conflicto con otros rangos de IP privados. Siéntase libre de elegir un rango de direcciones que funcione con su configuración de red si este rango de ejemplo no es compatible con sus redes.

El servidor WireGuard utilizará una sola dirección IP del rango para su dirección IPv4 de túnel privado. Usaremos 10.8.0.1/24 aquí, pero cualquier dirección en el rango de 10.8.0.1 a 10.8.0.255 puede ser usado. Tome nota de la dirección IP que elija si usa algo diferente de 10.8.0.1/24 . Agregará esta dirección IPv4 al archivo de configuración que defina en el Paso 3:Creación de una configuración de servidor WireGuard.

Paso 2(b):elegir un rango de IPv6

Si utiliza WireGuard con IPv6, deberá generar un prefijo de dirección de unidifusión IPv6 local único basado en el algoritmo de RFC 4193. Las direcciones que utilice con WireGuard se asociarán con una interfaz de túnel virtual. Deberá completar algunos pasos para generar un prefijo IPv6 único y aleatorio dentro del fd00::/8 reservado. bloque 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 una ID de dispositivo. Luego, esos valores se codifican y truncan, lo que da como resultado un conjunto de bits que se pueden usar como una dirección única dentro del fd00::/8 privado reservado. bloque de IPs.

Para comenzar a generar un rango de IPv6 para su servidor WireGuard, recopile una marca de tiempo de 64 bits usando la date utilidad con el siguiente comando:

  1. date +%s%N

Recibirá un número como el siguiente, que es el número de segundos (el %s en la date comando) y nanosegundos (el %N ) desde 1970-01-01 00:00:00 UTC combinados:

Output1650301699497770167

Registre el valor en algún lugar para usarlo más adelante en esta sección. A continuación, copie el machine-id valor para su servidor desde /var/lib/dbus/machine-id expediente. Este identificador es único para su sistema y no debe cambiar mientras exista el servidor.

  1. cat /var/lib/dbus/machine-id

Recibirá un resultado como el siguiente:

/var/lib/dbus/machine-id610cef4946ed46da8f71dba9d66c67fb

Ahora necesita combinar la marca de tiempo con el machine-id y hash el valor resultante usando el algoritmo SHA-1. El comando usará el siguiente formato:

printf <timestamp><machine-id> | sha1sum

Ejecute el comando sustituyendo su marca de tiempo y los valores de identidad de la máquina:

  1. printf 1650301699497770167610cef4946ed46da8f71dba9d66c67fb | sha1sum

Recibirá un valor hash como el siguiente:

Output442adea1488d96388dae9ab816045b24609a6c18  -

Tenga en cuenta que la salida de sha1sum El comando 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 están los dos primeros bytes de los datos hash.

El algoritmo en el RFC solo requiere los 40 bits (posteriores) menos significativos, o 5 bytes, de la salida codificada. Usa el cut comando para imprimir los últimos 5 bytes codificados hexadecimales del hash:

  1. printf 442adea1488d96388dae9ab816045b24609a6c18 | cut -c 31-

El -c argumento le dice al cut Comando para seleccionar solo un conjunto específico de caracteres. El 31- el argumento le dice a cut para imprimir todos los caracteres desde la posición 31 hasta el final de la línea de entrada.

Debería recibir un resultado como el siguiente:

Output24609a6c18

En este resultado de ejemplo, el conjunto de bytes es:24 60 9a 6c 18 .

Ahora puede construir su prefijo de red IPv6 único agregando los 5 bytes que ha generado con el fd prefijo, separando cada 2 bytes con un : dos puntos para facilitar la lectura. Debido a que cada subred en su prefijo único puede contener un total de 18 446 744 073 709 551 616 direcciones IPv6 posibles, puede restringir la subred a un tamaño estándar de /64 por simplicidad.

Usando los bytes generados previamente con el /64 tamaño de subred el prefijo resultante será el siguiente:

Unique Local IPv6 Address Prefixfd24:609a:6c18::/64

Este fd24:609a:6c18::/64 El rango es lo que utilizará para asignar direcciones IP individuales a sus interfaces de túnel WireGuard en el servidor y los pares. Para asignar una IP para el servidor, agregue un 1 después del :: final caracteres. La dirección resultante será fd24:609a:6c18::1/64 . Los pares pueden usar cualquier IP en el rango, pero normalmente incrementará el valor en uno cada vez que agregue un par, p. fd24:609a:6c18::2/64 . Tome nota de la IP y continúe configurando 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:

  1. Asegúrese de tener la clave privada disponible del Paso 1:Instalación de WireGuard y generación de un par de claves.

  2. Si está utilizando WireGuard con IPv4, necesitará la dirección IP que eligió para el servidor en el Paso 2(a):elegir un rango de IPv4, que en este ejemplo es 10.8.0.1/24 .

  3. Si está utilizando WireGuard con IPv6, necesitará la dirección IP para el servidor que generó en el Paso 2(b):Elegir un rango de IPv6. En este ejemplo, la IP es fd24:609a:6c18::1/64 .

Una vez que tenga la clave privada y la(s) dirección(es) IP requeridas, cree un nuevo archivo de configuración usando nano o su editor preferido ejecutando el siguiente comando:

  1. sudo nano /etc/wireguard/wg0.conf

Agregue las siguientes líneas al archivo, sustituyendo su clave privada en lugar del resaltado base64_encoded_private_key_goes_here valor y la(s) dirección(es) IP en la Address línea. También puede cambiar el ListenPort línea si desea 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

El SaveConfig line asegura que cuando se apaga una interfaz WireGuard, cualquier cambio se guardará en el archivo de configuración.

Guarde y cierre el /etc/wireguard/wg0.conf expediente. Si está utilizando nano , puedes hacerlo con CTRL+X , luego Y y ENTER para confirmar. Ahora tiene una configuración de servidor inicial que puede desarrollar dependiendo de cómo planee usar su servidor VPN WireGuard.

Paso 4:Ajuste de la configuración de red del servidor WireGuard

Si está utilizando WireGuard para conectar un compañero al servidor WireGuard para acceder a los servicios en el servidor solamente , entonces no necesita completar esta sección. Si desea enrutar el tráfico de Internet de su WireGuard Peer a través de WireGuard Server, deberá configurar el reenvío de IP siguiendo esta sección del tutorial.

Para configurar el reenvío, abra el /etc/sysctl.conf archivo usando nano o tu editor preferido:

  1. sudo nano /etc/sysctl.conf

Si está utilizando IPv4 con WireGuard, agregue la siguiente línea al final del archivo:

/etc/sysctl.conf
net.ipv4.ip_forward=1

Si está utilizando IPv6 con WireGuard, agregue esta línea al final del archivo:

/etc/sysctl.conf
net.ipv6.conf.all.forwarding=1

Si está utilizando tanto IPv4 como IPv6, asegúrese de incluir ambas líneas. Guarde y cierre el archivo cuando haya terminado.

Para leer el archivo y cargar los nuevos valores para su sesión de terminal actual, ejecute:

  1. sudo sysctl -p
Outputnet.ipv6.conf.all.forwarding = 1
net.ipv4.ip_forward = 1

Ahora su servidor WireGuard podrá reenviar el tráfico entrante desde el dispositivo ethernet VPN virtual a otros en el servidor, y de allí a la Internet pública. El uso de esta configuración le permitirá enrutar todo el tráfico web de su WireGuard Peer a través de la dirección IP de su servidor, y la dirección IP pública de su cliente se ocultará de manera efectiva.

Sin embargo, antes de que el tráfico se pueda enrutar correctamente a través de su servidor, deberá configurar algunas reglas de firewall. Estas reglas garantizarán que el tráfico hacia y desde su servidor WireGuard y sus pares fluya correctamente.

Paso 5:configurar el firewall del servidor WireGuard

En esta sección, editará la configuración de WireGuard Server para agregar reglas de firewall que garantizarán que el tráfico hacia y desde el servidor y los clientes se enrute correctamente. Al igual que en la sección anterior, omita este paso si solo está utilizando su VPN WireGuard para una conexión de máquina a máquina para acceder a los recursos que están restringidos a su VPN.

Para permitir el tráfico de WireGuard VPN a través del cortafuegos del servidor, deberá habilitar el enmascaramiento, que es un concepto de iptables que proporciona traducción dinámica de direcciones de red (NAT) sobre la marcha para enrutar correctamente las conexiones de los clientes.

Primero busque la interfaz de red pública de su servidor WireGuard usando la ip route subcomando:

  1. ip route list default

La interfaz pública es la cadena que se encuentra dentro de la salida de este comando que sigue a la palabra "dev". Por ejemplo, este resultado muestra la interfaz llamada eth0 , que se destaca a continuación:

Outputdefault via 203.0.113.1 dev eth0 proto static

Anote el nombre de su dispositivo ya que lo agregará a iptables reglas en el siguiente paso.

Para agregar reglas de firewall a su servidor WireGuard, abra el /etc/wireguard/wg0.conf archivo con nano o su editor preferido de nuevo.

  1. sudo nano /etc/wireguard/wg0.conf

En la parte inferior del archivo después de SaveConfig = true línea, pegue 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

El PostUp Las líneas se ejecutarán cuando WireGuard Server inicie el túnel VPN virtual. En el ejemplo aquí, agregará tres ufw y iptables reglas:

  • ufw route allow in on wg0 out on eth0 - Esta regla permitirá reenviar el tráfico IPv4 e IPv6 que ingresa en el wg0 Interfaz VPN para eth0 interfaz de red en el servidor. Funciona junto con net.ipv4.ip_forward y net.ipv6.conf.all.forwarding valores sysctl que configuró 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 wg0 interfaz VPN para que parezca que se origina directamente desde 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 wg0 Interfaz VPN para que parezca que se origina directamente desde la dirección IPv6 pública del servidor WireGuard.

El PreDown las reglas se ejecutan cuando WireGuard Server detiene el túnel VPN virtual. Estas reglas son las inversas de PostUp reglas y función para deshacer las reglas de reenvío y enmascaramiento para la interfaz VPN cuando se detiene la VPN.

En ambos casos, edite la configuración para incluir o excluir las reglas de IPv4 e IPv6 que sean apropiadas para su VPN. Por ejemplo, si solo está utilizando IPv4, puede excluir las líneas con ip6tables comandos.

Por el contrario, si solo usa IPv6, edite la configuración para incluir solo las ip6tables comandos El ufw Deben existir líneas para cualquier combinación de redes IPv4 e IPv6. Guarde y cierre el archivo cuando haya terminado.

La última parte de la configuración del firewall en su servidor WireGuard es permitir el tráfico hacia y desde el propio puerto UDP de WireGuard. Si no cambió el puerto en el /etc/wireguard/wg0.conf del servidor archivo, el puerto que abrirá es 51820 . Si eligió un puerto diferente al editar la configuración, asegúrese de sustituirlo en el siguiente comando UFW.

En caso de que haya olvidado abrir el puerto SSH al seguir el tutorial de requisitos previos, agréguelo aquí también:

  1. sudo ufw allow 51820/udp
  2. sudo ufw allow OpenSSH

Nota :si está utilizando un firewall diferente o ha personalizado su configuración de UFW, es posible que deba agregar reglas de firewall adicionales. Por ejemplo, si decide canalizar todo el tráfico de su red a través de la conexión VPN, deberá asegurarse de que el puerto 53 el tráfico está permitido para solicitudes de DNS y puertos como 80 y 443 para tráfico HTTP y HTTPS respectivamente. Si hay otros protocolos que está utilizando a través de la VPN, también deberá agregar reglas para ellos.

Después de agregar esas reglas, deshabilite y vuelva a habilitar UFW para reiniciarlo y cargar los cambios de todos los archivos que ha modificado:

  1. sudo ufw disable
  2. sudo ufw enable

Puede confirmar que las reglas están vigentes ejecutando ufw status dominio. Ejecútelo y debería recibir un resultado como el siguiente:

  1. sudo ufw status
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)

Su servidor WireGuard ahora está configurado para manejar correctamente el tráfico de la VPN, incluido el reenvío y el enmascaramiento para los pares. Con las reglas del firewall implementadas, puede iniciar el propio servicio WireGuard para escuchar las conexiones entre pares.

Paso 6:Iniciar el servidor WireGuard

WireGuard se puede configurar para ejecutarse como un systemd servicio usando su wg-quick incorporado texto. Si bien podría usar manualmente el wg comando para crear el túnel cada vez que desee utilizar la VPN, hacerlo es un proceso manual que se vuelve repetitivo y propenso a errores. En su lugar, puede usar systemctl para administrar el túnel con la ayuda de wg-quick guión.

Usando un systemd El servicio significa que puede configurar WireGuard para que se inicie en el arranque para que pueda conectarse a su VPN en cualquier momento mientras el servidor esté funcionando. Para hacer esto, habilite wg-quick servicio para el wg0 túnel que ha definido al agregarlo a systemctl :

  1. sudo systemctl enable [email protected]

Observe que el comando especifica el nombre del túnel wg0 nombre del dispositivo como parte del nombre del servicio. Este nombre se asigna a /etc/wireguard/wg0.conf archivo de configuración. Este enfoque de asignación de nombres significa que puede crear tantos túneles VPN independientes como desee utilizando su servidor.

Por ejemplo, podría tener un dispositivo de túnel y el nombre de prod y su archivo de configuración sería /etc/wireguard/prod.conf . Cada configuración de túnel puede contener diferentes configuraciones de firewall de cliente, IPv4 y IPv6. De esta manera, puede admitir múltiples conexiones de pares diferentes, cada una con sus propias direcciones IP y reglas de enrutamiento únicas.

Ahora inicie el servicio:

  1. sudo systemctl start [email protected]

Vuelva a verificar que el servicio WireGuard esté activo con el siguiente comando. Debería ver active (running) en la salida:

  1. sudo systemctl status [email protected]
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 la ip comandos que se utilizan para crear el wg0 virtual dispositivo y asígnele las direcciones IPv4 e IPv6 que agregó al archivo de configuración. Puede usar estas reglas para solucionar problemas del túnel, o con wg comando en sí mismo si desea intentar configurar manualmente la interfaz VPN.

Con el servidor configurado y en ejecución, el siguiente paso es configurar su máquina cliente como WireGuard Peer y conectarse al servidor WireGuard.

Paso 7:configurar un par de WireGuard

La configuración de un par de WireGuard es similar a la configuración del servidor WireGuard. Una vez que haya instalado el software del cliente, generará un par de claves públicas y privadas, decidirá una dirección o direcciones IP para el par, definirá un archivo de configuración para el par y luego iniciará el túnel usando wg-quick guión.

Puede agregar tantos pares como desee a su VPN generando un par de claves y una configuración mediante los siguientes pasos. Si agrega varios pares a la VPN, asegúrese de realizar un seguimiento de sus direcciones IP privadas para evitar colisiones.

Para configurar WireGuard Peer, asegúrese de tener el paquete WireGuard instalado usando el siguiente apt comandos En la ejecución del par de WireGuard:

  1. sudo apt update
  2. sudo apt install wireguard

Creación del par de claves de WireGuard Peer

A continuación, deberá generar el par de claves en el par siguiendo los mismos pasos que usó en el servidor. Desde su máquina local o servidor remoto que servirá como par, proceda y cree la clave privada para el par usando los siguientes comandos:

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

Nuevamente recibirá una sola línea de base64 salida codificada, que es la clave privada. También se almacena una copia de la salida en /etc/wireguard/private.key . Tome nota con cuidado de la clave privada que se emite, ya que deberá agregarla al archivo de configuración de WireGuard más adelante en esta sección.

A continuación, utilice el siguiente comando para crear el archivo de clave pública:

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

Recibirá nuevamente una sola línea de base64 salida codificada, que es la clave pública para su WireGuard Peer. Cópielo en algún lugar como referencia, ya que deberá distribuir la clave pública al servidor WireGuard para establecer una conexión cifrada.

Creación del archivo de configuración de WireGuard Peer

Ahora que tiene un par de claves, puede crear un archivo de configuración para el par que contiene toda la información que necesita para establecer una conexión con el servidor WireGuard.

Necesitará algunos datos para el archivo de configuración:

  • El base64 clave privada codificada que generó en el par.

  • Los intervalos de direcciones IPv4 e IPv6 que definió en el servidor WireGuard.

  • El base64 clave pública codificada del servidor WireGuard.

  • La dirección IP pública y el número de puerto del servidor WireGuard. Por lo general, esta será la dirección IPv4, pero si su servidor tiene una dirección IPv6 y su máquina cliente tiene una conexión IPv6 a Internet, puede usarla en lugar de IPv4.

Con toda esta información a la mano, abra un nuevo /etc/wireguard/wg0.conf archivo en la máquina WireGuard Peer usando nano o tu editor preferido:

  1. sudo nano /etc/wireguard/wg0.conf

Agregue las siguientes líneas al archivo, sustituyendo los diversos 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

Observe cómo la primera Address línea usa una dirección IPv4 de 10.8.0.0/24 subred que eligió anteriormente. Esta dirección IP puede ser cualquier cosa en la subred siempre que sea diferente de la IP del servidor. Incrementar las direcciones en 1 cada vez que agrega un par es generalmente la forma más fácil de asignar direcciones IP.

Del mismo modo, observe cómo la segunda Address utiliza una dirección IPv6 de la subred que generó anteriormente e incrementa la dirección del servidor en uno. Nuevamente, cualquier IP en el rango es válida si decide usar una dirección diferente.

La otra parte notable del archivo es el último AllowedIPs línea. Estos dos rangos de IPv4 e IPv6 indican al par que solo 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. Uso de las AllowedIPs directiva, puede restringir la VPN en el par para conectarse solo a otros pares y servicios en la VPN, o puede configurar la configuración para canalizar todo el tráfico a través de la VPN y usar el servidor WireGuard como puerta de enlace.

Si solo está utilizando IPv4, omita el final fd24:609a:6c18::/64 rango (incluyendo el , coma). Por el contrario, si solo usa IPv6, incluya solo el fd24:609a:6c18::/64 prefijo y omita el 10.8.0.0/24 Rango de IPv4.

In both cases, if you would like to send all your peer’s traffic over the VPN and use the WireGuard Server as a gateway for all traffic, then you can use 0.0.0.0/0 , which represents the entire IPv4 address space, and ::/0 for the entire IPv6 address space.

(Optional) Configuring a Peer to Route All Traffic Over the Tunnel

If you have opted to route all of the peer’s traffic over the tunnel using the 0.0.0.0/0 or ::/0 routes and the peer is a remote system, then you will need to complete the steps in this section. If your peer is a local system then it is best to skip this section.

For remote peers that you access via SSH or some other protocol using a public IP address, you will need to add some extra rules to the peer’s wg0.conf expediente. These rules will ensure that you can still connect to the system from outside of the tunnel when it is connected. Otherwise, when the tunnel is established, all traffic that would normally be handled on the public network interface will not be routed correctly to bypass the wg0 tunnel interface, leading to an inaccessible remote system.

First, you’ll need to determine the IP address that the system uses as its default gateway. Run the following ip route comando:

  1. ip route list table main default

You will receive output like the following:

Outputdefault via 203.0.113.1 dev eth0 proto static

Note the gateway’s highlighted IP address 203.0.113.1 for later use, and device eth0 . Your device name may be different. If so, substitute it in place of eth0 en los siguientes comandos.

Next find the public IP for the system by examining the device with the ip address show comando:

  1. ip -brief address show eth0

You will receive output like the following:

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

In this example output, the highlighted 203.0.113.5 IP (without the trailing /20 ) is the public address that is assigned to the eth0 device that you’ll need to add to the WireGuard configuration.

Now open the WireGuard Peer’s /etc/wireguard/wg0.conf file with nano or your preferred editor.

  1. sudo nano /etc/wireguard/wg0.conf

Before the [Peer] line, add the following 4 lines:

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]
. . .

These lines will create a custom routing rule, and add a custom route to ensure that public traffic to the system uses the default gateway.

  • PostUp = ip rule add table 200 from 203.0.113.5 - This command creates a rule that checks for any routing entries in the table numbered 200 when the IP matches the system’s public 203.0.113.5 address.
  • PostUp = ip route add table 200 default via 203.0.113.1 - This command ensures that any traffic being processed by the 200 table will use the 203.0.113.1 gateway for routing, instead of the WireGuard interface.

The PreDown lines remove the custom rule and route when the tunnel is shutdown.

Note:The table number 200 is arbitrary when constructing these rules. You can use a value between 2 and 252, or you can use a custom name by adding a label to the /etc/iproute2/rt_tables file and then referring to the name instead of the numeric value.

For more information about how routing tables work in Linux visit the Routing Tables Section of the Guide to IP Layer Network Administration with Linux.

If you are routing all the peer’s traffic over the VPN, ensure that you have configured the correct sysctl and iptables rules on the WireGuard Server in Step 4 — Adjusting the WireGuard Server’s Network Configuration and Step 5 — Configuring the WireGuard Server’s Firewall.

(Optional) Configuring the WireGuard Peer’s DNS Resolvers

If you are using the WireGuard Server as a VPN gateway for all your peer’s traffic, you will need to add a line to the [Interface] section that specifies DNS resolvers. If you do not add this setting, then your DNS requests may not be secured by the VPN, or they might be revealed to your Internet Service Provider or other third parties.

If you are only using WireGuard to access resources on the VPN network or in a peer-to-peer configuration then you can skip this section.

To add DNS resolvers to your peer’s configuration, first determine which DNS servers your WireGuard Server is using. Run the following command on the WireGuard Server , substituting in your ethernet device name in place of eth0 if it is different from this example:

  1. resolvectl dns eth0

You should receive output like the following:

OutputLink 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888

The IP addresses that are output are the DNS resolvers that the server is using. You can choose to use any or all of them, or only IPv4 or IPv6 depending on your needs. Make a note of the resolvers that you will use.

Next you will need to add your chosen resolvers to the WireGuard Peer’s configuration file. Back on the WireGuard Peer , open /etc/wireguard/wg0.conf archivo usando nano o tu editor preferido:

  1. sudo nano /etc/wireguard/wg0.conf

Before the [Peer] line, add the following:

DNS = 67.207.67.2 2001:4860:4860::8844

[Peer]
. . .

Again, depending on your preference or requirements for IPv4 and IPv6, you can edit the list according to your needs.

Once you are connected to the VPN in the following step, you can check that you are sending DNS queries over the VPN by using a site like DNS leak test.com.

You can also check that your peer is using the configured resolvers with the resolvectl dns command like you ran on the server. You should receive output like the following, showing the DNS resolvers that you configured for the VPN tunnel:

OutputGlobal: 67.207.67.2 67.207.67.3
. . .

With all of these DNS resolver settings in place, you are now ready to add the peer’s public key to the server, and then start the WireGuard tunnel on the peer.

Step 8 — Adding the Peer’s Public Key to the WireGuard Server

Before connecting the peer to the server, it is important to add the peer’s public key to the WireGuard Server. This step ensures that you will be able to connect to and route traffic over the VPN. Without completing this step the WireGuard server will not allow the peer to send or receive any traffic over the tunnel.

Ensure that you have a copy of the base64 encoded public key for the WireGuard Peer by running:

  1. sudo cat /etc/wireguard/public.key
OutputPeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=

Now log into the WireGuard server, and run the following command:

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

Note that the allowed-ips portion of the command takes a comma separated list of IPv4 and IPv6 addresses. You can specify individual IPs if you would like to restrict the IP address that a peer can assign itself, or a range like in the example if your peers can use any IP address in the VPN range. Also note that no two peers can have the same allowed-ips setting.

If you would like to update the allowed-ips for an existing peer, you can run the same command again, but change the IP addresses. Multiple IP addresses are supported. For example, to change the WireGuard Peer that you just added to add an IP like 10.8.0.100 to the existing 10.8.0.2 and fd24:609a:6c18::2 IPs, you would run the following:

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

Once you have run the command to add the peer, check the status of the tunnel on the server using the wg comando:

  1. sudo 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

Notice how the peer line shows the WireGuard Peer’s public key, and the IP addresses, or ranges of addresses that it is allowed to use to assign itself an IP.

Now that you have defined the peer’s connection parameters on the server, the next step is to start the tunnel on the peer.

Step 9 — Connecting the WireGuard Peer to the Tunnel

Now that your server and peer are both configured to support your choice of IPv4, IPv6, packet forwarding, and DNS resolution, it is time to connect the peer to the VPN tunnel.

Since you may only want the VPN to be on for certain use cases, we’ll use the wg-quick command to establish the connection manually. If you would like to automate starting the tunnel like you did on the server, follow those steps in Step 6 — Starting the WireGuard Server section instead of using the wq-quick comando.

In case you are routing all traffic through the VPN and have set up DNS forwarding, you’ll need to install the resolvconf utility on the WireGuard Peer before you start the tunnel. Run the following command to set this up:

  1. sudo apt install resolvconf

To start the tunnel, run the following on the WireGuard Peer:

  1. sudo wg-quick up wg0

You will receive output like the following:

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

Notice the highlighted IPv4 and IPv6 addresses that you assigned to the peer.

If you set the AllowedIPs on the peer to 0.0.0.0/0 and ::/0 (or to use ranges other than the ones that you chose for the VPN), then your output will resemble the following:

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

In this example, notice the highlighted routes that the command added, which correspond to the AllowedIPs in the peer configuration.

You can check the status of the tunnel on the peer using the wg comando:

  1. sudo 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

You can also check the status on the server again, and you will receive similar output.

Verify that your peer is using the VPN by using the ip route and ip -6 route comandos If you are using the VPN as a gateway for all your Internet traffic, check which interface will be used for traffic destined to CloudFlare’s 1.1.1.1 and 2606:4700:4700::1111 DNS resolvers.

If you are only using WireGuard to access resources on the VPN, substitute a valid IPv4 or IPv6 address like the gateway itself into these commands. For example 10.8.0.1 or fd24:609a:6c18::1 .

  1. ip route get 1.1.1.1
Output1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000
   cache

Notice the wg0 device is used and the IPv4 address 10.8.0.2 that you assigned to the peer. Likewise, if you are using IPv6, run the following:

  1. ip -6 route get 2606:4700:4700::1111
Output2606:4700:4700::1111 from :: dev wg0 table 51820 src fd24:609a:6c18::2 metric 1024 pref medium

Again note the wg0 interface, and the IPv6 address fd24:609a:6c18::2 that you assigned to the peer.

If your peer has a browser installed, you can also visit ipleak.net and ipv6-test.com to confirm that your peer is routing its traffic over the VPN.

Once you are ready to disconnect from the VPN on the peer, use the wg-quick comando:

  1. sudo wg-quick down wg0

You will receive output like the following indicating that the VPN tunnel is shut down:

Output[#] ip link delete dev wg0
[#] resolvconf -d tun.wg0 -f

If you set the AllowedIPs on the peer to 0.0.0.0/0 and ::/0 (or to use ranges other than the ones that you chose for the VPN), then your output will resemble the following:

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

To reconnect to the VPN, run the wg-quick up wg0 command again on the peer. If you would like to completely remove a peer’s configuration from the WireGuard Server, you can run the following command, being sure to substitute the correct public key for the peer that you want to remove:

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove

Typically you will only need to remove a peer configuration if the peer no longer exists, or if its encryption keys are compromised or changed. Otherwise it is better to leave the configuration in place so that the peer can reconnect to the VPN without requiring that you add its key and allowed-ips each time.

Conclusión

In this tutorial you installed the WireGuard package and tools on both the server and client Ubuntu 22.04 systems. You set up firewall rules for WireGuard, and configured kernel settings to allow packet forwarding using the sysctl command on the server. You learned how to generate private and public WireGuard encryption keys, and how to configure the server and peer (or peers) to connect to each other.

If your network uses IPv6, you also learned how to generate a unique local address range to use with peer connections. Finally, you learned how to limit which traffic should go over the VPN by restricting the network prefixes that the peer can use, as well as how to use the WireGuard Server as a VPN gateway to handle all Internet traffic for peers.

If you would like to learn more about WireGuard, including how to configure more advanced tunnels, or use WireGuard with containers, visit the official WireGuard documentation.


OpenVPN
  1. Cómo configurar WireGuard VPN en Ubuntu 20.04

  2. Cómo configurar un servidor LAMP de Ubuntu/Debian

  3. Cómo configurar WireGuard VPN en Ubuntu (una guía paso a paso)

  4. Cómo configurar Nginx como proxy inverso en Ubuntu 20.04

  5. Cómo establecer y configurar una autoridad de certificación en Ubuntu 22.04

Cómo configurar el servidor de impresión CUPS en Ubuntu 20.04

Cómo instalar y configurar un servidor OpenVPN en Ubuntu 22.04

Cómo configurar el servidor de correo electrónico con Plesk en Ubuntu 20.04

Cómo configurar el servidor Prosody XMPP en Ubuntu 20.04

Cómo configurar el servidor Prosody XMPP en Ubuntu 18.04

Cómo configurar el servidor proxy Shadowsocks-libev en Ubuntu