Para seguir el proceso de migración de mi Home Lab desde una pequeña Raspberry Pi 4 a un OptiPlex 7050 ejecutando Proxmox ahora le toca el turno a WireGuard, una VPN extremadamente simple pero rápida y moderna que utiliza criptografía de última generación.

En esta ocasion, en lugar de realizar la instalación de WireGuard en Docker, se utilizará un contenedor ligero LXC de Proxmox con TurnKey Core. El procedimiento para crear este LXC es el mismo que usé para ejecutar Docker en Proxmox LXC.

Características del LXC

Esta VPN con WireGuard se ejecutará sobre un LXC con las siguientes características:

  • LXC no privilegiado, con nesting y sin keyctl
  • CT ID: 303
  • Hostname: wireguard
  • Password + SSH key file
  • Disco: 2GB en local_lvm
  • CPU: 1 core
  • Memoria: 512MB
  • IP estática: 192.168.1.83/24
  • Gateway: 192.168.1.1
  • Dominio: home
  • DNS: 192.168.1.81 192.168.1.82

A continuación se pone en marcha el LXC desde la CLI de Proxmox y se procede a configurarlo de la misma manera que ya expliqué en el artículo sobre LXC y Docker:

pct start 303

Acceder al LXC

Se puede acceder al LXC utilizando la opción Console de la GUI o, mucho mejor, mediante SSH gracias a la configuración de las claves públicas que se hizo en el mismo:

ssh root@192.168.1.83

A continuación se realiza la configuración habitual:

  • First Boot Configuration: Skip / Skip / Install
  • Advanced Menu: Quit
  • Zona horaria Europe/Madrid con dpkg-reconfigure tzdata
  • Actualizar con apt update && apt upgrade -y
  • Reiniciar con reboot

Instalación de PiVPN

La instalación de WireGuard usando PiVPN es muy sencilla usando el script install.sh:

cd ~
wget -O install.sh https://install.pivpn.io
bash install.sh

Si se cumplen los requisitos para instalar WireGuard, se ejecutará el asistente PiVPN Automated Installer mediante el cual se proporcionará la información necesaria para la instalación:

  • Force routing to block IPv6 leak: No
  • Local user: wireguard
  • Password: ********
  • Choose VPN: WireGuard

Al finalizar la instalación, si no hay ningún problema, continuarán las preguntas del asistente:

  • Default WireGuard port: 51821
  • DNS Provider: Custom
  • Upstream DNS providers: 9.9.9.9, 149.112.112.112
  • Public IP or DNS: DNS Entry
  • Public DNS: wireguard.myhome.com
  • Unattended upgrades: Yes
  • Reboot: Yes

Nota: Se puede utilizar el comando pivpn para añadir clientes, depurar problemas, generar códigos QR, etc. Pero antes es necesario modificar el fichero /etc/pivpn/wireguard/setupVars.conf para cambiar las redes que se enrutarán a través de la VPN.

# Originales
ALLOWED_IPS="0.0.0.0/0"
# Nuevas
ALLOWED_IPS="192.168.1.0/24"

Añadir clientes

Para añadir un cliente se utiliza el comando pivpn -a -n client1:

root@wireguard ~# pivpn -a -n client1
::: Client Keys generated
::: Client config generated
::: Updated server config
::: WireGuard reloaded
======================================================================
::: Done! manel.conf successfully created!
::: client1.conf was copied to /home/wireguard/configs for easytransfer.
::: Please use this profile only on one device and create additional
::: profiles for other devices. You can also use pivpn -qr
::: to generate a QR Code you can scan with the mobile app.
======================================================================

A continuación se usa el comando pivpn -qr client1 para mostrar el código QR que permite añadir el perfil en un cliente móvil de forma fácil:

Código QR WireGuard

Actualización de WireGuard

La actualización de PiVPN se realizaba usando el comando pivpn -up pero, desde el año 2020, los componentes de la VPN (WireGuard) se actualizan mediante:

apt update && apt upgrade -y

DNS privado en Android

Android 9+ admite DNS sobre TLS para proteger las consultas mediante cifrado. Esta opción, llamada DNS privado, se encuentra en AjustesRedes e InternetAvanzadoDNS privado.

Para configurar esta opción se selecciona la opción Nombre de host del proveedor de DNS privado y se introduce el proveedor que se desee utilizar, por ejemplo:

  • Quad9:
    • Malware Blocking, DNSSEC Validation: dns.quad9.net
    • Malware blocking, DNSSEC Validation, ECS enabled: dns11.quad9.net
  • Cloudflare:
    • DNS Resolver: one.one.one.one
    • Block malware for Families: security.cloudflare-dns.com
    • Block malware and adult content for Families: family.cloudflare-dns.com

A diferencia de las versiones anteriores de Android, este método también garantiza que no sea necesario configurar un DNS propio para cada nueva red Wi-Fi a la que se una el teléfono inteligente.

En algunos teléfonos, por ejemplo en mi Pixel 7a con GrapheneOS, al configurar esta opción y activar WireGuard se pierde la conexión a Internet. Esto es debido al hecho de no poder enrutar las peticiones DNS a través de la VPN por una configuración incorrecta de la misma.

Para evitar este problema, únicamente hay que añadir la dirección o direcciones IP del DNS privado a la lista de direcciones permitidas en el fichero /etc/pivpn/wireguard/setupVars.conf:

ALLOWED_IPS="192.168.1.0/24, 9.9.9.9/32, 149.112.112.112/32"

Referencias

Historial de cambios

  • 2023-11-19: Artículo original
  • 2023-12-11: Cambio de los DNS públicos a Quad9
  • 2024-02-12: Cambio en Allowed IPs para soportar DNS privado en Android