GNU/Linux >> Tutoriales Linux >  >> Ubuntu

Cómo crear una VPN en Ubuntu 20.04 usando Wireguard

Wireguard es una VPN moderna y muy fácil de configurar disponible en múltiples sistemas operativos. La aplicación está disponible en los repositorios oficiales de Ubuntu 20.04, por lo que también es muy fácil de instalar. A diferencia de otro software como OpenVPN que se basa en el uso de certificados SSL, Wireguard se basa en el uso de pares de claves. En este tutorial, veremos cómo configurar, en unos sencillos pasos, un servidor VPN y un cliente par en la última versión estable de Ubuntu.

En este tutorial aprenderás:

  • Cómo instalar Wireguard en Ubuntu 20.04 Focal Fossa
  • Cómo crear un par de claves públicas y privadas
  • Cómo configurar el servidor y un par cliente
  • Cómo redirigir todo el tráfico entrante a la VPN

Wireguard VPN en Ubuntu 20.04

Requisitos de software y convenciones utilizadas

Instalación

Wireguard está oficialmente disponible en el repositorio “universe” de Ubuntu 20.04, por lo tanto podemos instalarlo vía apt . La versión disponible, al momento de escribir es 1.0.20200319-1ubuntu1 :

$ sudo apt install wireguard

El sistema nos pedirá que confirmemos que queremos instalar el programa y sus dependencias, y completará la operación en cuestión de segundos.

Generando claves

Debemos generar una clave pública y una privada para cada máquina que queramos usar en nuestra VPN. La clave privada debe mantenerse en secreto en la máquina, la pública se usa para acceder a la máquina desde otros pares.

Para generar las claves podemos usar el wg utilidad. Dentro del archivo de configuración de Wireguard, necesitaremos hacer referencia a la clave privada de la máquina, mientras que la pública se usará en los otros pares. Tenga en cuenta que haremos referencia a las claves directamente, por lo que, en teoría, no necesitamos almacenarlas en archivos. Sin embargo, lo haremos de todos modos, solo por conveniencia.

Para generar la clave privada para nuestro servidor, debemos usar el genkey subcomando de wg . El comando envía la clave creada a stdout; para escribir la clave en un archivo, podemos usar el poder de las redirecciones de shell:

$ wg genkey > server_private_key

El comando generará la clave y la almacenará en server_private_key archivo, pero generará la siguiente advertencia:

Warning: writing to world accessible file.
Consider setting the umask to 077 and trying again.

Esto se debe a que con el usuario predeterminado umask (002 ) los archivos se crean con el modo 664 , por lo que son de lectura mundial, lo que no se recomienda. Para resolver este problema, podemos cambiar el umask utilizado en la sesión de shell actual antes de crear los archivos:

$ umask 077

O cambie los permisos de los archivos a 600 después de la creación. Aquí optaremos por la última solución.

Una vez que nuestra clave privada esté lista, podemos generar la pública uno que se basa en él. Para realizar la tarea usamos el pubkey subcomando de wg . Al igual que antes, usamos redirecciones de shell:primero para pasar el contenido de la server_private_key archivo al stdin del comando, y luego y para redirigir la clave generada a server_public_key archivo:

$ wg pubkey < server_private_key > server_public_key

Para ahorrar algo de tipeo, podemos generar ambas claves, con un solo comando, lo que involucra el uso del shell | (tubería) operador y el tee comando:

$ wg genkey | tee server_private_key | wg pubkey > server_public_key

La salida del comando en el lado izquierdo del operador de canalización (| ) se pasa a la entrada estándar del programa en su lado derecho. La tee en su lugar, nos permite redirigir la salida de un comando tanto a un archivo como a la salida estándar (más información sobre las redirecciones de shell aquí).

Una vez que nuestras claves estén listas, podemos crear el archivo de configuración del servidor.

Archivo de configuración del servidor

Para configurar nuestra instalación de Wireguard, podemos crear un archivo de configuración llamado wg0.conf con el siguiente contenido:

[Interface]
PrivateKey = <private key of the server (the content of the server_private_key file)>
Address = 10.0.0.1/24
ListenPort = 51820

Tenga en cuenta que el nombre del archivo es arbitrario, pero debe basarse en el nombre que usaremos para nuestra interfaz, wg0 en este caso. Este nombre será referenciado al iniciar el servicio, como veremos a continuación.

En nuestro ejemplo. el [interface] La sección del archivo de configuración contiene los siguientes campos:

  • Clave privada
  • Dirección
  • Puerto de escucha

La clave privada el valor del campo no es más que la clave privada del servidor que generamos anteriormente.

En la Dirección campo especificamos la dirección para asignar a la interfaz en la VPN junto con la máscara de subred usando el CIDR notación. En este caso usamos 10.0.0.1/24 , por lo que nuestra dirección de "servidor" Wireguard dentro de la VPN será 10.0.0.1 , que se encuentra en el rango de direcciones disponible que va desde 10.0.0.1 a 10.0.0.254 .

Finalmente, en el ListenPort campo, especificamos en qué puerto Wireguard escuchará el tráfico entrante. También se debe agregar una regla para permitir dicho tráfico en nuestro firewall. Haremos esto en la siguiente sección.

Ahora podemos cambiar los permisos de los archivos y moverlos a /etc/wireguard directorio:

$ chmod 600 server_public_key server_private_key wg0.conf
$ sudo mv server_private_key server_public_key wg0.conf /etc/wireguard

Ahora podemos iniciar wg-quick servicio que especifica el nombre de la interfaz Wireguard después de @ en el nombre de la unidad. ¿Qué es esta notación? Es una característica de systemd:con él podemos generar múltiples archivos de unidades sobre la base de una "plantilla", pasando el valor que se sustituirá en la plantilla, después de @ símbolo en el nombre de la unidad. Este es el contenido del [email protected] unidad:

[Unit]
Description=WireGuard via wg-quick(8) for %I
After=network-online.target nss-lookup.target
Wants=network-online.target nss-lookup.target
Documentation=man:wg-quick(8)
Documentation=man:wg(8)
Documentation=https://www.wireguard.com/
Documentation=https://www.wireguard.com/quickstart/
Documentation=https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
Documentation=https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/wg-quick up %i
ExecStop=/usr/bin/wg-quick down %i
Environment=WG_ENDPOINT_RESOLUTION_RETRIES=infinity

[Install]
WantedBy=multi-user.target

El valor que especificaremos después de @ en el nombre de la unidad al iniciarla o detenerla, reemplazará a %i en el ExecStart y ExecStop líneas. En este caso usaremos wg0 :

$ sudo systemctl enable --now wg-quick@wg0

Con el comando anterior, iniciamos el servicio y también hacemos que se inicie automáticamente al arrancar. Para verificar que se haya aplicado nuestra configuración, podemos ejecutar wg dominio. La salida producida debe mostrar información sobre el wg0 interfaz:

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

Ahora, procedamos y configuremos nuestro firewall y reenvío de paquetes.

Cortafuegos y configuración de red

En este tutorial asumiré el uso de ufw . Como dijimos antes, debemos agregar una regla para permitir el tráfico entrante a través del puerto que especificamos en el archivo de configuración, 51820 . Lo hacemos ejecutando un comando muy simple:

$ sudo ufw allow 51820/udp

También debemos permitir el reenvío de paquetes en nuestro sistema. Para realizar la tarea, debemos eliminar el comentario de la línea 28 del /etc/sysctl.conf archivo, para que se vea así:

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

Para hacer efectivos los cambios sin reiniciar el sistema, necesitamos ejecutar el siguiente comando:

$ sudo sysctl -p

En el siguiente paso configuraremos el cliente.

Generación de clave de cliente

Pasemos ahora al sistema que queremos usar como cliente. Necesitamos instalar Wireguard en él; una vez hecho esto, podemos generar un par de claves tal como lo hicimos en el servidor:

$ wg genkey | tee client_private_key | wg pubkey > client_public_key

Al igual que hicimos en el lado del servidor, creamos el wg0.conf archivo de configuración. Esta vez con este contenido:

[Interface]
PrivateKey = <client_private_key>
Address = 10.0.0.2/24

[Peer]
PublicKey = <server_public_key>
EndPoint  = <server_public_ip>:51820
AllowedIPs = 0.0.0.0/0

Ya vimos el significado de los campos contenidos en la Interface sección, cuando generamos la configuración del servidor. Aquí solo adaptamos los valores a nuestro cliente (tendrá el 10.0.0.2 dirección en la VPN).

En esta configuración, usamos una nueva sección, [Peer] . En él podemos especificar la información relativa a un par, en este caso el que usamos como “servidor”. Los campos que usamos son:

  • Clave pública
  • Punto final
  • IP permitidas

En la clave pública campo, especificamos el público clave del par, entonces, en este caso, la clave pública que generamos en el servidor.

El punto final es la dirección IP pública o el nombre de host del par seguido de dos puntos y el número de puerto en el que escucha el par (en nuestro caso, 51820 ).

Finalmente, el valor pasado a las IP permitidas campo, es una lista separada por comas de direcciones IP y máscara de subred con notación CIDR. Solo se permitirá el tráfico dirigido al par que provenga de las direcciones especificadas. En este caso usamos 0.0.0.0/0 como valor:funciona como un valor "catch-all", por lo que todo el tráfico se enviará al par VPN (el servidor).

Al igual que hicimos en el lado del servidor, configuramos los permisos apropiados y movemos las claves y el archivo de configuración a /etc/wireguard directorio:

$ chmod 600 client_public_key client_private_key wg0.conf
$ sudo mv client_public_key client_private_key wg0.conf /etc/wireguard

Con el archivo de configuración en su lugar, podemos iniciar el servicio:

$ sudo systemctl enable --now wg-quick@wg0

Finalmente, el [Peer] sección relativa a nuestro cliente, debe agregarse al archivo de configuración que creamos previamente en el servidor . Nosotros añadimos el siguiente contenido:

[Peer]
PublicKey = <public key of the client>
AllowedIPs = 10.0.0.2/32

En este punto reiniciamos el servicio:

$ sudo systemctl restart wg-quick@wg0

La información sobre el par asociado ahora debe informarse en la salida del wg comando:

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

peer: t5pKKg5/9fJKiU0lrNTahv6gvABcmCjQq5gF3BxwiDQ=
  allowed ips: 10.0.0.2/32

En este punto, desde el sistema "cliente", deberíamos poder hacer ping al servidor en el 10.0.0.1 dirección:

$ ping -c 3 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=2.82 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=38.0 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=3.02 ms

--- 10.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 2.819/14.613/37.999/16.536 ms

Conclusiones

En este tutorial vimos cómo crear una VPN usando Wireguard en la última versión estable de Ubuntu:20.04 Focal Fossa. El software es realmente simple de instalar y configurar, especialmente si se compara con otras soluciones, como por ejemplo OpenVpn.

Vimos cómo generar las claves públicas y privadas utilizadas para nuestra configuración, y cómo configurar tanto el servidor como el cliente para que todo el tráfico se redirija a la VPN. Siguiendo las instrucciones dadas, tendrá una configuración de trabajo. Para obtener más información, consulte la página del proyecto.


Ubuntu
  1. Cómo crear una pila LAMP basada en docker usando docker en Ubuntu 20.04

  2. Cómo configurar WireGuard VPN en Ubuntu 18.04

  3. Cómo configurar WireGuard VPN en Ubuntu 20.04

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

  5. Cómo crear arreglos RAID usando MDADM en Ubuntu

Cómo crear y ejecutar un programa en C usando Ubuntu 20.04 LTS

Cómo configurar una VPN en Ubuntu

Cómo crear un USB de arranque usando Ventoy en Ubuntu 21

¿Cómo crear un enlace a una carpeta en Ubuntu 18.04 usando Gui?

Cómo configurar WireGuard VPN en Debian 11

Cómo configurar WireGuard VPN en Linux

    Requisitos de software y convenciones de la línea de comandos de Linux
    Categoría Requisitos, convenciones o versión de software utilizada
    Sistema Ubuntu 20.04 fosa focal
    Software guarda cables
    Otro Privilegios de raíz
    Convenciones # – requiere que los comandos de Linux dados se ejecuten con privilegios de root, ya sea directamente como usuario root o mediante el uso de sudo comando
    $ – requiere que los comandos de Linux dados se ejecuten como un usuario normal sin privilegios