OpenWrt: VPN con Wireguard

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,

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

Editamos la regla

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

Tambien 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/
comentario powered by Disqus