Wireguard VPN servidor y cliente: Introducción y Uso.

Wireguard

¿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.

WireGuard vs otros protocolos
Comparativa de Ancho de banda y tiempo de respuesta de los protocolos.

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

listando las key generadas
Excepto wg0.conf este archivo aun no estará, lo creamos mas adelante.

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
Funcionando en Mx linux
como puede obervar luego de usar wg-quick cambia nuestro ISP pues ya estamos usando la ip publica de nuestro servidor

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
como podemos observar en el servidor nos aparece nuestro peer (cliente) y podemos observar los megas que ha consumido navegando por internet.
como podemos observar en el servidor nos aparece nuestro peer (cliente) y podemos observar los megas que ha consumido navegando por internet.

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
Estoy usando XFCE la configuracion es similar en cualquier entorno grafico.
Estoy usando XFCE la configuración es similar en cualquier entorno gráfico Gtk.
Una imagen vale mas que mil palabras, creo que esta bastante claro.
Una imagen vale mas que mil palabras, creo que esta bastante claro.
LISTO ESTA FUNCIONANDO PERFECTAMENTE!!!
LISTO ESTA FUNCIONANDO PERFECTAMENTE!!!

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
Funciona perfectamente en gnome
Funciona perfectamente en Gnome
Testeado 100% con Gnome en ubuntu 18.04  LTS
Testeado 100% con Gnome en ubuntu 18.04 LTS

Extra

Windows 10 Pro

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

https://www.wireguard.com/install/
https://www.wireguard.com/install/

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

Save para guardar y procedemos a clickear en Activate si agregaron su config bien funcionara de una.
Save para guardar y procedemos a clickear en Activate, si agregaron su config bien funcionara de una.

100% FUNCIONAL SIN PROBLEMAS
ACTIVE 100% FUNCIONAL SIN PROBLEMAS

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/

You may also like...

1 Response

  1. Avatar RACM dice:

    I’ love thomas, you are my hero

Deja un comentario

Tu dirección de correo electrónico no será publicada.