miércoles, 20 de marzo de 2024

Wireguard - VPN Site2Site Descentralizada (4 sites )


VPN Descentralizada en Mesh (4 sites )

Situación Presentada

Por motivos de la vida cotidiana se requiere que una aplicacion relacionada con blockchain tenga disponibilidad constante en la nube, sin importar la parte del mundo (el latency no es problema, pero la disponibilidad si). 
Ya se cuenta con 4  sites (proxmox v7) distibuidos por el mundo , en diferentes regiones de america , europa y asia por lo que es necesario establecer un canal seguro entre estas redes.

Accion tomada
La solucion practica y eficaz para su caso es una VPN site to site , que podemos llevar a cabo con cualquier suite de vpn open source, pero ene ste caso usaremos Wireguard debido a la mejora de tasa de transferencia (hasta 2.57 veces mas que OpenVPN) 


Entonces se hara un circuito de 4 nodos, y se configurará a manera de que los servers y red dentro de los hipervisores se puedan conectar entre sitios, y desde externo a un pool de gws que sean elegidos segun  el geoip origin del request.






Componentes del articulo
1. Pre-requisitos para instalación
  1.1 Requisitos CenTOS 8
  1.2 Requisitos Ubuntu 20.04
2. Firewall
  2.1 Ubuntu 
  2.2 CentOS 
3. Instalación de paquetes
  3.1 Ubuntu 
  3.2 CentOS
  3.3 Ver la version

Todo lo siguiente es en Ambas Distros

4. Preparacion de ambiente (Config Files, Systemd, Keyspairs, etc)
  4.1 Crear par de llaves.
  4.2 Archivo de configuracion
  4.3 Arrancar y registrar servicio
  4.4 Cargar modulo ne kernel para debug
  4.5 Ver logs / status de conexion

5. Extra 
  💫 Script para Healthcheck de latency de los nodos.


1. Pre-requisitos para instalación


•Un PC con CentOS 8 o Ubuntu 22.04, usados en este tutorial.
•Una conexión de red a internet.
•Una IP Publica por nodo.
•Conocimiento basico de shell de Linux

  1.1 Pre-requisitos CentOS 8

•Actualizar repositorios e instalr el repositorio EPEL tambien.

   sudo yum install epel-release
   sudo yum update

* Nota: Si aparece un error indicando que no puede sincronizar, ejecutar lo siguiente:

   sudo dnf update -y --releasever=8

  1.2 Pre-Requisitos Ubuntu 20.04

• Actualizar repositorios:

   sudo apt update

2. Configurar Firewall
Se debe abrir elpuertos udp de Wireguard (yo estoy usando 51000). Este se configura, y si estas detras de un router solo nateas segun lo necesrio

Si no se está usando firewall, omitir paso, sin embargo es fuertemente aconsejable, y casi mandatorio tenerlo activo.

**NOTA: La red que uso en mi laboratorio es la 10.10.9.0/29 que es NATeada por la ip publica de cada sitio 

Permitir Inbound:

udp/51000  - OpenVPN UDP


2.1 Ubuntu 
En Ubuntu El firewall esta deshabilitado por default. 
Para habilitarlo, y configurarlo a lo minimo, ejecutaremos los siguientes comandos:

Crear las reglas generales con el principio de Denegacion Implicita para prevenir accesos no autorizados.
sudo ufw default allow outgoing
sudo ufw default deny incoming

Agregar excepcion para conectarnos por UDP, desde nuestra red:
sudo ufw allow 51000/tcp comment 
'aceptar trafico WireGuard a NUESTRA red'

2.2 CentOS
Se ejecutará lo mismo que en el inciso anterior para Ubuntu, pero con la sintaxis del firewall para CentOS:

Agregar reglas con excepciones:
SSH:
sudo firewall-cmd --zone=public --permanent --add-port=51000/udp


sudo firewall-cmd --reload

Se confirman los cambios:
sudo firewall-cmd --zone=public --list-all


2.3 IPTables(sin firewall manager no importa la distro)

Los cambios normalmente seran en PREROUTING.

Agregar reglas:
sudo iptables -t nat -A PREROUTING -i eth0-p udp --dport 51000 -j DNAT --to-destination 10.10.9.1:51000  
(donde la ip 10.10.9.1 es la del servidor que tendra la vpn)


3. Instalación de Paquetes
Se debe instalar el paquete de  Wireguard que este en el repor de la distribución


3.1 Ubuntu 

sudo apt install wireguard


3.2 CentOS

curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
sudo yum install wireguard-dkms wireguard-tools


3.3 Ver la version
sudo wg -v



4. Preparación de ambiente ( config files, systemd, routes, etc)
Aqui se realizara la preparacion del server, con los parametros y settings necesarios.

4.1 Crear par de llaves

 wg genkey | sudo tee /etc/wireguard/wgX.key

(donde X es el nodo en que estemos, en mi  caso suelo usar A,B,C,D, pero es como quieran )


Se puede ver la llave publica, que se usara como login de los demas nodos , de la siguiente forma
 cat /etc/wireguard/wgD.key  | wg pubkey

Deberia dar un resultado como el siguiente

     qVnQR2D4AcW22XVOhBF+2X=  

Para guardarlo se puede hacer.
 cat /etc/wireguard/wgD.key  | wg pubkey > /etc/wireguard/wgD.pub  


4.2 Crear archivo de configuracion
vim /etc/wireguard/wgD.con

con el contenido siguiente, explicado con comentario # cada seccion.

#Nuestra interface , con la ip que tendremos en la red entre nodos .

[Interface]
PostUp = wg set %i private-key /etc/wireguard/%i.key
Address = 10.10.9.3/28
ListenPort = 123

#Aqui los distintos nodos con las secciones correspondientes

[Peer]
# sg site
PublicKey = QDfsazc1eDSGS1=pXXJGDB8/asd5326u6y
AllowedIPs = 10.10.9.1/32
Endpoint = 39.9.12.4:51000
PersistentKeepalive = 60

[Peer]
# eu site
PublicKey = /asd532pXXJGDB86u6yerfsazc1eDSGS1QD=
AllowedIPs = 10.10.9.2/32
Endpoint = 58.95.16.34:51000
PersistentKeepalive = 60

[Peer]
# ca site
PublicKey = pXXJGDB8/asd5326u6yerfsazc1eDSGS1QD=
AllowedIPs = 10.10.9.4/32
Endpoint = 11.22.337.44:51000
PersistentKeepalive = 60


Este file debe existir en cada uno de los nodos, solo que el primero debe ser el  server que esta activo. (En este caso, es el D.)

Extra, para facilitar tareas, modificar el archivo hosts.
    Agregar entradas necesarias de nuestros nuevos nodos:

vim /etc/hosts








4.3 Arrancar y registrar servicio

Primero se debe registrar para inicio automatico e inicializar el servicio (e interface)
Todo desde el systemd


systemctl enable --now wg-quick@wgD;
         El parametro al final, la letra D, representa el nombre que le hemos dado a nuestros hosts.

4.4 Cargar modulo Debug

modprobe wireguard 
echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control


4.5 Ver logs / status de conexion

Ver Status
systemctl status wg-quick@wgD

Debe dar un resultado similar a:


















Ver los logs debug 
dmesg --follow

























5. Extras
5.1 Script para Healthcheck de latency de los nodos.




























5.2 Habilitar enrutamiento en cualquier nodo. (aunque lo recomendable es , usarla solo para servicios, para usuarios, otro set up seria el mas indicado)

Modificar el file
/etc/sysctl.conf

Agregar

net.ipv4.ip_forward=1
Recargar configuracion

sudo sysctl -p


En Ubuntu, descomentar lo siguiente en 
/etc/ufw/sysctl.conf

net/ipv4/ip_forward=1

En CentOS, crear las siguientes reglas

Aqui se pone la interfaz de WAN
firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE

En los siguientes se pone la interfaz de entrada que seria wg[letra], ejemplo de entrada y salida
firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i wgD -o eth0 -j ACCEPT
firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i eth0 -o wgD -m state --state RELATED,ESTABLISHED -j ACCEPT