Wireguard VPN: 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.

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 [email protected]  #iniciamos el servicio y empieza la conexion vpn

$ systemctl status [email protected] #veremos el estado del servicio

$ systemctl enable [email protected] # 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.