Guía de tecnologías

Instalar y configurar OpenVPN en FreeBSD 12.0 con autenticación por certificados

7 min read VPN Actualizado 17 Oct 2025
OpenVPN en FreeBSD 12.0: guía con certificados
OpenVPN en FreeBSD 12.0: guía con certificados

Este tutorial explica paso a paso cómo instalar OpenVPN en FreeBSD 12.0, generar certificados con easy-rsa, configurar el servidor OpenVPN, ajustar pf y activar el reenvío de puertos. Incluye comprobaciones, consejos de seguridad, resolución de problemas y plantillas para el cliente. Ideal para administradores que quieren una VPN basada en certificados.

Objetivo principal y variantes relacionadas

  • Objetivo principal: instalar y configurar OpenVPN en FreeBSD 12.0 con autenticación por certificados.
  • Variantes relacionadas: configurar OpenVPN con autenticación por usuario/contraseña, usar WireGuard en sistemas FreeBSD, desplegar VPN en FreeBSD 13/14, integrar OpenVPN con RADIUS o LDAP.

Requisitos previos

  • FreeBSD 12.0 instalado y actualizado.
  • Mínimo 512 MB de RAM y 1 CPU (para despliegues de producción, aumentar recursos según carga).
  • Privilegios root o sudo.
  • PF (packet filter) instalado y activado.
  • Conexión a Internet para instalar paquetes.

Importante: este tutorial asume que la interfaz externa se llama vtnet0 (ajuste según su configuración).


1. Instalar OpenVPN

Actualice el repositorio de binarios e instale OpenVPN con pkg:

pkg update
pkg install openvpn

Habilite el servicio en el arranque y defina la interfaz túnel tun:

sysrc openvpn_enable="YES"
sysrc openvpn_if="tun"

Ahora el paquete OpenVPN está instalado y listo para configurar.

Captura de pantalla de instalación de OpenVPN en FreeBSD


2. Preparar variables para certificados (easy-rsa)

Creamos el directorio de configuración y copiamos easy-rsa:

mkdir -p /usr/local/etc/openvpn/
cp -R /usr/local/share/easy-rsa /usr/local/etc/openvpn/

Edite el archivo vars en /usr/local/etc/openvpn/easy-rsa/ y ajuste los valores:

cd /usr/local/etc/openvpn/easy-rsa/
vim vars

Ejemplo de contenido (modifique según sus datos):

set_var EASYRSA             "$PWD"
set_var EASYRSA_PKI         "$EASYRSA/pki"
set_var EASYRSA_DN          "cn_only"
set_var EASYRSA_REQ_COUNTRY "DE"
set_var EASYRSA_REQ_PROVINCE "Frankfurt"
set_var EASYRSA_REQ_CITY    "Frankfurt"
set_var EASYRSA_REQ_ORG     "hakase-labs CERTIFICATE AUTHORITY"
set_var EASYRSA_REQ_EMAIL   "[email protected]"
set_var EASYRSA_REQ_OU      "HAKASE-LABS EASY CA"
set_var EASYRSA_KEY_SIZE    2048
set_var EASYRSA_ALGO        rsa
set_var EASYRSA_CA_EXPIRE   7500
set_var EASYRSA_CERT_EXPIRE 365
set_var EASYRSA_NS_SUPPORT  "no"
set_var EASYRSA_NS_COMMENT  "HAKASE-LABS CERTIFICATE AUTHORITY"
set_var EASYRSA_EXT_DIR     "$EASYRSA/x509-types"
set_var EASYRSA_SSL_CONF    "$EASYRSA/openssl-1.0.cnf"
set_var EASYRSA_DIGEST      "sha256"

Haga ejecutable el archivo vars:

chmod +x vars

Editor mostrando el archivo vars preparado


3. Generar certificados

Inicialice la PKI y genere CA, certificados de servidor y cliente, DH y CRL.

cd /usr/local/etc/openvpn/easy-rsa/
./easyrsa.real init-pki

Generar la CA:

./easyrsa.real build-ca

Se le pedirá una contraseña para la clave CA; guárdela en un lugar seguro.

Generar petición de certificado para el servidor y firmarla:

./easyrsa.real gen-req openvpn-bsd nopass
./easyrsa.real sign-req server openvpn-bsd

Verifique el certificado del servidor:

openssl verify -CAfile pki/ca.crt pki/issued/openvpn-bsd.crt

Generar certificado para un cliente y firmarlo:

./easyrsa.real gen-req client01 nopass
./easyrsa.real sign-req client client01

Verifique el certificado cliente:

openssl verify -CAfile pki/ca.crt pki/issued/client01.crt

Generar CRL y parámetros Diffie-Hellman:

./easyrsa.real gen-crl
./easyrsa.real gen-dh

Copie certificados y claves a los directorios de OpenVPN:

mkdir -p /usr/local/etc/openvpn/{server,client}
cp pki/ca.crt /usr/local/etc/openvpn/server/
cp pki/issued/openvpn-bsd.crt /usr/local/etc/openvpn/server/
cp pki/private/openvpn-bsd.key /usr/local/etc/openvpn/server/
cp pki/ca.crt /usr/local/etc/openvpn/client/
cp pki/issued/client01.crt /usr/local/etc/openvpn/client/
cp pki/private/client01.key /usr/local/etc/openvpn/client/
cp pki/dh.pem /usr/local/etc/openvpn/server/
cp pki/crl.pem /usr/local/etc/openvpn/server/

Lista de certificados generados

Notas sobre certificados:

  • Mantenga la clave privada de la CA protegida y fuera del servidor de producción si es posible.
  • Use contraseñas fuertes para la CA; para escenarios automatizados puede usar claves sin passphrase, pero es menos seguro.

4. Configurar OpenVPN

Cree el archivo /usr/local/etc/openvpn/openvpn.conf y pegue la configuración del servidor:

cd /usr/local/etc/openvpn/
vim openvpn.conf

Contenido recomendado:

# OpenVPN Port, Protocol, and the Tun
port 1194
proto udp
dev tun

# OpenVPN Server Certificate - CA, server key and certificate
ca /usr/local/etc/openvpn/server/ca.crt
cert /usr/local/etc/openvpn/server/openvpn-bsd.crt
key /usr/local/etc/openvpn/server/openvpn-bsd.key

#DH and CRL key
dh /usr/local/etc/openvpn/server/dh.pem
crl-verify /usr/local/etc/openvpn/server/crl.pem

# Network Configuration - Internal network
# Redirect all Connection through OpenVPN Server
server 10.5.5.0 255.255.255.0
push "redirect-gateway def1"

# Using the DNS from https://dns.watch
push "dhcp-option DNS 84.200.69.80"
push "dhcp-option DNS 84.200.70.40"

#Enable multiple clients to connect with the same certificate key
duplicate-cn

# TLS Security
cipher AES-256-CBC
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256
auth SHA512
auth-nocache

# Other Configuration
keepalive 20 60
explicit-exit-notify 1
persist-key
persist-tun
comp-lzo yes
daemon
user nobody
group nobody

# OpenVPN Log
log-append /var/log/openvpn.log
verb 3

Inicie y compruebe el servicio:

service openvpn start
service openvpn status

Verifique puertos y sockets:

sockstat -l4

OpenVPN escuchando en puerto UDP 1194

Consejo: aumente verb a 4 o 5 temporalmente si necesita más trazas para depuración.


5. Configurar PF (pf.conf)

Defina variables y reglas NAT para enrutar tráfico del túnel hacia Internet. Edite /usr/local/etc/pf.conf o el archivo de configuración que use su instalación:

cd /usr/local/etc/
vim pf.conf

Ejemplo (ajuste variables ext_if y ext_ip según su entorno):

# vpn interface
vpn_if="tun0"
vpn_net = "10.5.5.0/24"

# reassemble all fragmented packets before filtering them
scrub in on $ext_if all fragment reassemble

# route traffic from VPN interface out to the internet
nat on ! $vpn_if from $vpn_net to any -> $ext_ip

# Allow Connection to VPN Server
pass in on $ext_if proto udp from any to ($ext_if) port 1194 keep state

# Pass all connection on the VPN Interface
pass in on $vpn_if from any to any

Compruebe y recargue reglas:

service pf check
service pf reload

Compruebe reglas activas:

pfctl -sr
pfctl -sn

Reglas PF cargadas correctamente

Nota: si su interfaz externa tiene NAT a Internet detrás de un router, ajuste la regla NAT acorde.


6. Activar reenvío de paquetes y gateway

Edite /etc/sysctl.conf y agregue:

net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1

Aplique la configuración:

sysctl -f /etc/sysctl.conf

Habilite la función de gateway en rc.conf:

sysrc gateway_enable="YES"

Reinicie el sistema para asegurar que todo arranque limpio:

reboot

Pantalla mostrando que se habilitó el reenvío de paquetes


7. Preparar configuración del cliente

Cree /usr/local/etc/openvpn/client/client01.ovpn y ajuste la dirección remota a la IP pública o FQDN de su servidor:

cd /usr/local/etc/openvpn/client/
vim client01.ovpn

Ejemplo de client01.ovpn:

client
dev tun
proto udp

remote xxx.xxx.xxx.xxx 1194

ca ca.crt
cert client01.crt
key client01.key

cipher AES-256-CBC
auth SHA512
auth-nocache
tls-version-min 1.2
tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA256

resolv-retry infinite
compress lzo
nobind
persist-key
persist-tun
mute-replay-warnings
verb 3

Descargue client01.ovpn, ca.crt, client01.crt y client01.key al equipo cliente de forma segura (scp, sftp o unidad USB cifrada).

Archivo .ovpn listo para el cliente


8. Pruebas y verificación

En el equipo cliente, conecte con:

openvpn --config client01.ovpn

En otra terminal del cliente, compruebe la interfaz tun0:

ifconfig tun0

Haga ping al servidor interno (por defecto 10.5.5.1):

ping -c3 10.5.5.1

Comprobación de salida a Internet desde el cliente a través del servidor VPN:

curl ipinfo.io

Debería recibir como resultado la IP pública del servidor si el push "redirect-gateway def1" y las reglas NAT están correctas.

Cliente conectado y mostrando IP pública del servidor


Buenas prácticas y seguridad

  • Almacene la clave CA en un sistema seguro, preferiblemente offline.
  • Rote certificados periódicamente (ejemplo: cada 1 año) y mantenga una CRL actualizada.
  • Restrinja acceso SSH al servidor VPN y habilite autenticación por clave pública.
  • Habilite y revise logs regularmente: /var/log/openvpn.log y syslog.
  • Considere usar certificados con passphrase para clientes sensibles.

Seguridad adicional y endurecimiento

  1. Disable comprimido LZO si no lo necesita o use compresión segura para evitar ataques de CRIME-like. Por ejemplo, desactive comp-lzo y use MTU/MSS tuning.
  2. Use TLS auth/mode tls-crypt para proteger la negociación TLS y mitigar ataques DDoS sencillos:
# Ejemplo: generar una clave tls-crypt
openvpn --genkey --secret ta.key
# en server.conf
tls-crypt /usr/local/etc/openvpn/server/ta.key
# en el cliente añadír
tls-crypt ta.key
  1. Limite algoritmos y fuerce TLS 1.2+ como en la configuración previa.
  2. Use user y group para bajar privilegios del proceso (ya definido como nobody).

Plantilla de lista de verificación antes de abrir producción

  • PKI generada y CA guardada fuera de producción
  • Certificados de servidor y cliente generados y verificados
  • [ ] openvpn.conf probado en modo verb 4 para depuración
  • pf con NAT probado y reglas guardadas
  • Reenvío IP activado y gateway_enable=YES
  • Respaldos de /usr/local/etc/openvpn/ y /etc/pf.conf
  • Registros y rotación de logs configurados
  • Pruebas de conexión desde varios clientes

Resolución de problemas comunes

  • No aparece la interfaz tun0 en el cliente: comprobar que dev tun esté correcto en ambos lados y que el cliente tenga permisos para crear interfaces.
  • No hay salida a Internet desde el cliente: revisar reglas NAT en pf y push "redirect-gateway def1" en el servidor.
  • Conexión rechazada en el puerto 1194: comprobar sockstat -l4, reglas pf y que el puerto esté abierto en routers/firewall externos.
  • Error de certificación: usar openssl verify -CAfile pki/ca.crt pki/issued/.crt para diagnosticar.

Alternativas y cuándo considerar otras opciones

  • WireGuard: si busca simplicidad, menor latencia y mejor rendimiento para conexiones modernas. WireGuard tiene una configuración más simple pero un modelo de llave diferente.
  • IPsec (strongSwan): preferible si necesita interoperabilidad con dispositivos móviles o hardware con soporte IPsec nativo.
  • OpenVPN con autenticación por usuario/contraseña + certificados: para añadir control de acceso centralizado.

Contraejemplo: para redes de baja latencia y grandes cantidades de peers en móviles, WireGuard suele ser una mejor opción que OpenVPN.


Mini metodología para rotación de certificados (resumen rápido)

  1. Crear nuevos certificados y claves en una CA segura.
  2. Probar en un servidor de staging con un cliente de prueba.
  3. Distribuir certificados nuevos a clientes críticos fuera de horario pico.
  4. Añadir certificados revocados a la CRL y desplegar crl.pem actualizado al servidor.
  5. Retirar certificados antiguos tras un periodo de coexistencia mínimo (p. ej. 7 días).

Diagrama de decisiones rápido

flowchart TD
  A[¿Necesita alto rendimiento y configuración simple?] -->|Sí| B[Evaluar WireGuard]
  A -->|No| C[¿Necesita compatibilidad con clientes legacy?]
  C -->|Sí| D[Usar OpenVPN con TLS y certificados]
  C -->|No| B
  D --> E[¿Requiere autenticación centralizada?]
  E -->|Sí| F[Integrar RADIUS/LDAP + OpenVPN]
  E -->|No| G[Usar solo certificados y PKI]

Lista de verificación por roles

Administrador de red:

  • Generar PKI y asegurar CA.
  • Configurar pf y NAT.
  • Revisar logs y monitoreo.

Ingeniero de seguridad:

  • Revisar cifrados y políticas TLS.
  • Auditar gestión de claves y rotación.

Usuario final:

  • Obtener .ovpn y claves de manera segura.
  • Comprobar conectividad y reportar problemas.

Glosario breve

  • CA: Autoridad de certificación que firma certificados.
  • CRL: Lista de revocación de certificados.
  • PKI: Infraestructura de clave pública.
  • DH: Parámetros Diffie-Hellman para intercambio de claves.

Compatibilidad y migración

  • Este tutorial está enfocado en FreeBSD 12.0. En FreeBSD 13+ los paquetes y rutas suelen ser equivalentes, pero verifique ubicaciones de easy-rsa y nombres de paquetes.
  • Para migrar a una versión superior, exporte /usr/local/etc/openvpn/ y pki y restórelos en el sistema objetivo tras instalar OpenVPN.

Privacidad y cumplimiento

  • El administrador debe documentar qué registros de conexión se conservan y por cuánto tiempo (logs, IPs, timestamps). Esto es relevante para cumplimiento de privacidad y, si aplica, normativas como GDPR.
  • Minimice la retención de logs sensibles y use registros anónimos o agregados cuando sea posible.

Resumen final

  • Instaló OpenVPN en FreeBSD 12.0, generó una PKI con easy-rsa, configuró el servidor, pf y el reenvío de paquetes.
  • Se incluyeron buenas prácticas, endurecimiento, listas de verificación, resolución de problemas y alternativas.

Siguientes pasos sugeridos: agregar monitoreo (Zabbix/Prometheus), automatizar rotación de certificados y probar la escalabilidad con varios clientes simultáneos.


Referencias

Autor
Edición

Materiales similares

NET::ERR_CERT_AUTHORITY_INVALID en Windows 10
Windows, Seguridad

NET::ERR_CERT_AUTHORITY_INVALID en Windows 10

Aprende inglés con IA: 10 apps principales
Idiomas

Aprende inglés con IA: 10 apps principales

Subtítulos en Final Cut Pro: guía práctica
Edición de Video

Subtítulos en Final Cut Pro: guía práctica

Instalar BIKA LIMS Inkosi en Ubuntu en 15 min
Guía técnica

Instalar BIKA LIMS Inkosi en Ubuntu en 15 min

Maximiza la batería de tu iPhone con iOS
Tecnología

Maximiza la batería de tu iPhone con iOS

Solución al error 0x800F0909 en paquetes de idioma
Windows

Solución al error 0x800F0909 en paquetes de idioma