134 - Bienvenida WireGuard. Adiós OpenVPN

134 - Bienvenida WireGuard. Adiós OpenVPN

En este episodio del podcast te cuento que he sustituido OpenVPN por WireGuard y como le he instalado tanto en la Raspberry como servidor como en clientes

1:25
-3:15

En estos últimos tiempos, dos grandes chismes entraron en mi vida digital. Por un lado, un chisme hardware, como es la Raspberry, que si bien fui inicialmente reticente a su entrada, definitivamente ha supuesto un antes y un después. El otro de los chismes, en este caso, un chisme software, ha sido, sin lugar a dudas las VPN. Eso de poder acceder a todos dispositivos como si me encontrara en la misma red es algo que da mucho, pero que mucho juego. Puedo estar de viaje y seguir experimentando con cualquiera de las Raspberry como si las tuviera en mi propia red local. Sin embargo, hasta la fecha, siempre he utilizado OpenVPN. Sin embargo, para un proyecto, que te comentaré el próximo jueves, Angel de uGeek, me recomendó que probara, WireGuard… y vaya, ha sido un acierto montar WireGuard en mi Raspberry.

Tanto es así, que actualmente, WireGuard, no solo está en mi Raspberry, sino que está en todas las Raspberry de mi granja… Pero no solo esto, sino que también, lo tengo ya en el móvil y por supuesto en mi portátil. Se ha convertido en mi VPN por defecto, desplazando a OpenVPN. ¿porque? Sinceramente, con el tiempo que lo llevo probando, que no es mucho, me está dando muy buenos resultados. Una respuesta rápida. Pero… escucha el podcast, donde te lo cuento todo con detalle.

Adiós OpenVPN, bienvenida WireGuard a mi Raspberry

Adiós OpenVPN, bienvenida WireGuard a mi Raspberry

En que ando metido

Artículos

En lo referente a los artículos esta semana he escrito dos artículos. Uno de ellos, referente a una extensión para Cinnamon y GNOME Shell, un Alt Tab supervitaminado. Esto te va a permitir ser mas productivo con este atajo de teclado.

El segundo de los artículos, no es mas que una recopilación de fondos de pantalla con motivos invernales. Se trata de dar un toque mas personal a tu escritorio. Para ello, he recopilado las imágenes seleccionadas por los chicos de OMG! Ubuntu!. Son imágenes de unsplash.com.

Este paquete simplemente recoge esas imágenes y las empaqueta para diferentes entornos de escritorio, KDE Plasma, Cinnamon, GNOME, MATE, XFCE, etc. De esta manera, las puedes utilizar fácilmente en tu equipo y darle un toque muy, pero que muy personal.

Si, tienes alguna imagen, típicamente de estas fechas, y quieres que forme de este paquete, no dudes en enviármela, y la incorporaré.

WireGuard en mi Raspberry

He hablado y escrito largo y tendido sobre las ventajas de utilizar una red privada virtual. Así, te recomiendo, los artículos,

En cuanto a podcast,

¿Que es WireGuard?

WireGuard es una VPN moderna y rápida, que utiliza cifrado de vanguardia. El objetivo de esta VPN es que sea mas rápida, simple, ligera, y mas útil que IPsec, y sobre todo mas sencilla de implementar. Pero no solo esto, sino que además está diseñada con el objetivo de ser mas eficiente que OpenVPN.

Se trata de una red virtual de propósito general, inicialmente liberada para el kernel de Linux, y que ahora es multiplataforma. Disponible para Windows, MacOS, BSD, iOS, Android.

Se encuentra en desarrollo, aunque ya se podría considerar la VPN mas segura, fácil de usar y simple de la industria. O al menos eso es lo que cuenta los desarrolladores de esa red.

Características de WireGuard

Algunas de las características de esta red virtual las he ido comentando hasta el momento, pero voy a profundizar un poco mas en ellas.

  • Se trata de una red virtual simple de configurar y desplegar. Realizar una conexión VPN es algo tan sencillo como intercambiar unas claves públicas. Del resto se encarga WireGuard.
  • Es capaz de viajar entre direcciones IP, de la misma forma que lo hace Mosh, el conocido como ssh móvil.
  • No necesitas gestionar conexiones, saber cual es el estado de las mismas, gestionar demonios, o preocuparte de lo que está sucediendo con WireGuard. WireGuard, tiene un interfaz básico pero potente.
  • WireGuard utiliza diferentes protocolos de cifrado que han sido revisados por criptógrafos.
  • Otra de las características de WireGuard, es que ha sido diseñado pensando en la simplicidad. Es mas, se ha implementado, con el menor número de líneas de código de forma que es fácilmente auditable para vulnerabilidades de seguridad.
  • Pero sobre todo, WireGuard, tiene un gran desempeño. Y tiene un gran desempeño por la combinación de dos factores. Por un lado por el cifrado elegido. Por el otro lado, por el hecho de que WireGuard reside en el núcleo de Linux. Estas dos características le confieren una gran velocidad. Así, WireGuard, lo puedes tener tanto en dispositivos como pueden ser móviles, como en cualquier otro tipo de dispositivo. De cualquier forma, actualmente los móviles, no se pueden considerar, dispositivos poco potentes, sobre todo los tope de gama.

Una comparativa para que veas las características de desempeño de esta herramienta,

desempeño de WireGuard

WireGuard en funcionamiento

WireGuard añade una (o varias) interfaces de red como las que ya tienes, eth0, o wlan0, pero esta vez wg0. Si tienes mas de una se llamarán wg1, wg2, etc.

Explicado el proceso de forma sencilla. Si tengo dos dispositivos un cliente A y un servidor B. El proceso es el siguiente,

  • Si quiero enviar de A a B.
  • Compruebo que se corresponde con un dispositivo de la red WireGuard. En su caso lo envío siguiendo este procedimiento.
  • Cifro el paquete con la clave pública de B.
  • Envío el paquete cifrado al endpoint B definido por una dirección IP o hostname, y un puerto UDP.

Cuando el dispositivo llega a B

  • Como está cifrado con su clave pública del servidor, B simplemente tiene que descifrar el paquete con su clave privada.
  • Una vez descifrado, comprueba quien se lo ha enviado, y si es de los dispositivos autorizados.
  • Si es de los dispositivos autorizados aceptará el paquete, y en otro caso, simplemente lo desechará.

Instalación en la Raspberry.

Actualmente el servidor lo tengo montado en una Raspberry Pi 3. Mientras que como clientes tengo varias Rasbperry Pi 4, mi portátil y el móvil. La instalación para la Rasbperry, me ha costado un poco mas, pero, he implementado un sencillo script basado en raspberrypiwereguar, que funciona razonablemente bien.

El script para Raspberry es el siguiente,

#!/bin/bash
if [ $(id -u) -eq 0 ] 
then
    apt-get update && apt-get upgrade -y
    apt-get install -y raspberrypi-kernel-headers dirmngr
    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B48AD6246925553 7638D0442B90D010 04EE7237B7D453EC 648ACFD622F3D138
    if [ -z "$(grep -E 'deb\s*https://deb.debian.org/debian/\s*unstable\s*main' /etc/apt/sources.list.d/unstable.list)" ]
    then
        echo "deb https://deb.debian.org/debian/ unstable main" | tee -a /etc/apt/sources.list.d/unstable.list
    fi
    if [ -z "$(grep -E 'Pin:\s*release\s*a=unstable' /etc/apt/preferences.d/limit-unstable)" ]
    then
        printf "Package: *\nPin: release a=unstable\nPin-Priority: 150\n" | tee -a /etc/apt/preferences.d/limit-unstable
    fi
    apt-get update && apt-get install -y wireguard
    sed -i "s/#*\s*net.ipv4.ip_forward\s*=\s*[01]/net.ipv4.ip_forward = 1/g" /etc/sysctl.conf
    sysctl net.ipv4.ip_forward
    reboot
else
    echo "Error: need to call this script as root, not as normal user!"
fi

Para ejecutar este script necesitas ganar derechos de administrador.

sudo ./instala_wireguard.sh

Por otro lado, he creado un sencillo script para la generación de la pareja de claves público, privada… esto no es necesario en absoluto, pero….

#!/bin/bash
if [ -z "$1" ]
then
    echo "Need the name of the client or server"
else
    name=$1
    wg genkey > $1_private.key
    wg pubkey > $1_public.key < $1_private.key
fi

Así para crear la pareja de claves tienes que ejecutar ./gen_keys.sh cliente1, lo que te generará cliente1_private.key y cliente1_public.key. Pon nombres identificables, no como yo, que les puse cliente1, cliente2 y así sucesivamente, y luego no recordaba quien era quien…

La configuración en mi servidor Raspberry Pi 3 es la que puedes encontrar a continuación, y que va en el archivo /etc/wireguard/wg0.conf

[Interface]
Address = 10.200.200.1/24
SaveConfig = true
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o wlan0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o wlan0 -j MASQUERADE
ListenPort = 51820
PrivateKey = <PRIVATE KEY OF SERVER>
[Peer]
PublicKey = <PUBLIC KEY OF CLIENT 1>
AllowedIPs = 10.200.200.5/32

[Peer]
PublicKey = <PUBLIC KEY OF CLIENT 2>
AllowedIPs = 10.200.200.25/32

[Peer]
PublicKey = <PUBLIC KEY OF CLIENT 3>
AllowedIPs = 10.200.200.45/32

[Peer]
PublicKey = <PUBLIC KEY OF CLIENT 4>
AllowedIPs = 10.200.200.65/32

[Peer]
PublicKey = <PUBLIC KEY OF CLIENT 5>
AllowedIPs = 10.200.200.85/32

Una vez instalado, solo tienes que iniciarlo. Para ello tan solo tienes que ejecutar,

sudo wg-quick up wg0

Para ver el estado del mismo,

sudo wg

Una vez has comprobado que todo funciona como se espera, habilita para que se ejecute en el inicio,

systemctl enable wg-quick@wg0.service

Instalación en un cliente Raspberry

La instalación en un cliente Raspberry, es la misma que en el servidor, pero tienes que cambiar la configuración del archivo /etc/wireguard/wg0.conf, para que sea la siguiente,

[Interface]
Address = 10.200.200.85/24
PrivateKey = <PRIVATE KEY OF CLIENT 5>

[Peer]
Endpoint = servidor.duckdns.org:51820
PublicKey = <PUBLIC KEY OF SERVER>
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 10

En mi caso, he indicado el servidor de mi DDNS tal y como comenté en el tutorial sobre una puerta a tu Raspberry teniendo IP dinámica.

Una vez establecida la configuración, solo te queda probarla. Para ello, al igual que en el caso del servidor, ejecuta,

sudo wg-quick up wg0

Comprueba el funcionamiento, y en su caso, si todo ha ido bien, habilita, tal y como hiciste previamente en el servidor,

systemctl enable wg-quick@wg0.service

Instalación en Android o en iPhone

Esto es tremendamente sencillo, porque en ambos casos, está disponible desde sus tiendas oficiales. De esta manera lo tienes instalado o nada.

Instalación en Ubuntu

Para instalarlo en Ubuntu, depende de la versión. Para el caso de Ubuntu Eoan, tan solo tienes que ejecutar,

sudo apt install wireguard

En el caso de versiones anteriores,

sudo add-apt-repository ppa:wireguard/wireguard
sudo apt-get update
sudo apt-get install wireguard

Para el resto de distribuciones, puedes seguir las recomendaciones de como instalar WireGuard.

Conclusión

En el próximo episodio, te contaré que es lo que voy a hacer con WireGuard en una isla.


Más información,

Imagen de portada de Jan Tinneberg en Unsplash

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *