
Contenido
- ¿Que es WireGuard?
- ¿Como instalar el modulo WireGuard y sus tools ?
- Repositorio
- Requisitos para la compilación
- Compilación e instalación
- Configuración del Servidor y Cliente
- Creando la configuración de WireGuard en el servidor
- Creando la configuración de WireGuard en el cliente
- Openresolv
- Arrancando los servicios e iniciando la conexión
- Agregando Network-Manager VPN Plugin para wireguard en cliente
- Extra
¿Que es WireGuard?
WireGuard es una aplicación de software libre y de código abierto que funciona como un protocolo de comunicación que implementa técnicas de red privada virtual (VPN) para crear conexiones seguras de punto a punto en configuraciones enrutadas o puenteadas.
Se ejecuta como un módulo dentro del kernel de Linux y tiene como objetivo un mejor rendimiento que los protocolos de túnel IPsec y OpenVPN.

A partir de junio de 2018, los desarrolladores de WireGuard recomendaron tratar el código y el protocolo como experimentales, y advierten que aún no han logrado una versión estable compatible con el seguimiento CVE de cualquier vulnerabilidad de seguridad que pueda descubrirse.
El 9 de diciembre de 2019, David Miller, el principal responsable de la pila de red de Linux, aceptó los parches WireGuard en el árbol de mantenimiento «net-next», para su inclusión en un núcleo próximo.
WireGuard esta programado para incorporarse a la versión 5.6 del kernel.
Protocolo
WireGuard utiliza Curve25519 para el intercambio de claves, ChaCha20 para el cifrado y Poly1305 para la autenticación de datos, SipHash para claves de tabla hash y BLAKE2s para el cifrado. Admite la capa 3 para IPv4 e IPv6 y puede encapsular v4-in-v6 y viceversa.
¿Como instalar el modulo WireGuard y sus tools ?
La documentación oficial ofrece un método bastante sencillo para la mayoría de las distribuciones Linux desde el fuente compilando el modulo y luego instalándolo, algunas distros ya tienen disponible los paquetes en su repositorio y no hará falta compilar.
La instalación del modulo se debe hacer tanto en el cliente como en el servidor, una vez halla salido la versión 5.6 del kernel y dispongamos de ella no sera necesario esto.
Repositorio
Instalación desde los repositorios en algunas distros, una vez instalados seguimos con la «configuración del servidor y cliente», si tu distro no esta aquí no te preocupes la instalación desde las fuentes en sumamente sencilla.
En Arch ya tenemos disponible la versión 5.6 del kernel no siendo necesario esto.
Arch / Arco / Manjaro
$ pacman -Syu $ pacman -S wireguard-arch wireguard-tools
OpenSUSE Leap 15.1
$ zypper ar http://download.opensuse.org/repositories/home:/-miska-/openSUSE_Leap_15.1/home:-miska-.repo $ zypper ar http://download.opensuse.org/repositories/home:/-miska-:/kernel-stable/openSUSE_Leap_15.1/home:-miska-:kernel-stable.repo $zypper update && zypper install wireguard wireguard-tools
Alpine
$ apk add wireguard-lts $ apk add wireguard-tools-wg wireguard-tools-wg-quick
Requisitos para la compilación
WireGuard requiere la versión de kernel Linux ≥3.10 o superior, con las siguientes opciones de configuración, que probablemente ya estén configuradas en su núcleo, especialmente si está instalado a través del repositorio de la distribución.
CONFIG_NET para soporte básico de redes
CONFIG_INET para soporte básico de IP
CONFIG_NET_UDP_TUNNEL para enviar y recibir paquetes UDP
CONFIG_CRYPTO_ALGAPI para crypto_xor
Debian 10 / Ubuntu 18.04 / Mint 19.3 / ZorinOS 15.1 / Mx
$ sudo apt-get install libmnl-dev libelf-dev linux-headers-$(uname -r) build-essential pkg-config
Red Hat Enterprise Linux / CentOS / Fedora 31
$ sudo yum install libmnl-devel elfutils-libelf-devel kernel-devel pkgconfig "@Development Tools"
Gentoo
$ emerge libmnl
Compilación e instalación
Clonamos estos 2 repositorios, procedemos a compilar con make y luego instalamos con sudo make.
$ git clone https://git.zx2c4.com/wireguard-linux-compat $ git clone https://git.zx2c4.com/wireguard-tools
$ make -C wireguard-linux-compat/src -j$(nproc) $ sudo make -C wireguard-linux-compat/src install
$ make -C wireguard-tools/src -j$(nproc) $ sudo make -C wireguard-tools/src install
Configuración del Servidor y Cliente
De aquí en adelante recomiendo usar el usuario root, crearemos un directorio en /etc/ con el nombre de wireguard y dentro del directorio aplicaremos un umask 077 el cual nos permite leer, escribir y ejecutar permisos para el propietario del archivo en este caso root, pero prohíbe los permisos de lectura, escritura y ejecución para todos los demás usuarios.
$ su $ mkdir /etc/wireguard $ cd /etc/wireguard $ umask 077
Generando las keys server-cliente
Server
Con el siguiente Comando generaremos las claves, privada y publica.
$ wg genkey | tee /etc/wireguard/privatekey | wg pubkey > /etc/wireguard/publickey
Este paso es opcional y nos sirve para generar una clave pre-compartida (pre-shared key) para proporcionar un nivel de protección cuántica .
$ wg genpsk > psk
Esta key la generaremos una sola vez y la usaremos tanto en el servidor como en los clientes.
Si listamos los archivos en nuestro directorio actual veremos todas las keys que generamos anteriormente

Cliente
La llaves del cliente se generan de la misma manera que en el servidor y no es necesario usar otra clave pre-compartida, usaremos en el cliente la misma que generamos en el servidor, usaremos estas llaves mas adelante para acoplar el cliente con el servidor.
Configuración de red del Servidor
La configuración del servidor varia un poco dependiendo de el firewall , yo estoy usando Firewalld.
Activamos el masquerading en nuestra zona predeterminada.
$ firewall-cmd --zone=public --add-masquerade --permanent $ firewall-cmd --zone=public --add-port=51820/udp --permanent $ systemctl restart firewalld
Activaremos el reenvió de paquetes IP esto varia en distribuciones.
Red Hat Enterprise Linux / Centos / Fedora 31 / OpenSUSE Leap 15.1
Editamos el archivo /etc/sysctl.conf y agregamos las siguientes lineas si no necesitan ipv6 no lo coloquen.
net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding=1
Recargamos las configuraciones para que se apliquen los cambios
$ sysctl -p
Debian 10 / Ubuntu 18.04 / Mint 19.3 / ZorinOS 15.1
Abrimos el archivo /etc/sysctl.conf , buscamos las lineas #net.ipv4.ip_forward=1 y #net.ipv6.conf.all.forwarding=1 las descomentamos, guardamos los cambios y procedemos a recargar las configuraciones con los siguientes comandos.
Si no necesitan ipv6 no la coloquen.
$ sysctl -p /etc/sysctl.conf $ /etc/init.d/procps restart
Arch / Arco / Manjaro
Ejecutamos en la shell
$ sysctl -w net.ipv4.ip_forward=1 $ sysctl -w net.ipv6.ip_forward=1
Para hacerlo permanente abrimos el archivo /etc/sysctl.d/99-sysctl.conf
y agregamos
net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding=1
Si no necesitan ipv6 no la coloquen.
Creando la configuración de WireGuard en el servidor
Crearemos el archivo de configuración de nuestro adaptador en el servidor nano /etc/wireguard/wg0.conf al cual le agregaremos lo siguiente
[Interface] Address = 192.168.2.1/24, fd00:7::1/48 #rango de ip PrivateKey = <LLAVE_PRIVADA_SERVIDOR> PostUp = firewall-cmd --zone=public --add-port 51820/udp && firewall-cmd --zone=public --add-masquerade PostDown = firewall-cmd --zone=public --remove-port 51820/udp && firewall-cmd --zone=public --remove-masquerade ListenPort = 51820 #puerto donde escuchar el servidor [Peer] # datos y keys del cliente PublicKey = <LLAVE_PUBLICA_CLIENTE> PresharedKey = LpI+UivLx1ZqbzjyRaWR2rWN20tbBsOroNdNnjKLMQ= AllowedIPs = 192.168.2.2/32, fd00:7::2/48 #ip de cliente permitida
Creando la configuración de WireGuard en el cliente
En la pc cliente creamos el siguiente archivo /etc/wireguard/wg0.conf el cual contendrá los siguientes datos y le agregamos nuestra configuración personal.
[Interface] Address = 192.168.2.2/32, fd00:7::2/48 PrivateKey = <LLAVE_PRIVADA_CLIENTE> DNS = 8.8.8.8 [Peer] PublicKey = <LLAVE_PUBLICA_SERVIDOR> PresharedKey = LpI+UivLx1ZqbzjyRaWR2rWN20tbBsOroNdNnjWKLM= AllowedIPs = 0.0.0.0/0, ::/0 Endpoint = <IP_REAL_SERVIDOR>:51820 PersistentKeepalive = 30
Openresolv
En algunas distribuciones es posible que tengamos problemas a la hora de activar el servicio wg0 con systemd debido a que el sistema no puede general nuestra configuración DNS la solución la siguiente, instalar openresolv.
$ git clone https://gist.github.com/60fcd25856c527949208fdb6004f906c.git $ cd 60fcd25856c527949208fdb6004f906c $ chmod +x install-openresolv-All-Linux-Dist $ ./install-openresolv-All-Linux-Dist
Arrancando los servicios e iniciando la conexión
wg-quick
Si estamos usando una distribución que no usa SYSTEMD lo haremos de forma «manual» con la herramienta wg-quick y es muy sencillo ya con nuestro archivo wg0.conf creado.
Levantamos nuestra conexion con los siguientes comandos, tanto en el cliente como en el servidor si ninguno posee systemd.
$ wg-quick up wg0

El siguiente comando desactiva la conexion
$ wg-quick down wg0
SYSTEMD
Ahora veremos como levantar con SYSTEMD la interfaces wg0 en ambos lados (cliente-servidor) para iniciar la conexión.
Tanto en el servidor como en el cliente ejecutamos los siguientes comandos
$ systemctl start wg-quick@wg0 #iniciamos el servicio y empieza la conexion vpn $ systemctl status wg-quick@wg0 #veremos el estado del servicio $ systemctl enable wg-quick@wg0 # opcional para que se ejecute al inicio del sistema automáticamente
Si queremos agregar otro cliente solo debemos agregar un nuevo peer en wg0.conf en el servidor, también podemos crear otras interfaces de red para conexiones independientes aisladas de la misma forma descrita ya, solo colocando otro nombre distinto a wg0.conf.
Chequeamos que todo funciona bien
$ wg

Pueden ir y comprobar en su cliente que la ip ya no es la de su proveedor de internet en la web https://www.cual-es-mi-ip.net/ veremos que la ip publica es la de nuestro servidor.
Agregando Network-Manager VPN Plugin para wireguard en cliente
Para que podamos conectar y desconectar a la vpn en nuestro cliente con la interfaz gráfica de NetworkManager instalaremos el siguiente plugin
Arch / Arco / Manjaro
$ yay -S networkmanager-wireguard-git
Debian 10
$ apt update && apt upgrade $ apt install build-essential autoconf libglib2.0-dev libtool intltool gtk+-3.0 libnma-dev libsecret-1-dev network-manager libnm-dev network-manager-openvpn dh-autoreconf $ git clone https://gist.github.com/27f50ffe0ff03807e710f04a2fc0917d.git $ cd 27f50ffe0ff03807e710f04a2fc0917d $ chmod +x network-manager-wireguard-buster.sh $ ./network-manager-wireguard-buster.sh
Fedora 31
$ dnf update $ dnf install glib2-devel intltool gtk3-devel NetworkManager-libnm libnma-devel libsecret-devel NetworkManager-openvpn $ git clone https://gist.github.com/feb62272524d26c0a05b47339eea6ad1.git $ cd feb62272524d26c0a05b47339eea6ad1 $ chmod +x wireguard-network-manager-fedora-suse.sh $ ./wireguard-network-manager-fedora-suse.sh



Ubuntu 18.04 / Mint 19.3 / ZorinOS 15.1
$ apt update && apt upgrade
$ apt install libtool libglib2.0-dev pkg-config autoconf automake intltool build-essential libgtk-3-dev libnma-dev libsecret-1-dev libnm-util-dev libnm-glib-dev libnm-glib-vpn-dev libnm-gtk-dev
network-manager-openvpn
$ git clone https://gist.github.com/e1ccd35fdf8c2e9786e0af37fe04dcc6.git
$ cd e1ccd35fdf8c2e9786e0af37fe04dcc6
$ chmod +x wireguard-network-manager.sh
$ ./wireguard-network-manager.sh


Extra
Windows 10 Pro
Descargamos el cliente para Windows desde los siguientes enlaces, hay versiones para 64 y 32 bit.

https://download.wireguard.com/windows-client/wireguard-amd64-0.0.38.msi
https://download.wireguard.com/windows-client/wireguard-x86-0.0.38.msi
La configuración es igual que en linux, abrimos nuestro cliente y agregamos un nuevo túnel haciendo click en Add Tunnel > Create new tunnel


Android
Tenemos un articulo referente a como instalar y configurar el cliente para android en esta mismo blog wireguard-en-android-configuracion
Notas del autor y referencias
Esta es una de las múltiples formas de buildear nuestra VPN con wireguard, siguiendo el principio KISS de Arch Linux describí aquí una forma rápida y sencilla de hacerlo.
Este articulo es una recopilación de múltiples artículos y documentación (fusión) conseguida en la web puesta en practica por mi hasta conseguir funcionalidad.
https://fedoramagazine.org/build-a-virtual-private-network-with-wireguard/
https://wiki.archlinux.org/index.php/WireGuard
https://www.wireguard.com/compilation/
https://elrincondehackingteam.blogspot.com/2019/06/wireguard-docs.html
https://www.reddit.com/r/Fedora/comments/e2xdje/wireguard_resolvconf_dns_configuration_could_not/

Administrador de sistemas, un curioso amante de las tecnologías.
I’ love thomas, you are my hero