Si ya implementaste un servidor OpenVPN usando nuestra guía: https://www.orangebox.cl/blog/seguridad/vpn-linux-empresas-openvpn

  • Los certificados funcionan.
  • Los clientes se conectan.
  • El túnel VPN se establece correctamente.

Y entonces aparece una pregunta que muy pocas guías responden.

¿Qué puede hacer un usuario una vez que logra conectarse a la VPN?

Una cosa es autenticar a un usuario.

Otra completamente distinta es decidir a qué recursos internos puede acceder.

Muchísimas implementaciones dejan esa segunda parte completamente abierta.

Y ahí es donde comienza el verdadero problema, porque una vez que el usuario se autentica usando OpenVPN,
el sistema lo deja suelto a sus anchas dentro de la red, le da una dirección de red a la que puede llegar
y listo, puede acceder a todo, tal como si estuviera dentro de la red y muchas veces, eso no es lo que queremos.
Está bien, queremos dejarlo entrar a nuestra red, pero NO A TODO!.


OpenVPN autentica. No administra permisos.

Existe una idea bastante común de que OpenVPN también controla el acceso a la red interna.

No es así.

OpenVPN fue diseñado para:

  • Autenticar clientes.
  • Cifrar las comunicaciones.
  • Crear el túnel VPN.
  • Asignar direcciones IP.
  • Publicar rutas hacia las redes internas.

Y hace todo eso muy bien.

Pero OpenVPN no implementa un sistema de control o autorización.

No existe una opción donde puedas decir:

  • Este usuario sólo puede acceder al servidor web.
  • Este proveedor únicamente puede llegar a la DMZ.
  • El equipo de monitoreo sólo puede utilizar Zabbix.
  • Los administradores tienen acceso completo.

Simplemente porque esa nunca fue la función de OpenVPN.

Su trabajo termina cuando el túnel queda establecido.

Desde ese momento, quien debe decidir qué tráfico está permitido es el firewall del servidor… ¿Pero cómo hacemos conversar al firewall con la VPN?, como sabe el firewall que el usuario “pedrito” tiene qué IP?


El error más común

Muchas implementaciones terminan funcionando de esta forma.

Internet
 OpenVPN
192.168.10.0/24

El usuario se conecta.

Recibe una dirección IP.

Aprende las rutas internas.

Y puede intentar comunicarse con prácticamente cualquier equipo alcanzable desde la VPN.

No porque OpenVPN sea inseguro.

Sino porque nadie ha definido una política de acceso.

Mientras el firewall lo permita, OpenVPN no va a impedir esas conexiones.


El principio de mínimo privilegio o Zero Trust

Uno de los principios básicos de seguridad consiste en entregar únicamente los permisos necesarios para realizar una tarea.

Nada más.

Por ejemplo.

Un proveedor externo que mantiene el sitio web probablemente sólo necesita acceso a los servidores web.

El equipo de monitoreo únicamente necesita llegar al servidor Zabbix.

El área de soporte puede requerir acceso al DNS interno y al servidor de archivos.

Sólo algunos administradores necesitarán acceso completo a toda la infraestructura.

Mientras menor sea la cantidad de recursos accesibles desde la VPN, menor será la superficie de ataque y menor el impacto si un certificado termina comprometido.


Separando autenticación de autorización

Una arquitectura mucho más limpia consiste en separar ambas responsabilidades.

               Cliente VPN
               OpenVPN
            (Autenticación)
               Firewall
            (Autorización)
             Recursos internos

OpenVPN responde una pregunta.

¿Quién eres?

El firewall responde otra completamente distinta.

¿Qué puedes hacer?

Separar ambas funciones hace que la infraestructura sea mucho más simple de administrar y auditar.


El problema de administrar usuarios

Supongamos una empresa con cien usuarios VPN.

Una mala solución sería crear reglas individuales para cada uno.

Felipe
  └── Servidor A

Juan
  └── Servidor B

Pedro
  └── Servidor C

Proveedor
  └── Servidor D

Cada usuario nuevo implica modificar el firewall.

Cada cambio agrega nuevas reglas.

Cada auditoría se vuelve más compleja.

Y después de algunos meses nadie recuerda por qué existen determinadas reglas.

Y escalar con una solución así es un desastre.


Pensando en grupos, no en usuarios

Una alternativa mucho más ordenada consiste en administrar permisos mediante grupos.

En lugar de definir accesos para cada persona, definimos grupos asociados a servicios o segmentos de red.

Grupo Recursos permitidos
DNS 192.168.10.2
WEB 192.168.10.20, 192.168.10.21
FILESERVER 192.168.10.30
AD 192.168.10.10, 192.168.10.11
MONITOREO 192.168.200.240
VCENTER 192.168.100.50
BACKUP 192.168.50.20
DMZ 172.16.0.0/24
VIP Acceso completo

Ahora los usuarios simplemente pertenecen a uno o más grupos.

Proveedor web.

WEB

Equipo de monitoreo.

DNS
MONITOREO

Administrador.

VIP

La administración cambia completamente.

Si mañana aparece un nuevo servidor de monitoreo, sólo debes modificar el grupo MONITOREO.

No es necesario revisar todos los usuarios de la VPN.


Aprovechando el Client Config Directory (CCD)

OpenVPN ya dispone de un mecanismo muy útil llamado Client Config Directory (CCD).

Normalmente se utiliza para asignar direcciones IP estáticas o publicar rutas específicas.

También puede aprovecharse para almacenar información adicional del cliente.

Por ejemplo agregarlos a estos grupos que vamos a definir.

ifconfig-push 10.100.0.15 255.255.255.0

# ACCESS=DNS,WEB,FILESERVER

Otro usuario.

ifconfig-push 10.100.0.20 255.255.255.0

# ACCESS=DNS,MONITOREO

Administrador.

ifconfig-push 10.100.0.30 255.255.255.0

# ACCESS=VIP

Toda la información del cliente queda concentrada en un único lugar.


Automatizando el firewall

Una vez que los permisos están definidos en el CCD, el siguiente paso consiste en automatizar su aplicación.

Cada vez que un cliente establece la VPN, OpenVPN ejecuta el script learn-address.

Ese script puede:

  1. Identificar qué cliente acaba de conectarse.
  2. Leer su archivo CCD.
  3. Obtener los grupos asignados.
  4. Buscar qué direcciones pertenecen a cada grupo.
  5. Crear automáticamente las reglas de iptables.
  6. Eliminar esas reglas cuando el cliente se desconecta.

El flujo completo sería algo similar a esto.

Cliente conecta
 learn-address
 Lee CCD
 ACCESS=DNS,WEB
 access.conf
 iptables
 Permisos aplicados

Todo ocurre automáticamente.

No es necesario modificar el firewall cada vez que un usuario establece la VPN.


¿Por qué no utilizar solamente OpenVPN?

Porque OpenVPN nunca fue pensado para administrar permisos sobre la red.

Su función es autenticar clientes y construir un canal seguro.

El control de acceso siempre debería quedar en manos del firewall.

Eso además tiene varias ventajas.

  • Aplicas el principio de mínimo privilegio.
  • Los permisos son mucho más fáciles de auditar.
  • Incorporar nuevos usuarios resulta muy simple.
  • Agregar nuevos servicios no requiere modificar la lógica del sistema.
  • La administración escala mucho mejor cuando la cantidad de clientes comienza a crecer.

OpenVPN Access Manager

Para implementar esto, les comparto este modelo que hicimos de OpenVPN Access Manager, un proyecto open source que automatiza la creación y eliminación de reglas de iptables utilizando los archivos CCD de OpenVPN.

Esto permite definir grupos de acceso en un único archivo de configuración y asignarlos a cada cliente mediante una simple línea en su archivo CCD.

De esta forma OpenVPN continúa haciendo lo que mejor sabe hacer: autenticar usuarios.

Mientras tanto, el firewall se encarga de decidir qué recursos puede utilizar cada cliente.

Puedes encontrar el código fuente, la documentación y los ejemplos de configuración en el repositorio del proyecto.

https://github.com/OrangeBox-Labs/openvpn/tree/main/openvpn-access-manager

OpenVPN Access Manager

Para implementar este modelo de control de acceso, preparé OpenVPN Access Manager, un proyecto open source que automatiza la creación y eliminación de reglas de iptables utilizando la funcionalidad learn-address de OpenVPN.

La idea es mantener separados los roles de cada componente:

  • OpenVPN autentica al cliente y establece el túnel.
  • OpenVPN Access Manager determina qué permisos tiene ese cliente.
  • iptables aplica las políticas de acceso a la red.

Toda la administración se realiza mediante archivos de configuración, sin necesidad de modificar el script cada vez que se incorpora un nuevo usuario o cambia un permiso.


Instalación y configuración

1. Descargar el proyecto

Clona el repositorio:

git clone https://github.com/OrangeBox-Labs/openvpn.git

cd openvpn/openvpn-access-manager

2. Instalar OpenVPN Access Manager

Ejecuta el instalador:

./install.sh

El instalador copiará los archivos necesarios dentro del directorio de OpenVPN y creará la estructura requerida para administrar los permisos.

Al finalizar deberías tener una estructura similar a:

/etc/openvpn/server/

├── server.conf
├── ccd/
└── access-manager/
    ├── access.conf
    ├── learn-address.sh
    ├── install.sh
    └── uninstall.sh

3. Configurar OpenVPN

Edita la configuración del servidor:

vi /etc/openvpn/server/server.conf

Agrega la directiva:

learn-address /etc/openvpn/server/access-manager/learn-address.sh

Esta directiva permite que OpenVPN ejecute el script automáticamente cada vez que un cliente conecta o desconecta.

Reinicia el servicio:

systemctl restart openvpn-server@server

4. Definir grupos de acceso

Los permisos se administran desde un único archivo access.conf
debe tener el siguiente formato:
GROUP_NOMRE=IP_DESTINO

vi /etc/openvpn/server/access-manager/access.conf

Ejemplo:

#
# Servicios internos
#

GROUP_DNS="192.168.10.2"

GROUP_WEB="192.168.10.20,192.168.10.21"

GROUP_FILESERVER="192.168.10.30"

GROUP_AD="192.168.10.10,192.168.10.11"

GROUP_MONITOREO="192.168.200.240"

GROUP_VCENTER="192.168.100.50"

GROUP_BACKUP="192.168.50.20"


#
# Redes completas
#

GROUP_DMZ="172.16.0.0/24"

GROUP_LAN="192.168.0.0/16"


#
# Acceso completo
#

GROUP_VIP="ALL"

Agregar un nuevo servicio sólo requiere crear un nuevo grupo:

GROUP_GITLAB="192.168.30.50"

GROUP_PROMETHEUS="192.168.200.20"

No es necesario modificar el resto código del proyecto.


5. Asignar permisos a los usuarios

Los permisos se asignan utilizando los archivos CCD de OpenVPN.

Cada archivo corresponde al Common Name (CN) del certificado del cliente.

Ejemplo:

vi /etc/openvpn/server/ccd/froman

Contenido:

ifconfig-push 10.100.0.10 255.255.255.0

# ACCESS=DNS,WEB,FILESERVER

Otro usuario:

ifconfig-push 10.100.0.20 255.255.255.0

# ACCESS=DNS,MONITOREO

Administrador:

ifconfig-push 10.100.0.30 255.255.255.0

# ACCESS=VIP

Proveedor externo:

ifconfig-push 10.100.0.40 255.255.255.0

# ACCESS=WEB

Un usuario puede pertenecer a múltiples grupos:

# ACCESS=DNS,AD,VCENTER,BACKUP

6. ¿Qué ocurre cuando un usuario conecta?

Cuando el cliente establece la conexión VPN, el flujo es el siguiente:

Cliente conecta


OpenVPN ejecuta learn-address


Lee el archivo CCD del usuario


Obtiene los grupos asignados


Consulta access.conf


Genera reglas iptables


Usuario obtiene acceso únicamente a los recursos permitidos

No es necesario crear reglas manualmente por cada usuario.


7. Verificar las reglas generadas

Puedes revisar las reglas activas:

iptables -L OPENVPN -v -n

Ejemplo:

ACCEPT  all  --  10.100.0.10  192.168.10.2

ACCEPT  all  --  10.100.0.10  192.168.10.20

ACCEPT  all  --  10.100.0.10  192.168.10.30

DROP    all  --  10.100.0.10  0.0.0.0/0

En este caso el usuario puede acceder únicamente a:

  • DNS interno.
  • Servidores web.
  • Servidor de archivos.

Todo el resto del tráfico queda bloqueado.


8. Probar los permisos

La prueba debe validar tanto accesos permitidos como bloqueados.

Servicio permitido

Ejemplo:

ping 192.168.10.2

Debe responder correctamente.


Servicio web permitido

curl http://192.168.10.20

Debe responder.


Servicio no autorizado

Ejemplo:

ping 192.168.10.100

Debe fallar.

El usuario continúa conectado a la VPN, pero el firewall impide acceder a recursos para los que no tiene permisos.


9. Agregar un nuevo usuario

Una vez implementado, crear un nuevo acceso VPN requiere solamente:

  1. Crear el certificado del usuario.
  2. Crear su archivo CCD.
  3. Asignar una IP fija.
  4. Definir sus grupos de acceso.

Ejemplo:

vi /etc/openvpn/server/ccd/nuevo_usuario

NOTA: Recuerden que el nombre del archivo, debe ser exactamente igual al nombre que usaron al crear el usuario con easy-rsa (CN)

Contenido:

ifconfig-push 10.100.0.50 255.255.255.0

# ACCESS=DNS,WEB

El usuario quedará automáticamente limitado a esos recursos.


10. Administración diaria

Consultar usuarios conectados:

systemctl status openvpn-server@server

Ver reglas actuales:

iptables -L OPENVPN -v -n

Eliminar reglas temporales:

iptables -F OPENVPN

Reiniciar OpenVPN:

systemctl restart openvpn-server@server

¿Por qué utilizar iptables?

Básicamente porque estoy viejo, Y aunque las distribuciones Linux modernas utilizan principalmente nftables como framework de filtrado de paquetes y herramientas como firewalld para simplificar la administración del firewall, este proyecto utiliza iptables por una razón práctica: compatibilidad y simplicidad.

OpenVPN tiene una integración histórica y muy bien documentada con iptables mediante scripts como learn-address, permitiendo crear y eliminar reglas dinámicamente cuando un cliente conecta o desconecta.

Además, iptables sigue estando ampliamente disponible en distribuciones Enterprise Linux mediante la capa de compatibilidad iptables-nft, por lo que continúa siendo una alternativa válida en entornos donde se busca una implementación sencilla, predecible y fácil de auditar.


Consideraciones finales

OpenVPN es excelente para crear túneles seguros, pero una VPN no debería convertirse en una puerta abierta hacia toda la red interna.

Separar autenticación y autorización permite aplicar controles más estrictos, reducir la superficie de ataque y administrar permisos de forma mucho más simple.

Con este modelo, agregar un nuevo usuario, modificar permisos o incorporar un nuevo servicio deja de ser un trabajo manual sobre reglas de firewall y pasa a ser una simple asignación de grupos.


Conclusión

Instalar una VPN es sólo el primer paso.

Permitir que cualquier usuario autenticado tenga acceso a toda la red interna rara vez es una buena idea.

Separar la autenticación del control de acceso permite construir una infraestructura mucho más segura, más fácil de administrar y preparada para crecer.

Si mañana necesitas incorporar diez usuarios nuevos o modificar los permisos de un proveedor externo, bastará con actualizar su archivo CCD.

Sin tocar la configuración principal de OpenVPN.

Sin agregar reglas manuales al firewall.

Y sin convertir la administración de la VPN en un problema cada vez más difícil de mantener.


¿Quién administra tu infraestructura cuando las cosas se complican?

Una VPN correctamente configurada es una pieza importante de seguridad, pero es sólo una parte de una infraestructura bien administrada.

En OrangeBox trabajamos con empresas que necesitan servidores Linux estables, seguros y disponibles, apoyando la operación diaria con administración, monitoreo, hardening, firewalls, VPN y resolución de problemas reales.

Si quieres delegar la administración de tus servidores Linux a un equipo especializado, puedes revisar nuestros planes de servicios administrados:

https://www.orangebox.cl/servicios/administracion-linux/#planes

Si tienes una infraestructura que necesita evaluación, conversemos.