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
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
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,
- Una puerta a tu Raspberry teniendo IP dinámica
- Acceder at tu Rasbperry de forma segura
- El terminal de tu Raspberry desde un navegador
En cuanto a podcast,
- Episodio 52. Tu propia red virtual por tres euros
- Episodio 65. Navegar sin publicidad gracias a tu Raspberry
¿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,
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
aB
. - 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