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.
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)
Componentes del articulo
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.
•Actualizar repositorios e instalr el repositorio EPEL tambien.
sudo yum install epel-release
sudo yum update
1.1 Requisitos CenTOS 8
1.2 Requisitos Ubuntu 20.04
2. Firewall
2.1 Ubuntu
2.2 CentOS
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.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
sudo dnf update -y --releasever=8
1.2 Pre-Requisitos Ubuntu 20.04
• Actualizar repositorios:
sudo apt update
• 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
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'
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:
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/udpsudo 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
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
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.)
Primero se debe registrar para inicio automatico e inicializar el servicio (e interface)
Todo desde el systemd
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.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
firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i eth0 -o wgD -m state --state RELATED,ESTABLISHED -j ACCEPT