Instalar servidor VPN Wireguard en HG556A

Vamos a describir como instalar un servidor de VPN  llamado Wireguard en Openwrt en un router Huawei HG556A. Con él podremos conectarnos desde un lugar remoto a través del Internet de casa o de la empresa.

Dicha conexión se hará cifrada y conseguiremos conectarnos desde un Internet inseguro (Hotel, Aeropuerto, Centro comercial …) con la conexión de casa o de la empresa, y acceder a los dispositivos de la red de la empresa así como a los dispositivos que se conectan con nuestra VPN.

La configuración de Wireguard es muy sencilla y por lo que he comprobado la conexión resultante es más veloz que OpenVpn que es la que usaba normalmente. Según la página web tiene muchos aspectos interesantes y en velocidad supera a las más populares.

Vamos a seguir el siguiente esquema:

Vamos a poner el router servidor de VPN entre el router que nos presta el servicio de Internet y nuestra red.

En nuestra red interna, los dispositivos conectados tendrán una dirección IP del rango 192.168.100.0/24.

Nuestra red Intermedia será 192.168.1.0/24.

Con esta configuración conseguiremos que:

  • Los dispositivos que se conecten a nuestra VPN tengan salida a Internet a través de nuestra red y además accedan a los dispositivos (impresoras, servidores, etc…) conectados a la red interna.
  • También podrán conectarse entre si los dispositivos que accedan a través de la VPN.

Resumen de pasos a seguir:

  1. Asignar boca de WAN en el router con Openwrt que usaremos como servidor VPN de Wireguard.
    1.1 Conectamos nuestro equipo al router y le ponemos la IP 192.168.100.1.
    1.2 Asignamos la boca de WAN y le ponemos una dirección IP del rango de nuestra red (192.168.1.0/24).
  2. Instalar paquetes necesarios.
    2.1 Conectamos la boca de Wan a nuestro router principal y verificamos que tenemos Internet.
    2.2 Instalamos los paquetes necesarios para que funcione.
  3. Generar claves privada y pública del servidor VPN.
  4. Generar claves privada y pública en clientes y configurar cliente VPN.
  5. Configurar servidor VPN.
  6. Configurar el firewall del servidor.
  7. Consideraciones finales.

Como norma antes de hacer nada, siempre debemos resetear el router y dejarlo con los valores de fábrica.

1. Asignar boca de WAN en el router con Openwrt que usaremos como servidor VPN de Wireguard.

Con este paso lo que hacemos es asignar una de las bocas del switch como boca de WAN. Al hacer esto, nuestro router separará las dos redes y podremos instalar paquetes en él. Usaremos como boca de WAN etiquetada como LAN4:

1.1 Conectamos nuestro equipo al router y le ponemos la IP 192.168.100.1.

Por precaución,  conectamos nuestro equipo al router por una boca del medio ya que vamos a asignar LAN4 como boca de WAN.

Éste nos dará una dirección del rango 192.168.1.0/24.

Accedemos con el navegador a la dirección IP 192.168.1.1 y entramos en la configuración de la red en Network -> Interfaces.

Iremos a editar la configuración de LAN:

Le pondremos al router la dirección IP 192.168.100.1 y aplicamos la configuración:

En este momento perderemos el control del router. Tenemos que desconectar el cable de red y volverlo a conectar para que nuestro ordenador pille una dirección IP del rango nuevo que le acabamos de poner al router (192.168.100.0). A partir de aquí, para configurar el router lo haremos a través de la IP 192.168.100.1.

1.2 Asignamos la boca de WAN y le ponemos una dirección IP del rango de nuestra red (192.168.1.0/24).

Ahora toca crear la boca de WAN. Esta boca es la que conectaremos a la que llamamos red intermedia o nuestra red de acceso a Internet.

Quedará de la siguiente forma:

Accedemos a la configuración del router en la IP 192.168.100.1 y vamos a la configuración de VLANS. Network -> Switch

Dentro creamos una VLAN nueva dejando en la VLAN 1 las bocas 1,2 y 3, y en la VLAN 2 la boca 4.

Le damos a Guardar y aplicar y luego volvemos a Network -> Interfaces para crear una interfaz nueva:

 

Accedemos a Añadir nueva Interfaz

A continuación le damos un nombre, WAN en nuestro caso. La vamos a dejar estática y nos aseguramos que la interfaz pertenece a la VLAN 2 (eth0.2)

Al darle a Enviar accederemos a ponerle una dirección IP (192.168.1.2) dentro de la lengüeta General Setup. Le he añadido las DNS de google 8.8.8.8 y 8.8.4.4. Si quieres añadir las de tu proveedor de servicio de Internet, sustitúyelas.

Al finalizar de rellenar los parámetros de direccionamiento IP, NO LE DAMOS A GUARDAR TODAVÍA, accederemos a firewall Settings para decirle que esta interfaz pertenece a la zona del firewall llamada Wan.

Al finalizar cuando le hemos dado a Guardar y Aplicar, nos deben quedar las dos interfaces de la siguiente manera.

En verde se ve que br-lan y la Interfaz Wifi pertenecen a la zona del firewall llamada Lan.

En rojo vemos que la interfaz que hemos creado (WAN) pertenece a la zona de firewall llamada Wan.

2. Instalar paquetes necesarios.

Ahora toca la instalación de los paquetes necesarios. Pero primero tenemos que comprobar que tenemos conexión a Internet desde nuestro router.

2.1 conectamos la boca de Wan a nuestro router principal y testeamos si tenemos Internet.

Buscamos otro latiguillo de red y conectamos la boca que llamamos WAN a nuestra red intermedia.

Accedemos por ssh al router con putty desde windows o con el siguiente comando desde Linux:

ssh root@192.168.100.1

Al acceder por primera vez nos dirá que guardemos el fingerprint si confiamos en dicha máquina:

Haremos un ping a google para ver si tenemos conectividad:

ping www.google.es
PING www.google.es (216.58.214.163): 56 data bytes
64 bytes from 216.58.214.163: seq=0 ttl=53 time=61.690 ms
64 bytes from 216.58.214.163: seq=1 ttl=53 time=61.225 ms
64 bytes from 216.58.214.163: seq=2 ttl=53 time=60.635 ms
64 bytes from 216.58.214.163: seq=3 ttl=53 time=60.925 ms
64 bytes from 216.58.214.163: seq=4 ttl=53 time=61.421 ms

en caso de no haberla haz ping a la ip 8.8.8.8

ping 8.8.8.8

Si en la segunda puedes acceder y en la primera no, está resolviendo bien los nombres de dominio. Si ese es el caso, vete a Network -> Interfaces -> WAN ponle un servidor de DNS en USE CUSTOM DNS SERVERS.

2.2 Instalamos los paquetes necesarios para que funcione.

Una vez comprobada la conectividad pasamos a instalar todos los paquetes necesarios. Desde el terminal SSH ejecutamos lo siguiente:

opkg update
opkg install wireguard luci-proto-wireguard luci-app-wireguard
opkg install nano

He añadido el editor nano porque más adelante lo necesitamos para modificar los archivos de configuración.

Hemos instalado lo siguiente:

Wireguard: Paquetes necesarios para que que funcione como servidor y cliente, incluyendo las herramientas para la configuración.

luci-proto-wireguard: Para que podamos crear una interfaz con el protocolo Wireguard VPN desde luci. No es estrictamente necesario ya que se puede configurar por consola.

luci-app-wireguard: Para poder ver el estado de la conexión desde Luci (Status -> Wireguard Status.). No es estrictamente necesario.

3. Generar las clave pública y privada del servidor VPN

Ahora vamos a crear el par de claves pública y privada necesarias para poder cifrar las conexiones.

La clave privada nos la quedamos guardadita, la pública la necesitamos para dársela a los clientes de Wireguard que queramos que se conecten.

Creamos la clave privada:

wg genkey > privatekey
Warning: writing to world accessible file. Consider setting the umask to 077 and trying again.

Aquí nos advierte que la clave privada está en un fichero al que puede se puede acceder como usuario root. Es una advertencia genérica que en openwrt no tiene sentido. Lo mejor es que el usuario root tenga una contraseña fuerte que al final del tutorial le pondremos.

Generamos la pública:

wg pubkey < privatekey > publickey

Al hacer un ls vemos que hay dos ficheros: pubickey y privatekey.

root@LEDE:~# ls
privatekey publickey

Para ver la clave pública haremos:

cat publickey

Para ver la clave privada:

cat privatekey

4. Generar claves privada y pública en clientes y configurar cliente.

Ahora toca generar las claves en los clientes.

Lo más fácil es hacerlo con un smartphone o una tablet. Para realizar la prueba vamos a conectarnos con el teléfono a la red Wifi que me da mi router de acceso a Internet.

Si el teléfono tiene Android le instalamos la app siguiente: https://play.google.com/store/apps/details?id=com.wireguard.android

Si por el lado de la WAN tienes otro ordenador, sigue los pasos del desarrollador en la página: https://www.wireguard.com/install/

La VPN que se va a crear internamente la haremos que escuche por el puerto 33333 (He elegido uno al azar superior a 1024) será del rango 192.168.200.0. Donde nuestro servidor desde que alguien se conecte, tendrá la IP 192.168.200.1.

Vemos a continuación un esquema:

Los dispositivos una vez conectados podrán acceder entre ellos a través de la red 192.168.200.0.

Procedemos a configurar el cliente de android. Vemos aquí la configuración que debes poner:

 

Como ves tanto los clientes como el servidor se tienen que intercambiar la clave pública. Debes ingeniártelas para que lleguen de un lado al otro y puedas configurar los pares.

5. Configurar servidor VPN.

A continuación pasamos a configurar el servidor VPN. Para ello necesitamos la clave pública de todos los clientes que quieran conectarse.

Accedemos con ssh al servidor y ponemos los siguientes comando poniendo la clave pública de cada cliente:

# Creamos una interface de red de tipo Wireguard
uci set network.wgvpn0="interface"
uci set network.wgvpn0.proto="wireguard"

# Le decimos la clave privada que está aún en el fichero /root/privatekey
uci set network.wgvpn0.private_key="$(cat /root/privatekey)"

# Debe escuchar en el puerto 33333
uci set network.wgvpn0.listen_port="33333"

# El servidor tiene la dirección IP 192.168.200.1
uci set network.wgvpn0.addresses="192.168.200.1/32"

### Aquí los ################## 
### Repetir tantas veces    ### 
### como clientes queramos  ###
### que se conecten         ###
### Ponemos su pública e IP ###
### del cada cliente        ### 
###############################
uci add network wireguard_wgvpn0
# Debemos poner la clave pública del cliente
uci set network.@wireguard_wgvpn0[-1].public_key="CLAVE PÚBLICA CLIENTE"
# Le decimos que tiene la IP 192.168.200.2/32
uci add_list network.@wireguard_wgvpn0[-1].allowed_ips="192.168.200.2/32"
# Le decimos que enrute las ips permitidas.
uci set network.@wireguard_wgvpn0[-1].route_allowed_ips="1"
#############################

# Guardamos los cambios en /etc/config/network
uci commit network

Si vemos lo que tiene el archivo /etc/config/network veremos que al final le ha añadido:

cat /etc/config/network

 

config interface 'wgvpn0'
option proto 'wireguard'
option private_key 'O...='
option listen_port '33333'
option addresses '192.168.200.1/32'

config wireguard_wgvpn0
option public_key 'XX...XXX'
list allowed_ips '192.168.200.2/32'
option route_allowed_ips '1'

6. Configurar Firewall.

Ahora vamos a crear una zona nueva en el firewall. Esta zona contendrá la nueva interfaz creada llamada wgvpn0.

Por ssh ejecutamos los siguientes comandos:

# Creamos una regla del firewall para acceder
# desde la wan al puerto 33333 udp

uci add firewall rule
uci set firewall.@rule[-1].name='VPN_Wireguard'
uci set firewall.@rule[-1].src='wan'
uci set firewall.@rule[-1].target='ACCEPT'
uci set firewall.@rule[-1].family='ipv4'
uci set firewall.@rule[-1].proto='udp'
uci set firewall.@rule[-1].dest_port=33333

# Creamos una zona en el firewall para 
# controlar a donde se puede ir con
# desde nuestro interface.

uci add firewall zone
uci set firewall.@zone[-1].name='Zona_WG'
uci set firewall.@zone[-1].input='ACCEPT'
uci set firewall.@zone[-1].forward='ACCEPT'
uci set firewall.@zone[-1].output='ACCEPT'
uci set firewall.@zone[-1].masq='1'
uci set firewall.@zone[-1].device='wgvpn0'
uci set firewall.@zone[-1].network='wgvpn0'

uci set firewall.wg_wan=forwarding
uci set firewall.wg_wan.src=Zona_WG
uci set firewall.wg_wan.dest=wan

uci set firewall.wg_lan=forwarding
uci set firewall.wg_lan.src=Zona_WG
uci set firewall.wg_lan.dest=lan

uci add firewall forwarding
uci set firewall.@forwarding[-1]=forwarding
uci set firewall.@forwarding[-1].src='lan'
uci set firewall.@forwarding[-1].dest='Zona_WG'

uci commit firewall

Al finalizar reiniciamos el servicio de red y de firewall

/etc/init.d/network restart
/etc/init.d/firewall restart

7. Consideraciones Finales.

Tal y como está configurado podre con los clientes acceder a:

  • Cualquier dispositivo de la LAN (192.168.100.0/24)
  • Cualquier dispositivo de la VPN (192.168.200.0/24)
  • Acceder a Internet.
  • Cualquier dispositivo de la red intermedia (192.168.1.0/24).

Problema que tuve.

Para configurar el router utilicé un ordenador con dos tarjetas de red. Una la conecté al router y la otra me daba salida a Internet.

Cuando me conectaba desde el exterior y hacía ping a mi equipo (192.168.100.X) parecía que no llegaba.

El problema estaba que recibía la petición de ping desde la ip de mi cliente 192.168.200.X, pero luego enrutaba la respuesta hacia mi puerta de enlace por defecto 192.168.1.1.

Sólo tuve que ponerle una ruta estática a mi equipo hacia la red 192.168.200.0/24 enviándo a 192.168.100.1.

sudo route add -net 192.168.200.0 netmask 255.255.255.0 gw 192.168.100.1

Vamos a poner unas preguntas y respuestas para resolver algunas dudas:

¿Como sabemos quienes están conectados?

Con la orden wg vemos en endpoint la ip y el puerto desde donde hay un cliente conectado.

wg
interface: wgvpn0
public key: N...=
private key: (hidden)
listening port: 55555

peer: 5...I=
endpoint: 22.11.162.22:29008
allowed ips: 192.168.200.0/24
latest handshake: 14 seconds ago
transfer: 1.25 MiB received, 2.58 MiB sent
persistent keepalive: every 25 seconds

También se puede ver desde la web de configuración de LUCI. En Status -> Wireguard Status.

¿Parece que no me conecta?

– Prueba a ir Network -> Interfaces y dale a conectar en la interfaz de VPN (wgvpn0)

– Fíjate si tienes has puesto bien las claves públicas en los clientes y en el servidor

Quiero que sea accesible desde Internet.

Para ello tengo que abrir (redireccionar) el puerto 33333 UDP del router que me da acceso a Internet hacia la dirección IP 192.168.1.2.

En el cliente tengo que poner mi ip pública o darme de alta en algún servicio de DNS dinámica para que mi IP pública tenga un nombre de dominio.

Quiero asegurar mejor la conexión.

Wireguard permite un segundo cifrado con contraseña simétrica (preshared key)

Para generarla tienes que poner en la consola:

wg genpsk
QRtr...ueFMzy0=

Esa clave la tienes que poner en los clientes y en el servidor.

En el servidor:

Tienes hacer

uci set network.wgvpn0.preshared_key="QRtrxx...ueFMzy0="

Quiero poner configurar mi router como cliente para que salga a internet a través de mi VPN.

Pues configurarás igual el router (puntos 1,2,3,4) cambiando en el punto 5 por lo siguiente:

# Creamos una interface de red de tipo Wireguard
uci set network.wgvpn0="interface"
uci set network.wgvpn0.proto="wireguard"

# Le decimos la clave privada que está aún en el fichero /root/privatekey
uci set network.wgvpn0.private_key="$(cat /root/privatekey)"

# Debe escuchar en el puerto 33333
uci set network.wgvpn0.listen_port="33333"

# El cliente tiene la dirección IP 192.168.200.4
uci set network.wgvpn0.addresses="192.168.200.4/32"

### Aquí  ######################## 
### Ponemos la Clave Pública    ##
### del servidor e IPs que      ##
### permitimos pasar por la VPN ##
### y la IP del servidor al que ##
### queremos conectarnos y el   ##
### puerto por el que escucha   ##  
##################################
uci add network wireguard_wgvpn0
# Debemos poner la clave pública del servidor
uci set network.@wireguard_wgvpn0[-1].public_key="CLAVE PÚBLICA SERVIDOR"
# Le decimos que tiene las ips que queremos que enrute por la VPN
# Le decimos que TODAS
uci add_list network.@wireguard_wgvpn0[-1].allowed_ips="0.0.0.0/0"
# Le decimos que enrute las ips permitidas.
uci set network.@wireguard_wgvpn0[-1].route_allowed_ips="1"
# Aquí le ponemos la dirección IP del servidor
uci set network.@wireguard_wgvpn0[-1].endpoint_host="IP del servidor"
uci set network.@wireguard_wgvpn0[-1].endpoint_port="33333"
#############################

# Guardamos los cambios en /etc/config/network
uci commit network

En el punto 6 ya no necesitamos abrir el puerto 33333 por lo que solo creamos la zona y queda así:

# Creamos una zona en el firewall para 
# controlar a donde se puede ir con
# desde nuestro interface.

uci add firewall zone
uci set firewall.@zone[-1].name='Zona_WG'
uci set firewall.@zone[-1].input='ACCEPT'
uci set firewall.@zone[-1].forward='ACCEPT'
uci set firewall.@zone[-1].output='ACCEPT'
uci set firewall.@zone[-1].masq='1'
uci set firewall.@zone[-1].device='wgvpn0'
uci set firewall.@zone[-1].network='wgvpn0'

uci set firewall.wg_wan=forwarding
uci set firewall.wg_wan.src=Zona_WG
uci set firewall.wg_wan.dest=wan

uci set firewall.wg_lan=forwarding
uci set firewall.wg_lan.src=Zona_WG
uci set firewall.wg_lan.dest=lan

uci add firewall forwarding
uci set firewall.@forwarding[-1]=forwarding
uci set firewall.@forwarding[-1].src='lan'
uci set firewall.@forwarding[-1].dest='Zona_WG'

uci commit firewall

Al finalizar reiniciamos el servicio de red y de firewall

/etc/init.d/network restart
/etc/init.d/firewall restart

En este caso la configuración de Luci se verá similar a esta:

Y veremos el firewall tal como esto:

3 comentarios en “Instalar servidor VPN Wireguard en HG556A

  1. Muchas gracias por esta entrada, ahora en vacaciones sacaré un rato para cacharrear con este tema que me parece muy interesante.

    Un saludo.

  2. Como ves tanto los clientes como el servidor se tienen que intercambiar la clave pública. Debes ingeniártelas para que lleguen de un lado al otro y puedas configurar los pares.

    ¿Esto que significa?

    1. Pues que tienes que enviar la clave pública del servidor a los clientes y de los clientes al servidor para poderlo configurar. Lo puedes hacer por email, por mensajería, o teclearlo aunque esto último es tedioso.
      Saludos.

Deja un comentario

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