Notas sobre mi laboratorio con WireGuard

Saludos nuevamente.

Disculpen la demora en publicar, estoy hasta los pelos de trabajo.

Hoy les mostraré algunas notas que hice acerca de un laboratorio con WireGuard. La finalidad de dicho laboratorio es la de crear una conexión segura entre un cliente y los servidores de la organización.

Dicho de una manera más plana: lo que quiero es que, aunque venga alguien a conectar un equipo no autorizado en la red para poder hacer “cosillas”, tropezará contra una pared de concreto, debido a que esa red solamente verá el servidor VPN y mediante un cliente en el PC/laptop/móvil/tablet se conecte al mismo; sólo así tendría acceso a la red.

NOTA: Si se mira de una manera mucho más macabra y maliciosa, hasta los compañeros de la OSRI tendrán su cuota de sufrimiento en el proceso, dado que habría que registrar sus equipos en la red para que los puedan usar adecuadamente.

Muy importante, agradecer a Luis Felipe Domínguez Vega por la paciencia y las luces dadas en sus artículos 1 y 2 en el sitio de Sysadmins de Cuba (me fueron de mucha ayuda y por su paciencia).

Bueno, sin más preámbulo, aquí les va mis notas. Aclaro que de nada sirve que traten de llegar a las direcciones IP o usar las llaves primarias y públicas que se muestran ahí, dado que se trata de un laboratorio con máquinas virtuales.

Notas sobre mi laboratorio con WireGuard

En el servidor se ejecutan comandos para instalar el paquete del WireGuard, crear las llaves privada y pública tanto del servidor como de los clientes, el archivo de configuración del servidor y la activación de la interfaz. Los pasos son los siguientes:

1.- Instalar el paquete wireguard

# pkg install wireguard

NOTA: Para una mejor comodidad de edición de los archivos, también instalar el paquete nano.

# pkg install nano

2.- Generar la llave del servidor

# wg genkey
4CjVNfKzXUI7BdgW9qyy/Ho2m8WXIrnJfDZl9Up1dX0=

NOTA: El servidor genera automáticamente su llave pública.

3.- Crear el archivo de configuración del servidor usando como llave primaria la generada anteriormente

Contenido del archivo /usr/local/etc/wireguard/wglab0.conf:

# wg-lab.conf
#
[Interface]

# Establecer el IP de la interfaz con la máscara de red
Address = 10.20.4.1/27

# Puerto UDP de escucha del servidor
ListenPort = 49352

# Llave privada generada anteriormente
PrivateKey = 4CjVNfKzXUI7BdgW9qyy/Ho2m8WXIrnJfDZl9Up1dX0=

# Indica que cada configuración establecida a través de la interfaz de
# WireGuard sea salvada en el fichero una vez detenido el servidor
SaveConfig = false

4.- Generar las llaves primaria y pública del primer cliente (se aplica a los demás)

# wg genkey
qDrL0l0Vqhqh8L3u9Z4HyhTtNAO60f2Cz+T867KcqH0=

# echo -n “qDrL0l0Vqhqh8L3u9Z4HyhTtNAO60f2Cz+T867KcqH0=” | wg pubkey
gY3UkbZlsRg9y97T5hfQoZW1zWTCX6x3SssMI42GhlA=

5.- Añadir la configuración del cliente (peer) al archivo de configuración

El contenido del archivo /usr/local/etc/wireguard/wglab0.conf cambiaría al siguiente:

# wg-lab.conf
#
[Interface]

# Establecer el IP de la interfaz con la máscara de red
Address = 10.20.4.1/27

# Puerto UDP de escucha del servidor
ListenPort = 49352

# Llave privada generada anteriormente
PrivateKey = 4CjVNfKzXUI7BdgW9qyy/Ho2m8WXIrnJfDZl9Up1dX0=

# Indica que cada configuración establecida a través de la interfaz de
# WireGuard sea salvada en el fichero una vez detenido el servidor
SaveConfig = false

# W7 TEST
[Peer]

PublicKey = gY3UkbZlsRg9y97T5hfQoZW1zWTCX6x3SssMI42GhlA=
AllowedIPs = 10.20.4.2/32

6.- Iniciar la interfaz del WireGuard

Para ello hay que ejecutar el comando siguiente:

# wg-quick up wglab0

Donde wglab0 es el nombre del archivo de configuración del servidor sin la extensión.

7.- Verificar si el lado servidor está correctamente configurado

# root@tt-rt-vlan600:/usr/local/etc/wireguard # wg
interface: wglab0
public key: Z86xrQTV1NcbPxXTCv3xzqrv1U9e17gxcOWzmnXxRxQ=
private key: (hidden)
listening port: 49352

peer: gY3UkbZlsRg9y97T5hfQoZW1zWTCX6x3SssMI42GhlA=
allowed ips: 10.20.4.2/32

8.- En la WebGUI asignarle un nombre a la nueva interfaz de tipo TUN/TAP y establecerle como dirección IP la misma especificada en el parámetro “Address” en la sección “Interface” dentro del archivo de configuración del servidor

NOTA: Como OPNsense tratará de modificar la interfaz, hay que detenerla y luego iniciarla para que tome los cambios, o sea:

# wg-quick down wglab0
# wg-quick up wglab0

9.- Configurar en el equipo cliente (peer) la aplicación que se conectará al servidor WireGuard

En mi caso uso el TunSafe sobre Windows, el cual instala una interfaz virtual de tipo TUN/TAP en el sistema operativo para la conexión con el servidor una vez que se intercambian exitosamente las llaves públicas. El contenido del archivo de configuración es el siguiente:

TunSafe.conf:

[Interface]

PrivateKey = qDrL0l0Vqhqh8L3u9Z4HyhTtNAO60f2Cz+T867KcqH0=
Address = 10.20.4.2/27
DNS = 192.168.1.2

[Peer]

PublicKey = Z86xrQTV1NcbPxXTCv3xzqrv1U9e17gxcOWzmnXxRxQ=
AllowedIPs = 0.0.0.0/0
Endpoint = 10.20.3.1:49352
PersistentKeepalive = 25

10.- Conectarse al Servidor VPN

Si la conexión es exitosa, se habrá completado el proceso para el primer peer. La literatura y muchos administradores de red recomiendan que las llaves de los clientes o peers se generen en el mismo servidor y luego se vayan creando los archivos de configuración de cada cliente a la medida, así sólo el TunSafe instalado en los mismos importaría dicha configuración.

NOTA: Como prueba irrefutable de que esa sugerencia es cierta, yo lo hice de la manera que está en el tutorial de Sysadmins de Cuba, o sea, generando la llave del cliente en el mismo TunSafe y nunca me funcionó.

11.- Ajustes necesarios en el OPNsense (caso de estudio)

Ya completados exitosamente todos estos pasos, falta hacer que la subred dedicada al túnel VPN hecho con WireGuard tenga salida a las otras subredes. Por ejemplo, el entorno de laboratorio en el que estoy trabajando es el siguiente:

Router Superior: PC-Router con pfSense
Router de la Subred: PC-Router virtual con OPNsense (donde se está trabajando)

Rango WAN: 10.20.0.96/27 (subred para el laboratorio de pruebas)
Rango LAN: 10.20.3.0/27
Rango VPN WireGuard: 10.20.4.0/27

IP WAN: 10.20.0.98/27
Puerta de enlace de la WAN: 10.20.0.97

IP LAN: 10.20.3.1/27
Puerta de enlace de la LAN: Ninguna

IP VPN WireGuard: 10.20.4.1/27
Puerta de enlace de la VPN WireGuard: Ninguna

De ahí, establecer todas las direcciones IP del rango WAN como direcciones IP virtuales asociadas a dicha interfaz:

10.20.0.99/27 <—> WAN <—> IP Alias
10.20.0.100/27 <—> WAN <—> IP Alias
10.20.0.101/27 <—> WAN <—> IP Alias
(…)
10.20.0.126/27 <—> WAN <—> IP Alias

Luego crear las reglas de NAT 1-a-1 entre las direcciones IP de la VPN WireGuard y las de la WAN:

WAN —> 10.20.0.99 <—> 10.20.4.2
WAN —> 10.20.0.100 <—> 10.20.4.3
WAN —> 10.20.0.101 <—> 10.20.4.4
(…)
WAN —> 10.20.0.126 <—> 10.20.4.27

En cuanto a las reglas de cortafuegos, como lo que se está haciendo son pruebas, se están usando reglas totalmente permisivas en ciertas interfaces y, a medida que se va puliendo el trabajo, se afinan otras.

En este caso, las reglas por cada interfaz son las siguientes:

  • WAN

– Bloquear las “bogon networks” (redes falsas)
– Permitir acceso RDP al equipo cliente de pruebas de la VPN con Wireguard (probando entrada desde la WAN)
– Permitir acceso a la administración del PC-Router, tanto por la WebGUI, como por SSH.

  • LAN

– Permitir acceso a la administración del PC-Router, tanto por la WebGUI, como por SSH.
– Bloquear las “bogon networks” (redes falsas)
– Permitir, sólo desde las direcciones IP de la LAN y también desde puertos de solicitudes de conexiones, el
acceso al servidor VPN con WireGuard, el cual tiene como puerto definido al 49352/udp.

  • WGLAB

– Bloquear las “bogon networks” (redes falsas)
– Permitir, sólo desde las direcciones IP de la VPN con WireGuard usando el túnel, hacia cualquier lugar.

NOTA: Estos conjuntos de reglas pueden cambiar perfectamente, como dije anteriormente, a medida que se vayan puliendo las reglas de cortafuegos en cada subred.

12.- Iniciar la interfaz del Wireguard VPN en el momento del arranque del sistema operativo

Antes que todo, decir que yo no sé nada de BSD, así que tuve que leer un montón de sitios en Internet para aprender a cómo hacerlo. Estos dos me iluminaron un montón:

1: https://www.freebsd.org/doc/en_US.ISO8859-1/articles/rc-scripting/article.html

2: https://joekuan.wordpress.com/2010/05/09/quick-tutorial-on-how-to-create-a-freebsd-system-startup-script/

Entonces, yendo directamente al asunto, se crearon dos archivos, uno con el contenido del script de inicio o rc, y el otro que indica que dicho script debe ejecutarse durante en momento del arranque del sistema operativo (en este caso es uno de los últimos en ejecutarse). La ubicación de los mismos son en /etc/rc.d/wireguard y /etc/rc.conf.d/wireguard respectivamente.

Contenido del archivo /etc/rc.d/wireguard:

#!/bin/sh

# PROVIDE: wireguard
# REQUIRE: LOGIN DAEMON NETWORKING

. /etc/rc.subr

name=”wireguard”
rcvar=${name}_enable
start_cmd=”${name}_start”
stop_cmd=”${name}_stop”

load_rc_config $name

wireguard_start()
{
    if checkyesno ${rcvar}; then
        wg_conf_dir=”/usr/local/etc/wireguard”

        for cfg_file in `ls $wg_conf_dir`; do
            iface=”${cfg_file%.*}”

           echo “Starting Wireguard interface ($iface)…”
           /usr/local/bin/wg-quick up $iface
       done
    fi
}

wireguard_stop()
{
    if checkyesno ${rcvar}; then
         wg_conf_dir=”/usr/local/etc/wireguard”

        for cfg_file in `ls $wg_conf_dir`; do
            iface=”${cfg_file%.*}”

            echo “Starting Wireguard interface ($iface)…”
            /usr/local/bin/wg-quick down $iface
       done
    fi
}

run_rc_command “$1”

Contenido del archivo /etc/rc.conf.d/wireguard:

wireguard_enable=”YES”
rc_debug=”YES”

Con esto ya se puede configurar tantas interfaces Wireguard VPN se desee, asignar interfaces y crear sus reglas de cortafuegos asociadas, así como reglas NAT.

Espero les sirva. 🙂

Acerca de Hector Suarez Planas

Es Licenciado en Ciencia de la Computación (3 de julio de 2002). Ha sido Administrador de Red en varias organizaciones, Programador y Analista de Sistemas. Actualmente se desempeña como Administrador de Red del Telecentro Tele Turquino de Santiago de Cuba. Tiene experiencia con sistemas Windows y GNU/Linux, Infraestructura de Redes (Cisco, AlliedTelesis, Netgear y HP ProCurve, Vyatta/VyOS), Servidores tanto físicos como virtuales (plataformas VMWare, Proxmox VE y Xen), Sistemas de Seguridad Informática (Snort/Suricata IDS, appliances AlienVault OSSIM), programador (Delphi, C++ Builder, Perl [poco], Python [algo]), entre otras cosas. Actualmente estoy incursionando en todo lo que tiene relación con Cloud Computing (OpenStack) y Centros de Datos. :-)
Esta entrada fue publicada en VPN, WireGuard. Guarda el enlace permanente.

2 respuestas a Notas sobre mi laboratorio con WireGuard

  1. ed dijo:

    Saludos Hector. Necesito hacerte una pregunta pero como no vi donde aqui mismo te escribo.
    El servidor proxy lo tengo montado en una VM, y funciona correctamente, solo que a la hora de hacer la salva automatica me realiza todas las demas de las otras VM pero me brinca la de el servidor, le da este error en los log de salvas:
    INFO: VM is locked (backup)
    ERROR: Backup of VM 102 failed – command ‘qm set 102 –lock backup’ failed: exit code 255
    INFO: Starting Backup of VM 105 (qemu)

    lo puse en internet y ejecute en el servidor de proxmox qm unlock 102
    donde 102 es el id de la vm ahora bien, como sabre que para la otra salva lo hara bien??? saludos

    • Hector Suarez Planas dijo:

      Saludos, Ed.

      Sí, debe funcionarte la próxima vez, pero no debes esperar a ese momento. Ejecútalo forzadamente para que veas el resultado.

      🙂

Deja un comentario

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