Instalar y configurar OpenVPN en FreeBSD 12.0 con autenticación por 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.
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
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/
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
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
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
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).
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.
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
- 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. - 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
- Limite algoritmos y fuerce TLS 1.2+ como en la configuración previa.
- Use
user
ygroup
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/
para diagnosticar..crt
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)
- Crear nuevos certificados y claves en una CA segura.
- Probar en un servidor de staging con un cliente de prueba.
- Distribuir certificados nuevos a clientes críticos fuera de horario pico.
- Añadir certificados revocados a la CRL y desplegar
crl.pem
actualizado al servidor. - 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/
ypki
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
Materiales similares

NET::ERR_CERT_AUTHORITY_INVALID en Windows 10
Aprende inglés con IA: 10 apps principales

Subtítulos en Final Cut Pro: guía práctica
Instalar BIKA LIMS Inkosi en Ubuntu en 15 min

Maximiza la batería de tu iPhone con iOS
