← ← Volver a todas las notas

Crea Tu Propio VPN: Guía Completa de Privacidad, Seguridad y Control Total

2025-11-09 · Benja

Aprende a montar tu propio VPN con WireGuard, proteger redes públicas, evitar throttling y asegurar accesos y datos sensibles

Crea Tu Propio VPN: Guía Completa de Privacidad, Seguridad y Control Total

🔐 Introducción: Tu data, tu responsabilidad

En una época donde cada clic, mensaje y transacción deja un rastro digital, la privacidad dejó de ser un plus: es un requisito básico para cualquier persona u organización que maneje información sensible.

Filtraciones de datos, vigilancia masiva, venta de historiales de navegación y perfiles de comportamiento muestran que delegar completamente tu privacidad en terceros (ISPs, servicios “gratuitos”, proveedores de VPN comerciales) es cada vez más riesgoso.

La alternativa lógica es recuperar el control: levantar tu propia red privada virtual (VPN), en un servidor que administras tú, con reglas y registros que tú defines.


🤔 ¿Qué es un VPN y cómo funciona realmente?

La analogía del túnel seguro

Imagina que enviar datos por internet es como mandar una postal por correo:

  • Sin VPN: cualquiera que manipule la postal puede leer el contenido (tu ISP, el dueño del WiFi, operadores intermedios, algunos gobiernos).
  • Con VPN: metes la postal en una caja fuerte cifrada que solo tú y el servidor VPN pueden abrir.

Todo tu tráfico sale cifrado desde tu dispositivo, viaja por un túnel seguro hasta tu servidor VPN y recién ahí sale hacia internet público. Para terceros, tu ISP solo ve tráfico cifrado hacia tu servidor VPN, no lo que hay dentro.

Arquitectura técnica básica


[Tu Dispositivo] → [Cifrado] → [Servidor VPN] → [Internet Abierto]
       ↑                ↑              ↑              ↑
    Cliente VPN      Túnel         Tu nodo         Destino
                     seguro         seguro
    

A nivel de red, el servidor VPN actúa como puerta de enlace segura: todo lo que sale de tu equipo se encapsula, se cifra, se envía al servidor, se desencripta y recién ahí se reenvía a su destino final.


🚨 ¿Por qué un VPN propio es crucial hoy?

1. Protección real en redes públicas

En un WiFi de aeropuerto, bar o cowork, cualquier atacante ubicado en la misma red puede intentar capturar tráfico no cifrado. Herramientas como scapy, wifi-pumpkin o mitmproxy lo hacen trivial.


# Ejemplo simple de sniffing en WiFi público (educativo, no productivo)
import scapy.all as scapy

def sniff_packets(interface):
    # Captura tráfico de la interfaz
    packets = scapy.sniff(iface=interface, count=100)
    for packet in packets:
        if packet.haslayer(scapy.Raw):
            print(packet[scapy.Raw].load)

# Con un VPN bien configurado, el tráfico viaja cifrado extremo a extremo,
# por lo que lo capturado no es legible.
    

Con tu propio VPN, incluso en redes hostiles, el atacante solo verá tráfico cifrado sin poder leer fácilmente el contenido.

2. Evitar el throttling de tu ISP

Muchos ISPs aplican traffic shaping o throttling selectivo a ciertos servicios: streaming, videojuegos, descargas P2P, etc.

  • Con un VPN, todo el tráfico se ve igual ante el ISP.
  • No puede distinguir si es video, juego, VPN corporativo o backup.
  • Disminuye la capacidad de aplicar políticas de degradación selectiva.

3. Acceso seguro a recursos remotos

Un VPN propio te permite tratar tu red doméstica o de oficina como si siempre estuvieras físicamente allí:


# Acceso a tu red doméstica desde cualquier lugar
ssh usuario@ip-del-servidor-vpn

# Acceso a servicios internos sin exponerlos a internet público
mysql -h servidor-interno -u usuario -p
    

Esto es útil para:

  • Administrar servidores internos.
  • Acceder a NAS, domótica o cámaras sin abrir puertos al mundo.
  • Conectar sedes, oficinas remotas o equipos de trabajo distribuidos.

4. Mitigar vigilancia masiva y perfilamiento

Tu historial de navegación, consultas de DNS y patrones de uso son extremadamente valiosos:

  • Gobiernos: leyes de retención de datos y pedidos judiciales.
  • ISPs: métricas y comportamiento agregado de usuarios.
  • Adtech: perfilamiento fino para publicidad y segmentación.

Con un VPN propio bien configurado, reduces la visibilidad que tienen terceros sobre tu actividad, y centralizas la confianza en un servidor que tú controlas.


🛠️ Guía paso a paso: crea tu VPN con WireGuard

WireGuard es hoy una de las opciones más modernas y eficientes para montar un VPN: código reducido, alto rendimiento y configuración relativamente simple.

Prerrequisitos

  • Servidor VPS (recomendado: Ubuntu 20.04 o superior).
  • Acceso SSH como root o usuario con sudo.
  • Dominio propio (opcional pero recomendado para facilitar el acceso).
Dependencias de herramientas y librerías usadas en los ejemplos:
  • qrencode para generar códigos QR de configuración (sudo apt install qrencode).
  • scapy para el ejemplo de sniffing (pip install scapy o paquete de distribución).
  • requests para scripts Python de monitorización (pip install requests).
  • Flask para el dashboard web (pip install flask).
  • fail2ban para endurecimiento del servidor (sudo apt install fail2ban).

Paso 1: configuración inicial del servidor


# Actualizar sistema
sudo apt update && sudo apt upgrade -y

# Instalar WireGuard
sudo apt install wireguard -y

# Generar claves públicas/privadas
cd /etc/wireguard/
umask 077
wg genkey | tee privatekey | wg pubkey > publickey

# Configurar interfaz del servidor
cat > /etc/wireguard/wg0.conf << EOF
[Interface]
PrivateKey = $(cat privatekey)
Address = 10.0.0.1/24
ListenPort = 51820
SaveConfig = true

# Reglas de NAT y forwarding al levantar la interfaz
PostUp   = iptables -A FORWARD -i %i -j ACCEPT; \
           iptables -A FORWARD -o %i -j ACCEPT; \
           iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; \
           iptables -D FORWARD -o %i -j ACCEPT; \
           iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# Cliente 1 - Tu teléfono (ejemplo)
[Peer]
PublicKey = CLIENT_PUBLIC_KEY_HERE
AllowedIPs = 10.0.0.2/32
EOF
    
Nota: reemplaza eth0 por el nombre real de la interfaz de red de salida de tu servidor (por ejemplo ens3, enp0s3, etc.). Puedes verlo con ip addr.

Paso 2: habilitar forwarding y firewall


# Habilitar IP forwarding
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# Configurar UFW (Firewall)
sudo ufw allow 51820/udp
sudo ufw allow ssh
sudo ufw enable

# Verificar estado del firewall
sudo ufw status
    

Paso 3: configurar clientes de forma automatizada

Para móviles (Android/iOS) basta con la app oficial de WireGuard y un QR. Un pequeño script en el servidor facilita la creación de nuevos peers.


#!/bin/bash
# add-client.sh - Script para agregar clientes WireGuard
# Requiere: qrencode (sudo apt install qrencode)

set -e

CLIENT_NAME="$1"
CLIENTS_DIR="/etc/wireguard/clients"

if [ -z "$CLIENT_NAME" ]; then
  echo "Uso: $0 NOMBRE_CLIENTE"
  exit 1
fi

# Verificar que la interfaz wg0 esté activa
if ! wg show wg0 &>/dev/null; then
  echo "La interfaz wg0 no está activa. Iníciala con: sudo wg-quick up wg0"
  exit 1
fi

mkdir -p "${CLIENTS_DIR}"

# Calcular IP interna simple: 10.0.0.X
CLIENT_IP="10.0.0.$((2 + $(ls -1 ${CLIENTS_DIR}/*.conf 2>/dev/null | wc -l)))"

# Generar claves del cliente
wg genkey | tee "${CLIENTS_DIR}/${CLIENT_NAME}_private.key" | wg pubkey > "${CLIENTS_DIR}/${CLIENT_NAME}_public.key"

# Crear configuración del cliente
cat > "${CLIENTS_DIR}/${CLIENT_NAME}.conf" << EOF
[Interface]
PrivateKey = $(cat "${CLIENTS_DIR}/${CLIENT_NAME}_private.key")
Address = ${CLIENT_IP}/24
DNS = 1.1.1.1, 8.8.8.8

[Peer]
PublicKey = $(cat /etc/wireguard/publickey)
Endpoint = $(curl -s ifconfig.me):51820
AllowedIPs = 0.0.0.0/0
EOF

# Agregar peer al servidor
wg set wg0 peer "$(cat "${CLIENTS_DIR}/${CLIENT_NAME}_public.key")" allowed-ips "${CLIENT_IP}/32"

# Generar QR para móviles
qrencode -t ansiutf8 < "${CLIENTS_DIR}/${CLIENT_NAME}.conf"

echo "Cliente ${CLIENT_NAME} configurado con IP ${CLIENT_IP}"
    

Desde la app móvil de WireGuard puedes escanear el QR generado y conectarte directamente a tu servidor.

Paso 4: iniciar y verificar


# Levantar la interfaz
sudo wg-quick up wg0

# Habilitar arranque automático
sudo systemctl enable wg-quick@wg0

# Ver estado de la interfaz y peers
sudo wg show

# Desde el cliente, probar conectividad
ping 10.0.0.1
    

🔧 Endureciendo la seguridad de tu VPN

1. Fail2Ban para proteger contra intentos repetidos

Aunque WireGuard es bastante resistente por diseño, puedes usar Fail2Ban para reaccionar frente a patrones de handshakes fallidos y bloquear IPs que insisten.


# Instalar fail2ban
sudo apt install fail2ban -y

# Configurar jail para WireGuard
cat > /etc/fail2ban/jail.d/wireguard.conf << EOF
[wireguard]
enabled  = true
port     = 51820
protocol = udp
filter   = wireguard
logpath  = /var/log/syslog
maxretry = 3
bantime  = 3600
findtime = 600
EOF

# Filtro para handshakes fallidos
cat > /etc/fail2ban/filter.d/wireguard.conf << EOF
[Definition]
failregex  = ^.*error.*Handshake for peer.*from.*<HOST>.*$
ignoreregex =
EOF

sudo systemctl restart fail2ban
    

2. Script de monitoreo básico

Un pequeño monitor puede ayudarte a detectar caídas de servicio, problemas de salida a internet o peers inactivos.


#!/usr/bin/env python3
# Requiere: requests (pip install requests)

import subprocess
import requests
import logging
import time
from datetime import datetime

logging.basicConfig(
    filename="/var/log/vpn-monitor.log",
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s"
)

class VPNMonitor:
    def __init__(self):
        self.alert_threshold = 3

    def check_wireguard_status(self):
        try:
            result = subprocess.run(
                ["wg", "show"],
                capture_output=True,
                text=True,
                timeout=10
            )
            return result.returncode == 0
        except Exception as exc:
            logging.error(f"Error checking WireGuard: {exc}")
            return False

    def check_internet_connectivity(self):
        try:
            response = requests.get("https://1.1.1.1", timeout=10)
            return response.status_code == 200
        except Exception:
            return False

    def get_connected_peers(self):
        try:
            result = subprocess.run(
                ["wg", "show", "wg0", "latest-handshakes"],
                capture_output=True,
                text=True
            )
            peers = {}
            for line in result.stdout.split("\n"):
                if line.strip():
                    peer_pubkey, handshake = line.split("\t")
                    peers[peer_pubkey] = int(handshake)
            return peers
        except Exception as exc:
            logging.error(f"Error getting peers: {exc}")
            return {}

    def monitor_loop(self):
        while True:
            if not self.check_wireguard_status():
                logging.critical("WireGuard service is down!")
                # Aquí podrías integrar alertas (Telegram, email, etc.)

            if not self.check_internet_connectivity():
                logging.warning("Internet connectivity issue detected")

            peers = self.get_connected_peers()
            current_time = datetime.now().timestamp()

            for peer, handshake_time in peers.items():
                time_since_handshake = current_time - handshake_time
                if time_since_handshake > 180:
                    logging.warning(
                        f"Peer {peer[:8]}... no activity for {time_since_handshake:.0f}s"
                    )

            time.sleep(60)

if __name__ == "__main__":
    monitor = VPNMonitor()
    try:
        monitor.monitor_loop()
    except KeyboardInterrupt:
        logging.info("VPN monitor finalizado por el usuario")
    

3. Montar WireGuard con Docker para más aislamiento

Si prefieres aislar el servicio en un contenedor, una composición simple con Docker puede ayudarte a mantener el entorno más controlado.


version: "3.8"
services:
  wireguard:
    image: lscr.io/linuxserver/wireguard:latest
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/Madrid
      - SERVERURL=auto
      - SERVERPORT=51820
      - PEERS=3
      - PEERDNS=1.1.1.1
      - INTERNAL_SUBNET=10.0.0.0
    volumes:
      - /etc/wireguard:/config
      - /lib/modules:/lib/modules:ro
    ports:
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv4.ip_forward=1
    restart: unless-stopped
    
Nota: el valor de INTERNAL_SUBNET es un ejemplo. Ajusta esa red interna para que no choque con otras subredes que ya uses en tu infraestructura (por ejemplo, evita repetir la LAN de tu casa/oficina).

📊 VPN propio vs servicio comercial

Característica VPN propio VPN comercial
Costo ≈ 5 USD/mes (VPS) 10–15 USD/mes
Privacidad ✅ Control total de logs y configuración ❌ Posibles logs, políticas poco claras
Velocidad ✅ Ancho de banda dedicado ⚠️ Servidores compartidos
Ubicaciones ⚠️ Limitado a tus servidores ✅ Muchos países y regiones
Configuración ✅ Totalmente flexible ❌ Predefinida
Seguridad ✅ Transparente, auditable por ti ⚠️ “Caja negra” del proveedor

🚀 Casos de uso avanzados

1. Empresa: acceso seguro a recursos internos

En lugar de exponer bases de datos, paneles de administración o aplicaciones internas a internet, puedes obligar a que todo acceso se haga a través del VPN.


[Sede Central] ←→ [VPN Server] ←→ [Oficina Remota]
       ↑                              ↑
  [Servidores internos]           [Empleados]
  [Bases de datos]                [Equipos remotos]
    

2. Desarrollador: entorno de pruebas seguro

Puedes montar un entorno de desarrollo donde las bases de datos, Redis y otros servicios solo sean accesibles dentro de la red del VPN.


version: "3.8"
services:
  app:
    build: .
    environment:
      - DB_HOST=db.internal.vpn
      - REDIS_HOST=redis.internal.vpn
    networks:
      - vpn_network

  vpn:
    image: wireguard
    networks:
      - vpn_network
    volumes:
      - ./wg0.conf:/etc/wireguard/wg0.conf

networks:
  vpn_network:
    driver: bridge
    

3. Periodista o trabajador remoto: comunicaciones críticas

Para perfiles de alto riesgo (periodistas, activistas, personal remoto en países con censura) un VPN propio bien configurado es una capa adicional de protección.


import requests

def check_vpn_security():
    # Verificar IP externa
    external_ip = requests.get("https://api.ipify.org").text
    print(f"IP externa: {external_ip}")

    # Esta parte es ilustrativa, para tests de fugas DNS se recomiendan servicios específicos
    print("Revisa dnsleaktest.com o herramientas similares para verificar fugas DNS.")
    print("Verifica también fugas WebRTC desde el navegador con herramientas dedicadas.")

check_vpn_security()
    

🔍 Monitoreo y mantenimiento

Dashboard simple de estado

Un panel web básico te permite ver si el servicio está activo, qué peers están conectados y cuánto tráfico están consumiendo.


# vpn-dashboard.py - Panel de monitoreo simple
# Requiere: Flask (pip install flask) y plantilla templates/dashboard.html

from flask import Flask, render_template, jsonify
import subprocess

app = Flask(__name__)

@app.route("/")
def dashboard():
    return render_template("dashboard.html")

@app.route("/api/status")
def api_status():
    status = {
        "service": check_service(),
        "peers": get_peers()
    }
    return jsonify(status)

def check_service():
    result = subprocess.run(
        ["systemctl", "is-active", "wg-quick@wg0"],
        capture_output=True,
        text=True
    )
    return result.stdout.strip() == "active"

def get_peers():
    result = subprocess.run(
        ["wg", "show", "wg0", "dump"],
        capture_output=True,
        text=True
    )
    peers = []
    lines = result.stdout.split("\n")

    for line in lines[1:]:
        if line.strip():
            parts = line.split("\t")
            if len(parts) >= 7:
                peers.append({
                    "public_key": parts[0][:8] + "...",
                    "endpoint": parts[2],
                    "transfer_rx": parts[5],
                    "transfer_tx": parts[6],
                    "last_handshake": parts[4]
                })
    return peers

if __name__ == "__main__":
    app.run(host="127.0.0.1", port=5000)
    

💡 Consejos adicionales de seguridad

1. Mantén el servidor actualizado


# Configurar actualizaciones automáticas de seguridad
sudo dpkg-reconfigure -plow unattended-upgrades

# Mantener WireGuard y el sistema al día
sudo apt update && sudo apt upgrade -y
    

2. Automatiza backups de configuración


#!/bin/bash
# backup-vpn-config.sh
BACKUP_DIR="/home/backups/wireguard"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p "${BACKUP_DIR}"
cp -r /etc/wireguard/ "${BACKUP_DIR}/wireguard_${DATE}"
tar -czf "${BACKUP_DIR}/wireguard_${DATE}.tar.gz" "${BACKUP_DIR}/wireguard_${DATE}"

# Limpiar backups antiguos (mantener últimos 7 días)
find "${BACKUP_DIR}" -name "*.tar.gz" -mtime +7 -delete

echo "Backup completado: ${BACKUP_DIR}/wireguard_${DATE}.tar.gz"
    

🎯 Conclusión: toma el control de tu privacidad

En un mundo donde los datos son el nuevo petróleo, proteger tu información personal y profesional ya no es opcional: es un requisito de supervivencia digital.

Montar tu propio VPN te ofrece:

  • Control total sobre tu privacidad y configuración.
  • Transparencia en qué se registra y cómo.
  • Flexibilidad para adaptarlo a tus casos de uso.
  • Costo contenido a medio y largo plazo.
  • Aprendizaje profundo en redes y seguridad.

No esperes a que ocurra una filtración o incidente para reaccionar. Tu privacidad es tu responsabilidad: empezar por un VPN propio es un paso concreto y medible para mejorar de inmediato tu seguridad digital.

📚 Recursos adicionales

Este post ofrece una guía práctica para que puedas implementar tu propia solución VPN, entendiendo no solo el cómo, sino el por qué es crítica en el contexto digital actual.