// DevOps

OpenVPN: configuración del servidor Ubuntu y del cliente Keenetic

Publicado el 22.09.2026

En esta instrucción veremos cómo levantar un servidor OpenVPN en Ubuntu y conectar a él un router Keenetic. Este escenario es útil si necesitas dar acceso a la red doméstica o reenviar servicios (por ejemplo, PBX o servidor web) a través de VPN.

Desde 2025 en Rusia los routers de esta plataforma se comercializan bajo la marca Netcraze (OOO “Netcraze”, anteriormente OOO “Kinetic”), modelos NC-xxxx; el firmware es el mismo — NDMS, por lo que todo lo descrito aplica también a ellos.

Cómo está organizada la infraestructura de certificados de OpenVPN y para qué sirve cada clave se explica con detalle en el artículo OpenVPN: Parte 2 — Cómo funciona: PKI, certificados y configuración básica. Aquí — un escenario práctico.


1. Preparación del servidor Ubuntu

1.1 Instalación de paquetes

bash
sudo apt update
sudo apt install -y openvpn easy-rsa iptables-persistent

1.2 Creación de la PKI (Easy-RSA v3)

bash
make-cadir ~/easy-rsa
cd ~/easy-rsa
./easyrsa init-pki
./easyrsa build-ca nopass

Claves del servidor

bash
./easyrsa gen-req server nopass
./easyrsa sign-req server server
./easyrsa gen-dh

Claves de cliente (para Keenetic)

bash
./easyrsa gen-req keenetic nopass
./easyrsa sign-req client keenetic

Clave TLS compartida para tls-auth

bash
openvpn --genkey secret ta.key

1.3 Colocar las claves

  • En /etc/openvpn/server/:

    • ca.crt (desde pki/), server.crt (desde pki/issued/), server.key (desde pki/private/), dh.pem (desde pki/), ta.key
  • En /etc/openvpn/ccd/keenetic (lo crearemos más adelante) — la subred detrás del Keenetic.

El nombre del archivo en ccd debe coincidir con el Common Name del certificado cliente — en el ejemplo es keenetic.


2. Configuración del servidor OpenVPN

Archivo /etc/openvpn/server/server.conf:

conf
port 1194
proto udp
dev tun
user nobody
group nogroup
topology subnet

server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt

ca ca.crt
cert server.crt
key server.key
dh dh.pem

# Protección TLS
tls-auth ta.key 0
auth SHA256
# Cifrados de datos: GCM para clientes con negociación de cifrado (OpenVPN 2.4+),
# CBC — opción de reserva para clientes sin negociación
data-ciphers AES-256-GCM:AES-128-GCM:AES-256-CBC
data-ciphers-fallback AES-256-CBC

keepalive 10 120
persist-key
persist-tun
explicit-exit-notify 1

# Ruta hacia la red detrás del Keenetic en la tabla del kernel del servidor (junto con iroute en ccd)
route 192.168.45.0 255.255.255.0

# Enviamos solo las rutas necesarias
push "route 10.8.0.0 255.255.255.0"
push "route 192.168.45.0 255.255.255.0"

# Configuración individual de clientes
client-config-dir /etc/openvpn/ccd

status /var/log/openvpn/status.log
log-append /var/log/openvpn/openvpn.log
verb 3

3. Indicar la red detrás del Keenetic (CCD)

Archivo /etc/openvpn/ccd/keenetic:

conf
iroute 192.168.45.0 255.255.255.0

Se necesitan ambas directivas: route en server.conf dirige los paquetes desde el kernel del servidor hacia OpenVPN, y iroute dentro de OpenVPN indica a qué cliente entregarlos. Sin route el tráfico hacia 192.168.45.0/24 no entrará en el túnel (así está descrito en la ayuda de OpenVPN para --iroute).

Arrancar el servidor (en Ubuntu la configuración de /etc/openvpn/server/ se ejecuta con la plantilla openvpn-server@):

bash
sudo mkdir -p /var/log/openvpn
sudo systemctl enable --now openvpn-server@server

4. Activar el reenvío IP

bash
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-openvpn.conf
sudo sysctl --system

5. Configuración de iptables (DNAT + SNAT)

Ejemplo para:

  • Servidor web: 192.168.45.230:443
  • PBX: 192.168.45.235:5060–5065 TCP, 10000–20000 UDP
bash
EXT_IF=enp3s0   # interfaz externa

# DNAT
iptables -t nat -A PREROUTING -i $EXT_IF -p tcp --dport 443        -j DNAT --to-destination 192.168.45.230
iptables -t nat -A PREROUTING -i $EXT_IF -p tcp --dport 5060:5065   -j DNAT --to-destination 192.168.45.235
iptables -t nat -A PREROUTING -i $EXT_IF -p udp --dport 10000:20000 -j DNAT --to-destination 192.168.45.235

# FORWARD (ida y vuelta)
iptables -A FORWARD -i $EXT_IF -o tun0 -d 192.168.45.230 -p tcp --dport 443 \
  -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $EXT_IF -o tun0 -d 192.168.45.235 -p tcp --dport 5060:5065 \
  -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $EXT_IF -o tun0 -d 192.168.45.235 -p udp --dport 10000:20000 \
  -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i tun0 -o $EXT_IF \
  -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# SNAT (para que las respuestas salgan a través del servidor VPN)
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -d 192.168.45.0/24 -o tun0 -j MASQUERADE

Guardar las reglas:

bash
netfilter-persistent save

6. Configuración del cliente Keenetic

Archivo keenetic.ovpn:

conf
client
dev tun
proto udp
remote <PUBLIC_IP_UBUNTU> 1194
resolv-retry infinite
nobind
persist-key
persist-tun

remote-cert-tls server
tls-auth ta.key 1
key-direction 1
auth SHA256
cipher AES-256-CBC
verb 3

<ca>
-----BEGIN CERTIFICATE-----
... ca.crt ...
-----END CERTIFICATE-----
</ca>

<cert>
-----BEGIN CERTIFICATE-----
... keenetic.crt ...
-----END CERTIFICATE-----
</cert>

<key>
-----BEGIN PRIVATE KEY-----
... keenetic.key ...
-----END PRIVATE KEY-----
</key>

<tls-auth>
-----BEGIN OpenVPN Static key V1-----
... ta.key ...
-----END OpenVPN Static key V1-----
</tls-auth>

Requisitos de Keenetic para el archivo (según la documentación del fabricante):

  • toda la configuración, certificados y claves — en un solo archivo;
  • solo opciones de la ayuda de OpenVPN 2.4, las opciones para IPv6 no están soportadas;
  • la clave privada sin contraseña — no hay lugar en la interfaz del router para introducirla;
  • el archivo no se guarda en startup-config, guarda una copia de seguridad por separado.

La línea cipher AES-256-CBC en el cliente es de reserva: el cliente OpenVPN 2.4 con negociación de cifrados anuncia al servidor soporte para AES-256-GCM y AES-128-GCM, y el servidor elegirá GCM de su lista data-ciphers.

Para que OpenVPN funcione en Keenetic se necesita el componente “OpenVPN client and server”. La conexión se crea en la página Otras conexiones → Conexiones VPN → Crear conexión: tipo — OpenVPN, el contenido de keenetic.ovpn se pega en el campo de configuración.

  • Desactive “Usar para salida a Internet”, de lo contrario todo el tráfico saldrá por la VPN.
  • Para que el tráfico desde el túnel pueda alcanzar la red doméstica, en la línea de comandos de Keenetic ponga la interfaz en nivel de seguridad privado y permita la comunicación entre interfaces privadas (comandos del ejemplo site-to-site en la documentación de Keenetic):
cli
(config)> interface OpenVPN0 security-level private
(config)> no isolate-private
(config)> system configuration save

El número de la interfaz (OpenVPN0) lo puedes ver con el comando show interface — depende del número de conexiones creadas. Otras variantes del cliente VPN en Keenetic se analizan en el artículo Keenetic: Parte 3 — Cliente VPN para toda la red.


✅ Resultado

El servidor Ubuntu actúa como puerta de enlace VPN, y el Keenetic da acceso a su red local 192.168.45.0/24. Los servicios detrás del router son accesibles desde el exterior mediante el reenvío de puertos en la dirección pública del servidor.

// Contact

¿Necesitas ayuda?

Escríbeme y te ayudaré a resolver el problema

Respondo en un día laborable (03:00-13:00 GMT)

Или оставьте заявку здесь:

Confirme que no es un bot.

Escribir y recibir una respuesta rápida