OpenWrt: VPN con Wireguard
2018-06-28
Índice
Wireguard nos permite implementar un servidor VPN de una manera sencilla, sin las dificultades de configuración que puedan presentar otras soluciones como OpenVPN o IP2sec. Ademas el rendimiento es muy superior como puedes ver en esta comparativa,z
Wireguard viene implementado en el núcleo de OpenWRT y básicamente el funcionamiento seria parecido a una conexión ssh, la conexión entre dispositivos se realiza mediante el uso de claves publica y privada.
Instalación
Instalando el paquete luci-proto-wireguard y luci-app-wireguard que se encargaran de instalar las dependencias necesarias para poder crear nuestra VPN y administrarla desde LuCI.
opkg update
opkg install wireguard luci-proto-wireguard luci-app-wireguard
A continuación creamos una nueva Interface de red
Le ponemos un nuevo nombre a la interfaz y seleccionamos Wireguard VPN como protocolo.
Pulsamos en Guardar
Configurar Cortafuegos
Debemos de permitir las conexiones entrantes por el puerto UDP que hayamos configurado en Wireguard
Creamos una nueva regla de tráfico.
Abrimos el puerto UDP que corresponda, en mi caso 36889
Creamos una nueva zona para la interfaz creada para Wireguard
Marcamos la interfaz a la que va a afectar la nueva zona del cortafuegos
Y las zonas permitidas para el reenvío, las zonas wan y lan
Debería quedar así:
Configuración servidor
Ahora necesitaremos abrir una conexión ssh en el router y generar el par de claves, publica y privada, ejecutamos el siguiente código en el router.
wg genkey | tee privatekey | wg pubkey > publickey
Ahora desde LuCI, en la configuración de la interfaz que hemos creado rellenamos los campos según nuestras preferencias
- Private Key : La clave privada del router que hemos generado antes
- Listen Port : Puerto de escucha de las peticiones de conexión.
- IP Addresses: La dirección IP que va tener el servidor y su mascara de red.
Guardamos los cambios y reiniciamos el router.
Ahora desde el menú WireGuard Status
Vemos que ya tenemos funcionando el servidor
Configuración clientes
Voy a explicar los pasos necesarios para la utilizacion de Wireguard en entornos linux arch, debemos de instalar wireguard tools y wireguard-dkms, además deberás de tener instaladas las cabeceras del kernel que tengas instalado en tu sistema.
uname -a
Linux carlos 4.14.40-1-MANJARO #1 SMP PREEMPT Wed May 9 20:10:25 UTC 2018 x86_64 GNU/Linux
El kernel que tengo instalado es la version 4.14.4 por lo que las cabeceras del kernel que he de instalar son:
sudo pacman -S linux414-headers
Por cada cliente que se vaya a conectar al servidor vamos a necesitar crear su par de claves para poder realizar la conexión. Para crear el par de claves ejecutamos el siguiente código en cada cliente:
wg genkey | tee cliente1-privatekey | wg pubkey > cliente1-publickey
Ahora necesitamos crear el fichero de configuración para realizar la conexión con el servidor, evidentemente debemos de conocer la clave publica del servidor y la clave privada del cliente. En el ejemplo voy a crear el fichero casa.conf, los ficheros de configuración residen en /etc/wireguard/
# Definición de la Interfaz
[Interface]
# IP de cliente que tiene que coincidir con el permitido en el servidor
Address = 192.168.200.2/32
# Llave privada generada del cliente con 'wg genkey'
PrivateKey = xxxxxxxxxxx=
# DNS que utilizara el cliente
DNS = 192.168.200.1
# Definición del servidor al cual conectarse
[Peer]
# Se define la llave pública de dicho servidor
PublicKey = zzzzzzzzzzzz=
# IPs que enrutarán por esta interfaz, en este caso son todas, es decir, sería la puerta de enlace por defecto
AllowedIPs = 0.0.0.0/0
# Dirección del servidor de WireGuard
Endpoint = dominio.duckdns.org:36889
# Intervalo en segundos que WireGuard envía un paquete nulo para "mantener viva" la conexión. Esto es útil en casos de NAT para que el firewall mantenga el mismo IP asociado a la conexión.
PersistentKeepalive = 23
Antes de poder realizar la conexión debemos habilitar cada cliente en el router
Configuración de clientes en el router
Debemos de configurar cada cliente que se vaya a conectar en el router
Editamos la interfaz que hemos creado, y vamos añadiendo los peers (clientes) que necesitemos.
Rellenamos los campos:
- Public Key : Clave publica del cliente que se va a conectar
- Allowed IPs :IPs (con máscara) que puede tener el cliente que se conecte con esta llave
- Route Allowed IPs Permite enrutar las IPs permitidas para este peer.
- Endpoint Hosts : Opcional, si el cliente dispone de una ip fija o un DDNS, normalmente lo dejaremos en blanco.
- Endpoint Port : Puerto UDP de escucha en el cliente
- Persistent Keep Alive : Intervalo en segundos que WireGuard envía un paquete nulo para “mantener viva” la conexión.
En mi caso particular he tenido que reiniciar el router para que los cambios surtieran efecto.
Realizar la conexión con el servidor WireGuard
Una vez terminada la configuración de los clientes y el servidor , tan solo debemos de iniciar la conexión, casa.conf es el fichero de configuración que hemos creado antes en el cliente.
Linux
Desde un sistema con linux, en una terminal escribimos el siguiente código:
sudo wg-quick up /etc/wireguard/casa.conf
Vemos como levantamos la interfaz de red casa desde el fichero de configuración casa.conf
sudo wg-quick up /etc/wireguard/casa.conf
[sudo] password for carlos:
[#] ip link add casa type wireguard
[#] wg setconf casa /dev/fd/63
[#] ip address add 192.168.200.2/32 dev casa
[#] ip link set mtu 1420 dev casa
[#] ip link set casa up
[#] resolvconf -a casa -m 0 -x
[#] wg set casa fwmark 36889
[#] ip -4 route add 0.0.0.0/0 dev casa table 36889
[#] ip -4 rule add not fwmark 36889 table 36889
[#] ip -4 rule add table main suppress_prefixlength 0
Comprobamos que realmente se ha levantado la nueva interfaz de red
ip a
...
...
...
3: casa: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 192.168.200.2/32 scope global casa
valid_lft forever preferred_lft forever
Tambión podemos utilizar el comando wg
sudo wg
interface: casa
public key: yyyyyyyyyyyyyyyyy=
private key: (hidden)
listening port: 51787
fwmark: 0xca6c
peer: zzzzzzzzzzzzzzz=
endpoint: xx.xx.xxx.xx:51820
allowed ips: 0.0.0.0/0
latest handshake: 32 seconds ago
transfer: 188 B received, 4.21 KiB sent
persistent keepalive: every 25 seconds
Para Windows puedes utilizar TunSafe para realizar la conexión con el servidor.
Podemos comprobar en LuCI que clientes están conectados al servidor Wireguard
Android
Para dispositivos android existe la aplicación oficial para Wireguard que aunque está aun en su fase beta funciona decentemente, la puedes descargar tanto de Google Play como de F-Droid
Podemos crear la configuracion del cliente pulsando en el boton + y pulsando en Create from Scratch.
Al igual que hemos hecho con el cliente de escritorio, en el cliente para android rellenamos los campos correspondientes a la clave, privada. publica, etc.
Para finalizar pulsamos en el botón ADD PEER y activamos la conexión.
Podemos utilizar DNSLeaks para comprobar si realmente estamos conectados a nuestra VPN
Tambión podemos comprobar en el router los clientes el estado de los clientes
Por cada cliente que vayamos a conectar con el router, vamos a necesitar generar las claves publica y privada en el cliente y añadirlo como nuevo peer en el router como hemos visto.
Referencias:
-
https://www.sysadminsdecuba.com/2018/04/asegurando-nuestras-comunicaciones-con-wireguard/
-
https://www.redeszone.net/2016/06/30/wireguard-conoce-este-tunel-vpn-rapido-moderno-seguro/
Espero que te haya gustado, pasa un buen día. 🐧