====== WireGuard ====== Solución para crear túneles VPN. Más segura, moderna y eficiente que otras soluciones de código abierto como OpenVPN. * [[https://www.wireguard.com/|Web oficial]] ===== 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 [[https://github.com/wg-easy/wg-easy|WireGuard Easy]] ([[https://github.com/wg-easy/wg-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=midominio.com # 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: ghcr.io/wg-easy/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 Devolverá algo como: PASSWORD_HASH='$2b$12$coPqCsPtcFO.Ab99xylBNOW4.Iu7OOA2/ZIboHN6/oyxca3MWo7fW' // literalmente serí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 * [[https://github.com/wg-easy/wg-easy/blob/master/How_to_generate_an_bcrypt_hash.md|wg-password]] ==== Manual ==== Otra opción es la [[https://hub.docker.com/r/linuxserver/wireguard|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 ===== * Cliente Android en [[https://play.google.com/store/apps/details?id=com.wireguard.android&hl=es|Google Play]] o [[https://f-droid.org/en/packages/com.wireguard.android/|F-Droid]] * [[https://download.wireguard.com/windows-client/|Cliente Windows]] ==== 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