noviembre 15, 2021

BitCuco

¡Hola Mundo!

Wireguard – Tutorial para armar una VPN en casa

wireguard vpn

Hola amigos, el día de hoy les estaré explicando en detalle sobre como montar nuestra propia VPN con Wireguard. Para quienes no lo sepan, Wireguard es uno de los nuevos protocolos VPN, actualmente ya incluido dentro del kernel Linux. Si bien hay muchas formas de poder armar una VPN, Wireguard es una de las que cada vez tiene mas influencia, adeptos, y no es por nada. Es que ofrece un rendimiento realmente excelente, por sobre otras opciones como IPSec u OpenVPN. A lo largo de esta nota les iré explicando desde la preparación del servidor, hasta los parámetros que debemos utilizar a la hora de configurarlo. Comencemos!

Wireguard – Un poco de historia

Las primeras versiones del protocolo Wireguard aparecen en el año 2016. Esto lo hace muy reciente, y fue considerado en primera instancia como experimental. Poco a poco el trabajo comienza a crecer mediante la ayuda de donaciones, pero aun en el año 2018 se lo consideraba como experimental. Hacia fines del 2019 fue aceptado en la rama del kernel net-next, que apunta a lo que irá incluido en la siguiente versión del kernel Linux. Y para finalizar este pequeño resumen, casi dos meses después de haber sido incluido en el árbol net-next, es incluido por Linux Torvalds a la rama principal del kernel Linux. Desde allí que esta en constante desarrollo y crecimiento.

wireguard

Los objetivos de Wireguard han sido bien claros desde el principio. Su claro objetivo es conseguir un mejor rendimiento que los protocolos OpenVPN e IPSEC. Y créanme, que lo están logrando. El hecho además de que este incluido en la rama principal del kernel Linux, es algo que hará que su uso sea cada vez mayor, según mi forma de ver las cosas.

¿Cuales son las razones para que un usuario quiera armar su propia VPN?

Bueno, esta es una pregunta que quizás muchos de ustedes se hagan. Y quizás lo primero que les viene a la mente es el tema del anonimato o la privacidad. Y si, tiene que ver con eso, pero no es la única razón, y dentro del plano corporativo es mucho mas que eso. Es verdad que podemos utilizar una VPN


para tener cierta privacidad o anonimato dentro de la red, canalizando nuestro tráfico a través de un servidor en otro país. Algo así como hace cualquier servicio VPN como el conocido Proton u otros como ExpressVPN. Claro que en este caso esta pura y exclusivamente orientado al tema del anonimato. Pero dentro del mundo de las VPN, no se trata solo de eso. Hay múltiples usos y motivos por los cuales utilizar una VPN. Y trataré de no extenderme demasiado, pero si centrarme en los casos de uso mas comunes.

wireguard
Tunel VPN – Anonimato y Seguridad

Ademas de ya haber mencionado la cuestión del anonimato y la privacidad en linea, otra de las razones por las que podemos estar interesados en una VPN es el simple hecho de la navegación. A que me refiero con esto? Ciertos sitios, como Youtube por citar un ejemplo, tiene limitaciones en sus videos según la zona geográfica. Tener una VPN con IP de USA ayudaría a que podamos acceder a dichos sitios. Lo mismo con la limitación en la velocidad de descarga en determinados países. Armando una VPN podemos sortear todas estas limitaciones, dado que estaríamos canalizando nuestro tráfico a través de nuestro servidor VPN. Otra de las opciones sería poder compartir nuestras cosas con otras personas, y estamos detrás de una conexión del tipo CGNAT. La VPN nos permitiría tener un mismo segmento de red, y poder cubrir estas falencias.

¿Cuales son las razones de una VPN en un entorno corporativo?

Aquí es otro punto completamente diferente al enfoque de una VPN a nivel usuario. En el contexto de la pandemia que aún continuamos viviendo, llevó a que muchas compañías deban cambiar y adaptarse a un nuevo contexto. Y con esto me refiero puntualmente al hecho de que los empleados deben trabajar desde casa, sin dejar de tener acceso a ciertos recursos de la empresa. Si bien muchas empresas llevan utilizando estas tecnologías desde hace mucho tiempo, otras no estaban tan preparadas. ¿En que ayuda una VPN en este caso? Pues es muy simple. Al conectar a una VPN


en una empresa, los empleados ingresan a la red corporativa y pueden utilizar todos los recursos disponibles en dicha red. Ejemplo de eso pueden ser servidores de archivos, internos telefónicos de una central Asterisk, entre otras cosas.

wireguard

Entonces podemos decir que una VPN permite que cualquier empleado pueda trabajar desde la comodidad de su hogar, teniendo acceso a todos los recursos necesarios para realizar sus labores. Todas las empresas tienen al menos una linea de atención telefónica, con un servidor de telefonía conectado en la red. O mismo un call center que se dedica a la atención al público, o ventas, como muchos deben conocer. En este caso, el poder conectar un equipo a la VPN, permite que tenga todos los mismos accesos y recursos que estando en la empresa de manera presencial. Y esto permite, por consiguiente, encontrar nuevas formas de trabajo que sea beneficioso para empresas y trabajadores. Para las empresas, porque les supone un ahorro de costos en cuanto a ciertos gastos establecidos. Y para el empleado, el beneficio de tener un día, o varios, donde pueda realizar su trabajo desde su casa. Dicho esto, continuaremos con la explicación sobre como configurar nuestra VPN.

Wireguard – Setup de ejemplo a utilizar

En principio, vamos a comentar que este tutorial esta pensado para realizarse en un servidor Debian y en un equipo cliente con cualquier distribución Linux o Windows, o incluso Android. A continuación les detallaré los ejemplos a utilizar para ambos lados (servidor y cliente). Vale mencionar que en este caso estamos tomando en cuenta un servidor Debian en un VPS (o un servidor propio), el cual tiene conexión directa a través de la placa de red con su IP pública asignada directamente a la interfaz.

A su vez es importante mencionar que dentro de la configuración final, les mostraré como enrutar todo nuestro tráfico web a través del túnel. De esta forma, nuestra salida a internet desde el equipo cliente sería a través del servidor VPN. Algo a tener en cuenta, es que si vamos a configurar en un equipo nuestro para que oficie de servidor, el mismo debe tener IP pública. Los servidores VPN no pueden configurarse con conexiones a internet de tipo CGNAT.

Configuraciones de Ejemplo

A continuación, las configuraciones que utilizaremos de ejemplo para este tutorial.

Configuración Servidor: Debian 11 Bullseye

  • eth0: 200.50.100.25 (nuestra ip pública de servidor)
  • Puerto UDP a utilizar: 51194
  • IP Privada de la interfaz wg0: 192.168.50.1/24
  • wg0 public key: Aqxm688xYvc+MtOaTKPAjcnSGayipgpgrr579LozsQI=
  • wg0 private key: mE0TsegQDpYNMf7IpW+7JePKUUkTu0sGZ8b9M4SaA3Y=
  • Firewall: ufw

Configuración Cliente: Cualquier sistema Linux que utilicen

  • eth0: 192.168.1.1 (IP privada asignada por el router que tenemos)
  • IP Privada de la interfaz wg0: 192.168.50.2/24
  • wg0 public key: JAv3uNAKlDr9nzpSTfCgOrClvwT4d8D+7MBuI6XvVXg=
  • wg0 private key: gFZdBlOJyVn7FAyuzMf3jrQV2z+1mdJzXx0LspAlx3s=

Vamos a hacer algunas aclaraciones sobre esto, para entender un poco mas sobre cada cosa. Respecto al firewall mencionado en la configuración de servidor, es requerido para darle seguridad a nuestro servidor. En la mayoría de servicios VPS, los firewalls no vienen instalados, por lo cual debemos hacerlo para mantener nuestro servidor seguro. Por otro lado, tanto las llaves privadas como públicas, aquí son de ejemplo. Ustedes deberán generarlas con lo que iremos viendo a lo largo de este tutorial.

Para la creación del túnel. VPN entre el servidor y el equipo cliente se requieren tanto llaves públicas como privadas. Ellas son las que se validan desde ambos extremos, y permiten que la conexión se establezca de forma satisfactoria. De una manera similar trabajan las VPN creadas con IPSEC, por lo cual para aquellos que ya lo hayan manejado, estarán familiarizados con esto.

En cuanto a los requerimientos técnicos del servidor, no necesitaremos gran cosa. Sin ir mas lejos, un Debian en CLI con el servidor Wireguard configurado y funcionando esta por el orden de los 50mb de consumo, por lo que contratar un VPS con 1GB de memoria es mas que suficiente.

Configuración del Servidor Wireguard

Bien, lo primero que haremos en nuestro servidor es agregar el repositorio backports de Debian, para poder instalar Wireguard en nuestro sistema. Recordemos que también debemos instalar nuestro firewall. Para agregar backports a nuestra lista de repositorios ejecutaremos el siguiente comando:

sudo sh -c "echo 'deb http://deb.debian.org/debian bullseye-backports main contrib non-free' > /etc/apt/sources.list.d/bullseye-backports.list"
sudo apt update
sudo apt upgrade

De esta forma habremos agregado el repositorio, actualizado los metadatos de los mismos, además de actualizar nuestro sistema para asegurarnos de estar al día. Una vez realizado esto, procederemos a la instalación de Wireguard:

sudo apt install wireguard ufw

Una vez finalizado, cambiaremos al usuario root con el comando “su” e iremos al directorio de configuración de Wireguard, y ejecutaremos lo siguiente:

cd /etc/wireguard
umask 077; wg genkey | tee privatekey | wg pubkey > publickey

De esta forma hemos creado nuestras llaves pública y privada respectivamente. Luego de esto crearemos nuestro archivo de interfaz wg0.

Creación de la Interfaz wg0

Crearemos nuestro archivo de configuración de la siguiente forma:

sudo nano /etc/wireguard/wg0.conf

Y pegaremos el siguiente contenido:

[Interface]
## IP Privada del Servidor ##
Address = 192.168.50.1/24

## Reglas de iptables para permitir el trafico a través del servidor ##
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

## Puerto VPN a utilizar por Wireguard ##
ListenPort = 51194
 
## Llave privada del servidor VPN localizada en /etc/wireguard/privatekey ##
PrivateKey = mE0TsegQDpYNMf7IpW+7JePKUUkTu0sGZ8b9M4SaA3Y=
 
## Salvar la configuración cuando un nuevo cliente VPN / peer es añadido ##
SaveConfig = true

Luego, abriremos el puerto que necesitamos para que funcione nuestro servidor Wireguard con el siguiente comando:

sudo ufw allow 51194/udp

Configuración del cliente Wireguard

Bien, ya en el equipo cliente, instalaremos Wireguard y procederemos a realizar la configuración. Repetiremos los pasos de creación de la llave pública y privada con el siguiente comando:

cd /etc/wireguard 
umask 077; wg genkey | tee privatekey | wg pubkey > publickey

Ya con nuestras llaves creadas, crearemos nuestro archivo wg0.conf en el directorio /etc/wireguard con nano, y pegaremos el siguiente contenido:

[Interface]
## Llave privada del cliente localizada en /etc/wireguard/privatekey ##
PrivateKey = gFZdBlOJyVn7FAyuzMf3jrQV2z+1mdJzXx0LspAlx3s=
 
## Dirección IP cliente ##
Address = 192.168.50.2/24
DNS = 1.1.1.1
 
[Peer]
## Llave pública del servidor Debian (publickey) ##
PublicKey = Aqxm688xYvc+MtOaTKPAjcnSGayipgpgrr579LozsQI=
 
## set ACL Esto se pone así para permitir el ruteo del tráfico a través del srv ##
AllowedIPs = 0.0.0.0/0
 
## IP Publica del Servidor con su puerto ##
Endpoint = 200.50.100.25:51194
 
##  Key connection alive ##
PersistentKeepalive = 20

Bien, una vez hecho esto, activaremos nuestro servicio wireguard mediante el siguiente comando:

sudo systemctl start [email protected]
sudo systemctl enable [email protected]

De esta forma nuestro servicio Wireguard quedará iniciado y activado durante el arranque. Por último, con el archivo wg.conf lo podrán exportar desde Network Manager o desde el cliente Wireguard para Windows. En el caso de Network Manager, solo deben hacer el siguiente cambio, dado que no pone la IP con la que debemos conectar por algún extraño motivo. Pero es tan simple como modificarlo manualmente.

configurar vpn
Wireguard Network Manager

Configuración Final del Servidor Wireguard

Por último agregaremos la información de nuestro cliente al archivo de configuración wg0.conf:

[Interface]
## IP Privada del Servidor ##
Address = 192.168.50.1/24

## Reglas de iptables para permitir el trafico a través del servidor ##
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROU
TING -o eth0 -j MASQUERADE 
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTR
OUTING -o eth0 -j MASQUERADE

## Puerto VPN a utilizar por Wireguard ##
ListenPort = 51194

## Llave privada del servidor VPN localizada en /etc/wireguard/privatekey ##
PrivateKey = mE0TsegQDpYNMf7IpW+7JePKUUkTu0sGZ8b9M4SaA3Y=

## Salvar la configuración cuando un nuevo cliente VPN / peer es añadido ##
SaveConfig = true

[Peer]
## Llave pública del equipo cliente ##
PublicKey = JAv3uNAKlDr9nzpSTfCgOrClvwT4d8D+7MBuI6XvVXg=

## Dirección IP Cliente (notese  que se utiliza la subred /32) ##
AllowedIPs = 192.168.50.2/32
Ahora, solo nos quedaría iniciar y activar nuestro servicio Wireguard en el servidor, de la siguiente forma:
sudo systemctl start [email protected]
sudo systemctl enable [email protected]

Y eso es todo. Ya podremos conectar desde Network Manager sin ningún tipo de inconveniente.

Pensamientos Finales

No hay mucho para agregar, pero espero como pueden ver, una VPN nos proporciona infinidad de usos verdaderamente importantes. Aquí describimos paso por paso como configurar una de las VPN que esta cobrando fuerza día a día, y si bien puede parecer complejo, no lo es para nada. Y esto lo pueden hacer desde cualquier distribución, desde la excelente Manjaro hasta la robusta openSUSE.

Espero que esta nota haya sido de su agrado, y no olviden dejar sus comentarios. Saludos!!!

Sobre el Autor

Bruno Ernesto Russo

Apasionado de la tecnología. Mis principales áreas de interés son los sistemas GNU/Linux y software libre, virtualización, servidores, redes y hardware.