Cómo instalar WireGuard VPN en Ubuntu 20.04 LTS

En esta entrada veremos cómo instalar WireGuard VPN en Ubuntu 20.04 LTS Focal Fossa paso a paso, de modo que puedas montar rápida y sencillamente tu propia VPN usando tu servidor o VPS Ubuntu, asegurando así la conexión a Internet cuando conectas tus dispositivos a través de redes poco confiables.

Antes de instalar WireGuard VPN en Ubuntu 20.04 LTS

Si quieres seguir los pasos de esta guía de instalación de WireGuard VPN en Ubuntu 20.04 LTS Jammy Jellyfish deberás cumplir estos requerimientos mínimos:

  • Una máquina Ubuntu 20.04 LTS Focal Fossa que actuará como servidor VPN.
  • Otra máquina Ubuntu 20.04 LTS Focal Fossa que actuará como cliente VPN.
  • Acceso a línea de comandos con un usuario con permisos de sudo.
  • Conexión a Internet.

En este tutorial configuraremos un servidor o VPS Ubuntu 20.04 LTS que funcionará como servidor WireGuard VPN, una máquina que tendrá dirección IPv4 pública fija al que conectaremos nuestros dispositivos, por ejemplo un portátil o notebook Ubuntu 20.04 LTS que podría acceder a Internet desde una conexión poco segura (como el WiFi de una cafetería, biblioteca, aeropuerto, etc.).

Cómo instalar WireGuard VPN en Ubuntu 20.04 LTS

Vamos a instalar WireGuard VPN en Ubuntu 20.04 LTS Focal Fossa, tanto el servidor VPN como el cliente, desde los propios repositorios de la distribución, por lo que actualizaremos las listas de paquetes:

~$ sudo apt update

E instalamos el paquete wireguard con apt:

~$ sudo apt install -y wireguard

Se instala el mismo software tanto en el servidor VPN como en el cliente ya que sólo es cuestión de configuración como actúa cada máquina.

A continuación vamos a crear en cada máquina Ubuntu 20.04 LTS el par de claves privada/pública.

Por ejemplo, en el servidor VPN:

~$ wg genkey |tee privatekey |wg pubkey > publickey

Ahora en el directorio de trabajo tendremos los ficheros privatekey y publickey conteniendo las claves privada y pública, respectivamente. Los ficheros como tal no son necesarios, pero los guardaremos en el directorio de configuración de WireGuard que se ha creado durante la instalación:

~$ sudo mv privatekey publickey /etc/wireguard/

Protegeremos estos archivos cambiando la propiedad de los mismos a root:

~$ sudo chown root: /etc/wireguard/{privatekey,publickey}

Y restringiendo su acceso a dicho usuario:

~$ sudo chmod 0600 /etc/wireguard/{privatekey,publickey}

Con estos archivos ya protegidos, examinaremos su contenido, tanto la clave privada:

~$ sudo cat /etc/wireguard/privatekey
mOj9ga5h+bDJ6+mlkcKw+SLg5dKnVPmfiJOL/RjK/Gk=

Como la clave pública:

~$ sudo cat /etc/wireguard/publickey
tJE3l5i49ICVrkH7TSzHuCEM3cjq+cdJmz1HSVPG7ng=

Este proceso lo habremos realizado también en los clientes Ubuntu 20.04 LTS que conectarán a la VPN.

Por ejemplo, en el cliente WireGuard VPN que utilizaremos en este tutorial consultamos su clave privada:

~$ sudo cat /etc/wireguard/privatekey
QM4npwdx1QFYvlul7SMi8FdnBl88Ka1oIUZxq52OG0E=

Y la clave pública:

~$ sudo cat /etc/wireguard/publickey
KJK6tcTyy5rbQ8OWsbKFXaCkfwLOsnC7ccddiQkzoz8=

Estos valores son los que usaremos en la configuración de la VPN WireGuard y los mostramos para facilitar la comprensión del resto de la guía, ya que coincidirán con los valores mostrados en la configuración.

Cómo configurar WireGuard VPN en Ubuntu 20.04 LTS

Ahora vamos a configurar WireGuard VPN en Ubuntu 20.04 LTS Focal Fossa, tanto en el servidor como en un cliente.

La configuración se realiza a través de un archivo que configura la interfaz de red virtual que usará la VPN. Se nombra al archivo con el típico nombre de interfaz de red, que para WireGuard suele ser wg0, por lo que podemos llamar a este archivo wg0.conf.

Configuración del servidor VPN WireGuard

Creamos el archivo de configuración del servidor VPN WireGuard en Ubuntu 20.04 LTS:

~$ sudo nano /etc/wireguard/wg0.conf

Comenzaremos creando la configuración de la interfaz de red añadiendo una sección Interface:

[Interface]
Address = 192.168.222.1
PrivateKey = mOj9ga5h+bDJ6+mlkcKw+SLg5dKnVPmfiJOL/RjK/Gk=
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o enp0s3 -j MASQUERADE

La configuración es muy sencilla.

Address indica la dirección IP privada que tendrá el servidor Ubuntu 20.04 LTS dentro de la VPN. Lógicamente el rango de la red privada que utilicemos no puede coincidir con el de cualquier otra interfaz de red tanto en el servidor como en los clientes. Normalmente las redes WiFi públicas suelen usar direcciones tipo 192.168.0.xxx, 192.168.1.xxx, etc.

PrivateKey es la clave privada del servidor VPN (la que creamos anteriormente).

ListenPort es el puerto en el que el servidor recibirá las conexiones de los clientes VPN, y podrías usar cualquier valor que esté disponible, aunque en este caso hemos dejado el valor por defecto.

PostUp y PostDown indican los comandos (usando el carácter ; como separador) que se ejecutarán al levantar y detener respectivamente la interfaz de red de la VPN. En este caso al activarse la interfaz se configurará el enmascaramiento entre el tráfico de la VPN e Internet, y al detenerse se elimina tal configuración.

Después de esta sección viene la sección o secciones Peer para configurar los clientes permitidos en la VPN. Puedes crear tantas secciones Peer como necesites:

...
[Peer]
PublicKey = KJK6tcTyy5rbQ8OWsbKFXaCkfwLOsnC7ccddiQkzoz8=
AllowedIPs = 192.168.222.51

[Peer]
...

[Peer]
...

En este bloque PublicKey es la clave pública de la máquina cliente y AllowedIPs es la dirección IP privada que tendrá el cliente dentro de la VPN, obviamente dentro del mismo rango que el servidor.

Configurados todos los clientes que necesitamos, ya podemos guardar y cerrar el archivo de configuración.

Para levantar la interfaz usaremos el comando wg-quick:

~$ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.222.1 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] ip -4 route add 192.168.222.51/32 dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE

Para que el servidor pueda enviar el tráfico que recibe de la VPN a Internet (y viceversa) habrá que permitir el enrutado, que por defecto suele estar deshabilitado:

~$ sudo sysctl net.ipv4.ip_forward=1

Por último, si tenemos activado el firewall UFW en el servidor Ubuntu 20.04 LTS, habrá que crear la regla que permita la conexión al puerto en que está a la escucha WireGuard:

~$ sudo ufw allow 51820/udp

Podemos comprobar el estado de la VPN con el comando sudo wg:

~$ sudo wg
interface: wg0
  public key: tJE3l5i49ICVrkH7TSzHuCEM3cjq+cdJmz1HSVPG7ng=
  private key: (hidden)
  listening port: 51820

peer: KJK6tcTyy5rbQ8OWsbKFXaCkfwLOsnC7ccddiQkzoz8=
  allowed ips: 192.168.222.51/32

como instalar wireguard vpn en ubuntu 20.04 lts focal fossa

Configuración permanente del servidor VPN

En caso de utilizar un VPS o un servidor Ubuntu 20.04 LTS en Internet disponible 24/7 puede ser interesante que la VPN esté disponible en cualquier momento. Para ello haremos permanente la configuración habilitando el servicio WireGuard para la interfaz wg0:

~$ sudo systemctl enable wg-quick@wg0

Y también habría que configurar el enrutado editando el archivo necesario:

~$ sudo nano /etc/sysctl.conf

Buscamos esta línea:

...
#net.ipv4.ip_forward=1
...

Y la activamos eliminando el carácter # al principio de la línea:

...
net.ipv4.ip_forward=1
...

Guardamos y cerramos el archivo.

Configuración de los clientes VPN WireGuard en Ubuntu 20.04 LTS

En cada cliente VPN WireGuard Ubuntu 20.04 LTS creamos el archivo de configuración de WireGuard, tal como hicimos en el servidor:

~$ sudo nano /etc/wireguard/wg0.conf

Añadimos la sección Interface para configurar la interfaz de red de la VPN:

[Interface]
Address = 192.168.222.51
PrivateKey = QM4npwdx1QFYvlul7SMi8FdnBl88Ka1oIUZxq52OG0E=
PostUp = sysctl net.ipv6.conf.enp0s3.disable_ipv6=1

En este caso Address es la dirección IP privada de la red VPN que reservamos para este cliente Ubuntu 20.04 LTS en la configuración del servidor. Por su parte, PrivateKey es la clave privada que se generó en el cliente.

Opcionalmente hemos añadido un comando en PostUp que se ejecutará al levantar la interfaz wg0 del cliente y que se encarga de desactivar el protocolo IPv6. El motivo de esto es que la mayoría de servicios económicos de VPS y servidores en Internet ofrecen dirección IPv4 pública, pero no IPv6. Podría darse el caso de que conectáramos a una red no segura que admita ambos protocolos, IPv4 e IPv6, y el tráfico IPv4 efectivamente se dirigiera a nuestra VPN, pero el IPv6 circulara por fuera de ella. Desactivando IPv6 nos aseguramos de que sólo conectemos a Internet a través de nuestra VPN WireGuard.

Continuamos con la configuración del cliente VPN y ya sólo nos queda el bloque Peer que en este caso es único porque hace referencia al servidor VPN:

...
[Peer]
PublicKey = tJE3l5i49ICVrkH7TSzHuCEM3cjq+cdJmz1HSVPG7ng=
Endpoint = XXX.XXX.XXX.XXX:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 20
  • PublicKey es la clave pública del servidor VPN.
  • Endpoint indica la dirección IP pública del servidor VPN y el puerto en el que WireGuard espera las conexiones.
  • AllowedIPs restringe el tráfico saliente de la VPN, indicando el valor 0.0.0.0/0 que se permite el tráfico a cualquier destino.
  • PersistentKeepalive es opcional y mantiene la conexión establecida para evitar caídas por inactividad.

Ya tendríamos toda la configuración necesaria, por lo que podemos guardar y cerrar el archivo.

Ahora levantamos el adaptador de red de la VPN:

~$ sudo wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 192.168.222.51 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] wg set wg0 fwmark 51820
[#] 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
[#] sysctl net.ipv6.conf.enp0s3.disable_ipv6=1
net.ipv6.conf.enp0s3.disable_ipv6 = 1

Y comprobamos el estado del adaptador:

~$ sudo wg
interface: wg0
  public key: KJK6tcTyy5rbQ8OWsbKFXaCkfwLOsnC7ccddiQkzoz8=
  private key: (hidden)
  listening port: 37455
  fwmark: 0xca6c

peer: tJE3l5i49ICVrkH7TSzHuCEM3cjq+cdJmz1HSVPG7ng=
  endpoint: XXX.XXX.XXX.XXX:51820
  allowed ips: 0.0.0.0/0
  latest handshake: 29 seconds ago
  transfer: 124 B received, 516 B sent
  persistent keepalive: every 20 seconds

instalar wireguard vpn en ubuntu 20.04 lts focal fossa

En el caso de que el servidor VPN estuviera en línea (como hemos hecho de forma cronológica en este tutorial), se puede observar que en el apartado peer se muestran datos del establecimiento de la conexión y resumen de tráfico recibido y enviado.

Cómo probar el funcionamiento de la VPN WireGuard en Ubuntu 20.04 LTS

Vamos a probar el funcionamiento de WireGuard VPN en Ubuntu 20.04 LTS Focal Fossa realizando algunas comprobaciones básicas.

El último comando lanzado en el cliente, de comprobación de estado de la VPN, mostró datos de la conexión actual, ya que el servidor VPN estaba funcionando. Si lanzamos el mismo comando en el servidor VPN ahora se mostrará también información similar:

~$ sudo wg
...
peer: KJK6tcTyy5rbQ8OWsbKFXaCkfwLOsnC7ccddiQkzoz8=
...
  latest handshake: 7 seconds ago
  transfer: 924 B received, 308 B sent

Si hubiera más clientes conectados se mostraría la información correspondiente.

Otra comprobación que podemos realizar es a nivel de ping, del servidor al cliente o del cliente al servidor, utilizando las direcciones IP privadas de la VPN.

Por ejemplo, del cliente de este tutorial al servidor:

~$ ping 192.168.222.1
PING 192.168.222.1 (192.168.222.1) 56(84) bytes of data.
64 bytes from 192.168.222.1: icmp_seq=1 ttl=64 time=0.538 ms
64 bytes from 192.168.222.1: icmp_seq=2 ttl=64 time=0.627 ms
64 bytes from 192.168.222.1: icmp_seq=3 ttl=64 time=0.583 ms

--- 192.168.222.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2048ms
rtt min/avg/max/mdev = 0.538/0.582/0.627/0.036 ms

O desde el servidor a cualquiera de los clientes:

~$ ping 192.168.222.51
PING 192.168.222.51 (192.168.222.51) 56(84) bytes of data.
64 bytes from 192.168.222.51: icmp_seq=1 ttl=64 time=0.434 ms
64 bytes from 192.168.222.51: icmp_seq=2 ttl=64 time=0.839 ms
64 bytes from 192.168.222.51: icmp_seq=3 ttl=64 time=0.550 ms
^C
--- 192.168.222.51 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2051ms
rtt min/avg/max/mdev = 0.434/0.607/0.839/0.170 ms

Finalmente, podemos empezar a mantener tráfico con Internet desde el cliente (visitando sitios web, viendo vídeos, etc.).

Si volvemos a comprobar el estado de la conexión veremos cómo se va incrementando el total acumulado de tráfico saliente y entrante:

~$ sudo wg
...
  latest handshake: 1 minute, 4 seconds ago
  transfer: 62.10 MiB received, 885.10 KiB sent
...

como instalar y configurar la vpn wireguard en ubuntu 20.04 lts focal fossa

Conclusión

Ahora que ya sabes cómo montar una VPN con WireGuard en Ubuntu 20.04 LTS Focal Fossa podrás navegar con mucha más seguridad cuando conectes tus dispositivos mediante accesos a Internet públicos o que ofrezcan poca confianza. Además, tendrás el control total de tu privacidad.

Si te ha surgido alguna duda o pregunta, quieres notificar algún error, realizar alguna sugerencia, etc. puedes dejar un comentario. Los comentarios están sujetos a moderación, para intentar evitar el SPAM, pero se revisan a diario.

¡Apoya comoinstalar.me!

¿Ya disfrutas de tu propia VPN gracias a esta pequeña guía? Si es así y quieres agradecérnoslo cualquier mínima aportación al mantenimiento y creación de nuevos artículos siempre es bienvenida.

Puedes ayudarnos dejando una propina de tan solo 1 $ desde PayPal:

O, si te sientes especialmente generoso, puedes invitarnos a un café:

¡Gracias!

Valora esta entrada

5/5 - (2 votos)

Deja un comentario