Herramientas de usuario

Herramientas del sitio


informatica:software:internet:wireguard

¡Esta es una revisión vieja del documento!


WireGuard

Solución para crear túneles VPN. Más segura, moderna y eficiente que otras soluciones de código abierto como OpenVPN.

Servidor

WireGuard Easy

La forma más sencilla de instalarlo es mediante Docker con la imagen de

Una forma sencilla de instalarlo es mediante Docker con la imagen WireGuard Easy (repositorio en GitHub). Ejemplo del docker-compose.yml:

version: "3.8"
services:
  wg-easy:
    environment:
      # ⚠️ Required:
      # Change this to your host's public address
      - WG_HOST=raspberrypi.local
 
      # Optional:
      # - PASSWORD_HASH=f$$asdf/.oob$$51234ar123UYUADasd
      # - WG_PORT=51820
      # - WG_DEFAULT_ADDRESS=10.8.0.x
      # - WG_DEFAULT_DNS=1.1.1.1
      # - WG_MTU=1420
      # - WG_ALLOWED_IPS=192.168.15.0/24, 10.0.1.0/24
      
    image: weejewel/wg-easy
    container_name: wg-easy
    volumes:
      - .:/etc/wireguard
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1

Esta imagen provee también de un panel de administración web desde el que poder añadir y gestionar lo clientes de la VPN. Accesible desde http://ip.servidor.wireguard:51821

Para poder conectarnos a este servidor desde fuera de nuestra red local (Internet) es necesario realizar una redirección de puertos para que este puerto local pueda ser accesible desde el exterior.

Protección con contraseña

Básicamente:

docker run -it ghcr.io/wg-easy/wg-easy wgpw <TU_CONTRASEÑA>

Devolverá algo como:

PASSWORD_HASH='$2b$12$coPqCsPtcFO.Ab99xylBNOW4.Iu7OOA2/ZIboHN6/oyxca3MWo7fW' // literalmente sería <TU_CONTRASEÑA>

Utilizaremos la variable PASSWORD_HASH en el Docker Compose sin las comillas simples y sustituyendo cada $ por dos, es decir, $$:

version: "3.8"
services:
  wg-easy:
    environment:
      # ⚠️ Required:
      # Change this to your host's public address
      - WG_HOST=raspberrypi.local
      - PASSWORD_HASH=$$2b$$12$$coPqCsPtcFO.Ab99xylBNOW4.Iu7OOA2/ZIboHN6/oyxca3MWo7fW
      
    image: weejewel/wg-easy
    container_name: wg-easy
    volumes:
      - .:/etc/wireguard
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1

Manual

Otra opción es la imagen de Linuxserver

  • PEERS: indica el número de clientes para los que Wireguard creará configuraciones. Puede ser numérico o una lista de nombres (myPC, myPhone, myTablet…)
  • INTERNAL_SUBNET: subred que usarán los clientes conectados a la VPN.
  • SERVERURL: IP o dominio en el que está Wireguard.

Una vez arrancado, vamos a consultar los logs para poder ver el código QR que tendrá que escanear el primer cliente de esa VPN:

docker-compose logs -f --tail=10

Ejemplo de salida:

(...)
wireguard    | PEER 1 QR code:
wireguard    | █████████████████████████████████████████████████████████████████
wireguard    | █████████████████████████████████████████████████████████████████
wireguard    | ████ ▄▄▄▄▄ █▄█   ▀ ▀▀█▄ ▀▀█ ▄ ▀▄▄█ ▄▀▀▀▀ ▀▀█▀ ▀▀█▀▄ ██ ▄▄▄▄▄ ████
wireguard    | ████ █   █ █ █▀██▀█▀▄█▀▀▄▄▄▄▀█ █▄▀▄▀▄▄█ ▀▄▀▄▄▄█▀▄▀▄ ██ █   █ ████
wireguard    | ████ █▄▄▄█ █▄██▄▀█▀▄▄▄▀█▄▀▀█ ▄ ▄▄▄  ▄ ▀▄█  ▄▀██ █ ▀▄██ █▄▄▄█ ████
wireguard    | ████▄▄▄▄▄▄▄█▄█ ▀ █▄▀ ▀ █ ▀▄█ █ █▄█ █▄█▄█ ▀ █ ▀ █ ▀▄▀▄█▄▄▄▄▄▄▄████
wireguard    | ████▄▄  █▀▄█▄ ███▀▀██▄▀▄█▄▄▀ ▄▄ ▄▄ ▄█▀▄█▀ █▄▄▀ ▄█▀▄ ▀ ██▄▄▄▀ ████
wireguard    | ████ ▄ ▀▀██▀▄▄█▀ ▀ █ ▄▀▀▄ ▀▄██ ▀██▀█▀ ▄███▄▄▄████▄▄▄▄ ▀██▀▄ ▄████
wireguard    | ████   ▀  ▄▄ ▄▀▄ ▀▀ ▄ █▄▀ █   ▄ █ █▄██▄▄ █▀▀▀ █▄▀ ▄▀▄ ▀█▀▀▄█▀████
wireguard    | █████▀ ▄ ▄▄▄▄▀██▀██▀▄█▄ ██▄   ▄██    ▀▄▄▄██▀█▀ ▀▀█▄ █▄ ▀  ▀ █████
wireguard    | █████ ████▄  ▀▄▀█▀  ▀▀▀█▄ █▀▄ ▄▀▀ ██▄▀ ██▄▄▄█ █▀ ▀ ▀▄▄▄ █▄  █████
wireguard    | ████▀ ██▄▀▄█ █▄▀█▄▄▄▄▀▄██ █   ▀ █▀▀▄██ ▀▄  ▄▄█ ▀█▀▀▄▄▀ █▀██▄▀████
wireguard    | ████▀  ▄  ▄▀▀▄  ▀█▄ ▄ █ ▀▄▄▄▀██▄ █▀█▀█▄█▀ ▄▄▄ ▀▀█ ▄█  ▄ ▄ ▀▀█████
wireguard    | ████▀▄▀  ▄▄▄█▄█▄▄█ ▄▀▀██▀█ ██ ▄▄▀▀▄▄ ▀▄█▀  ▄█▄▄▄ █▄█▀██   █▄▄████
wireguard    | █████▄▄  ▄▄█▄▄▀ ▀▄▄ ▄  ▄  ▀ █ ██▀▄▄██▄▄█▄ ▀▀▀▄▄██▄▄▄▄▀▀▀▀▀▀▄█████
wireguard    | █████▀▄  ▄▄▄ ▀▄▄▄▄▀▄▀▀▀██ ▀█▄  ▄▄▄ █  ▀▄▄██ ▄█ ▄█ █▀ ▄▄▄  ▀ █████
wireguard    | █████▀▄  █▄█  ▀▀ ▄▄ ▀ ██ ▄ ██▀ █▄█  ▄▀ █▀█  █▄█▄▄ ▀  █▄█  ▄▄█████
wireguard    | ████ ▄▄█▄ ▄  ▄█▀ █▀█ █▄█ ▀▀▀▄▄ ▄  ▄▀▄▀█▄▄█ █▄ ▀▀▄▄▄   ▄▄▄██▄█████
wireguard    | ████ █▀▄█ ▄█ ▄███ ▀▄█▄█▀██ ▄ █▀▄██▀▄█▀▄▄█▀▄█▄ ▀▄▀▄██▄ ▀▄█▄▀▄▀████
wireguard    | ██████▄█  ▄▀▄█▀ █▀▀▄██▀▄▄█▀█▄ ▄ ▀▄██ ▀ █  █     ▀▄  ▀ ▄ ▀ █▄ ████
wireguard    | ████▀▄▀█▄█▄▀█  ▀  ▀ ▀▀▄▄▀ ▀█ █  ▀▄▄ ▀ ▄▀▄▄   ██▄█▄██ ▄▄▀▄▄█ ▀████
wireguard    | ████ ▀▀▀  ▄▀▄▀▄▄▄███▀▄▄██  ▀▄▀▀█▀▄▀▄ ▀▄ ██▄▄  █ ▀▄█ ▄▄▀▀▄ ▀▄█████
wireguard    | ████▀▀▄▀█▄▄  ▄▄██ █▀ █▀█▄▄█▀█▄█▀▀▄▀▀▄█▀▄██▄ █ █▀▄▄▀▄ █▄▀   █ ████
wireguard    | ████▄▀  ▀▀▄█▀ ▄ ███▄█ ▀▄  █▀ █  ██ █▀▄▄▀▄ ▄█ █▀█▄▀▄█ ▄█▄▄███▀████
wireguard    | ████    ▀ ▄▀█ ▀ ▄▄ ▄▄▄  ▄█▄█ ▄█▀▄▄█▀██▄▄▀ █▄▄▄▀███▄▀▄██▄▄   ▀████
wireguard    | ████ ▀ ▀▀▄▄█▄▀▀█▄▄ █▄█▀█ █▀▀▀▀██▀██▀ ▄ ▄▀██ █  ▀ ▀  ▀▄▄▀▀▄▄▄▄████
wireguard    | ██████████▄█ ▀▄▄▄  █▄█ ▄  ▄  ▀█▄█ ▄▀▀▄█▄▄▀▀ ▀▄▄▄█▀▄█ ▄▄▄ ▄█ █████
wireguard    | ████ ▄▄▄▄▄ ██▄█▄▄▄▀█▄█▄█▄▀▄▄▀▄ █▄█ █ ▄▀▄▀▄▄▄█▀   ▀▄▄ █▄█  ▀▄▀████
wireguard    | ████ █   █ █▀ ▄▀▄▄█▄▀▄██ ▄▄███ ▄▄▄   ▀ █ ▄██▀▀▄ ▄ ▀▄   ▄▄   █████
wireguard    | ████ █▄▄▄█ █ ▄ ██  █▀█▀█ ▀▀ ▄ ▄▀▄  █ ▄▀▄▄▀ ▄▄█▀▀███    ██▄▄█▀████
wireguard    | ████▄▄▄▄▄▄▄█▄▄██▄▄█▄█▄██▄█▄█▄██████▄██████▄▄▄██▄█▄▄▄▄▄▄▄▄▄▄██████
wireguard    | █████████████████████████████████████████████████████████████████
wireguard    | █████████████████████████████████████████████████████████████████
wireguard    | [cont-init.d] 30-config: exited 0.
wireguard    | [cont-init.d] 99-custom-scripts: executing...
wireguard    | [custom-init] no custom files found exiting...
wireguard    | [cont-init.d] 99-custom-scripts: exited 0.
wireguard    | [cont-init.d] done.
wireguard    | [services.d] starting services
wireguard    | [services.d] done.
(...)

Variables SERVERURL, SERVERPORT, INTERNAL_SUBNET and PEERDNS are optional variables used for server mode. Any changes to these environment variables will trigger regeneration of server and peer confs. Peer/client confs will be recreated with existing private/public keys. Delete the peer folders for the keys to be recreated along with the confs.

Si queremos volver a crear las claves y configuraciones, basta con eliminar los directorios peer, dentro de config.

Para añadir más clientes/peers, aumentamos el valor de la variable de entorno PEERS y recreamos el contenedor.

Si queremos volver a ver los códigos QR de los clientes/peers activos:

docker exec -it wireguard /app/show-peer 1 4 5

También sería válido:

docker exec -it wireguard /app/show-peer myPC myPhone myTablet

Los códigos QR también se almacenan en el directorio config como imágenes PNG

Cliente

NetworkManager

NetworkManager tiene soporte native para configurar interfaces de WireGuard. Una vez generado en el servidor el fichero de configuración para un cliente, podemos usar nmcli para crear el perfil de conexión de la siguiente manera:

# nmcli connection import type wireguard file /fichero/wireguard/cliente.conf
informatica/software/internet/wireguard.1726480969.txt.gz · Última modificación: por tempwin