Configuración de una Red Privada Virtual Empresarial

Implementación de OpenVPN utilizando servicios en la nube

1、Visión genarel de la arquitectura

2、Preparación del entorno

2.1 Adquisición de servidores

Se requieren dos servidores ECS en Alibaba Cloud: uno con dirección IP pública para permitir conexiones desde clientes externos, y otro sin IP pública. Ambos servidores conforman una estructura de red privada interna.


2.1.1 Servidor con IP pública

Crear red virtual y switches


Crear instancia ECS


Verificar conectividad


2.1.2 Servidor sin IP pública

El método de creación es similar, simplemente no seleccionar IP pública. Es importante mantener la misma zona de disponibilidad


Verificar conexión


2.1.3 Configuración de puertos

2.2 Instalación de software

# openvpn-server 
yum -y install openvpn easy-rsa
# openvpn-client
sudo apt install openvpn easy-rsa
# servicio interno
yum -y install nginx
echo www.empresavpn.com > /usr/share/nginx/html/index.html
nginx # iniciar servicio nginx
curl 127.0.0.1 # verificar funcionamiento


2.3 Configuración

2.3.1 Generación de certificados

2.3.1.1 Generar certificado del servidor

# copiar archivo de configuración de gestión de certificados
rpm -ql easy-rsa
mkdir /etc/openvpn/easy-rsa-server/3/vars -p
cp -r /usr/share/easy-rsa/ /etc/openvpn/easy-rsa-server
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-server/3/vars
vim /etc/openvpn/easy-rsa-server/3/vars
modificar tiempo de firma de certificados CA y servidor
set_var EASYRSA_CA_EXPIRE	36500 # tiempo de validez del certificado CA
set_var EASYRSA_CERT_EXPIRE 3650 # tiempo de validez del certificado del servidor
#  inicializar pki
cd /etc/openvpn/easy-rsa-server/3/
./easyrsa init-pki
# generar CA
./easyrsa build-ca nopass
verificar certificado CA generado
openssl x509 -in pki/ca.crt -noout -text
# generar certificado del servidor
generar req
./easyrsa gen-req servidor nopass
firmar certificado
sign-req <type> <filename_base> 
./easyrsa sign server servidor	# especificar tipo y nombre del certificado


2.3.1.2 Crear algoritmo Diffie-Hellman

# método 1
./easyrsa gen-dh
# método 2
openssl dhparam -out /etc/openvpn/dh2048.pem 2048


2.3.1.6 Generar certificado del cliente

mkdir /etc/openvpn/easy-rsa-client -p
cp -r /usr/share/easy-rsa/* easy-rsa-client/
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa-server/3/vars

# inicializar pki
./easyrsa init-pki
# inicializar req del cliente
./easyrsa gen-req usuario01 nopass
# usar CA para firmar certificado
importar req
cd /etc/openvpn/easy-rsa-server/3
./easyrsa import-req <request_file_path> <short_basename> # importar req del cliente
./easyrsa import-req /etc/openvpn/easy-rsa-client/3/pki/reqs/usuario01.req usuario01
modificar tiempo de validez del certificado del cliente
vim /etc/openvpn/easy-rsa-client/3/vars/vars.example
set_var EASYRSA_CERT_EXPIRE     90
firmar certificado
./easyrsa sign client usuario01


2.3.2 Configuración del servidor

2.3.2.1 Generar archivo de configuración

# copiar plantilla de configuración del servidor openvpn
rpm -ql openvpn
cp /usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf /etc/openvpn/


2.3.2.1.1 Explicación de parámetros de configuración

# Explicación de parámetros
# ; indica que la línea no tiene efecto
;local a.b.c.d#IP de escucha del servidor, por defecto todas las IPs
port 1194	#puerto
;proto tcp	#protocolo, producción recomienda TCP
proto udp #protocolo por defecto
;dev tap	#crear túnel ethernet, ethernet usa tap, un dispositivo tap permite tramas ethernet completas a través del túnel OpenVPN, soporta protocolos no-IP como IPX y AppleTalk, tap equivale a un dispositivo ethernet opera con paquetes de capa 2 como tramas ethernet.
dev tun #crear túnel IP enrutado, producción recomienda tun. Internet usa tun, un dispositivo tun se usa principalmente para comunicación basada en protocolo IP, tun simula un dispositivo de capa de red opera con paquetes de capa 3 como paquetes IP.
;dev-node MyTap	#Adaptador TAP-Win32, no necesario en Windows
ca	ca.crt	#nombre del archivo certificado CA
cert servidor.crt	#nombre del archivo certificado del servidor
key servidor.key	#nombre del archivo clave privada del servidor
dh dh2048.pem	#nombre del archivo parámetros dh
;topology subnet
server 10.8.0.0 255.255.255.0 #rango de IPs asignadas a clientes, el servidor ocupa la primera IP 10.8.0.1 como gateway del cliente
ifconfig-pool-persist ipp.txt #asignar IP fija a clientes, no es necesario, se recomienda comentar
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100 #configurar modo bridge, comentar
;server-bridge
;push "route 192.168.10.0 255.255.255.0" #ruta estática al segmento de red detrás del servidor para clientes
;client-config-dir ccd #agregar rutas para clientes específicos
;route 192.168.40.128 255.255.255.248
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
;learn-address ./script #ejecutar script externo
;push "redirect-gateway def1 bypass-dhcp" #todo el tráfico del cliente pasa por VPN
;push "dhcp-option DNS 208.67.222.222" #servidor DNS para clientes
;client-to-client #permitir comunicación directa entre clientes
;duplicate-cn #múltiples usuarios con mismo certificado
keepalive 10 120 #intervalo de verificación y timeout, por defecto ping cada 10 segundos, si no responde en 120 segundos se considera caído
tls-auth ta.key 0	#configuración de seguridad contra ataques DoS, generar con: openvpn --genkey --secret ta.key #servidor y cada cliente necesitan copia, parámetro 0 en servidor, 1 en cliente
cipher AES-256-CBC	#algoritmo de cifrado
;compress lz4-v2	#nuevo algoritmo de compresión OpenVPN2.4.X
;push "compress lz4-v2" #enviar uso de compresión al cliente
;comp-lzo #configuración de compresión para clientes antiguos
;max-clients 100 #número máximo de clientes
;user nobody #usuario y grupo para ejecutar openvpn
;group nobody
persist-key	#mantener clave al reiniciar servicio
persist-tun	#mantener dispositivo tun/tap activo al reiniciar
status openvpn-status.log #archivo de estado, registra cada minuto
;log	openvpn.log #primer tipo de registro
;log-append	openvpn.log #segundo tipo de registro, agregar al final
verb 3 #nivel de detalle del log, 0=silencioso, 4=uso normal, 5-6=depuración, 9=muy detallado
;mute 20 #máximo 20 mensajes del mismo tipo
explicit-exit-notify 1#notificar cliente para reconexión automática, solo UDP


2.3.1.2 Archivo de configuración

port 1194
proto tcp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/servidor.crt
key /etc/openvpn/certs/servidor.key
dh /etc/openvpn/certs/dh.pem
server 192.168.80.0 255.255.255.0
push "route 192.168.10.0 255.255.255.0"
keepalive 10 120
cipher AES-256-CBC
compress lz4-v2
push "compress lz4-v2"
max-clients 2048
user openvpn
group openvpn
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
mute 20
tls-auth /etc/openvpn/certs/ta.key 0



2.3.2.2 Configurar certificados

# copiar certificados al directorio
mkdir /etc/openvpn/certs
cp /etc/openvpn/easy-rsa-server/3/pki/ca.crt /etc/openvpn/certs/
cp /etc/openvpn/easy-rsa-server/3/pki/issued/servidor.crt /etc/openvpn/certs/
cp /etc/openvpn/easy-rsa-server/3/pki/private/servidor.key  /etc/openvpn/certs/
# copiar clave Diffie-Hellman
cp /etc/openvpn/easy-rsa-server/3/pki/dh.pem /etc/openvpn/certs/
# copiar certificado del cliente
mkdir /etc/openvpn/client/usuario01
find /etc/openvpn/ -name "usuario01.key" -o -name "usuario01.crt" -o -name ca.crt -o -name usuario01.key -exec cp {} /etc/openvpn/client/usuario01/ \;


2.3.2.3 Habilitar reenvío de tráfico en kernel

echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
sysctl -p


2.3.2.4 Agregar reglas iptables

echo 'iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -j MASQUERADE' >> /etc/rc.d/rc.local 
chmod +x /etc/rc.d/rc.local && /etc/rc.d/rc.local


2.3.2.5 Preparar archivo de servicio

[Unit]
Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I
After=network.target
[Service]
Type=notify
PrivateTmp=true
ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/ --config %i.conf
[Install]
WantedBy=multi-user.target
# iniciar
systemctl enable --now  openvpn@servidor.service


2.3.3 Configuración del cliente

2.3.3.1 Archivo de configuración

vim cliente.conf
client
dev tun
proto tcp
remote	106.15.42.34 1194 #IP pública del servidor OpenVPN en producción
resolv-retry infinite
nobind
ca ca.crt
cert usuario01.crt
key usuario01.key
remote-cert-tls server
cipher AES-256-CBC
verb 3	#este valor no debe cambiarse arbitrariamente
compress lz4-v2	#debe coincidir con el servidor


2.3.3.2 Configuración de certificados

Copiar certificados generados en el servidor al cliente
/etc/openvpn/client/usuario01/usuario01.key
/etc/openvpn/client/usuario01/usuario01.crt
/etc/openvpn/client/usuario01/ca.crt


2.3.3.3 Iniciar VPN

# linux
sudo openvpn  --config ./cliente.conf  --ca ./certs/ca.crt --cert ./certs/usuario01.crt --key ./certs/usuario01.key 


2.4 Verificación

2.4.1 Activar VPN y verificar

# revisar logs del servidor


# revisar interfaces de red


Acceder a la red interna


2.4.2 Desconectar VPN y verificar nuevamente

# revisar interfaces de red


Intentar acceder a la red interna, debería fallar


3、Mejoras de seguridad

3.1 Autenticación TLS

# iniciar sesión en el servidor
# generar archivo de clave
openvpn --genkey --secret /etc/openvpn/certs/ta.key
# editar archivo de configuración
vim /etc/openvpn/server.conf
tls-auth /etc/openvpn/certs/ta.key 0 # modificar configuración, cliente=1, servidor=0
# reiniciar servicio
systemctl restart openvpn@servidor.service


# iniciar sesión en cliente
# copiar clave del servidor al cliente
vim cliente.conf
tls-auth ta.key 1   # modificar configuración, cliente=1, servidor=0


# usar
# linux
sudo openvpn  --config ./cliente.conf  --ca ./certs/ca.crt --cert ./certs/usuario01.crt --key ./certs/usuario01.key  --tls-auth ./certs/ta.key


3.2 Proteger clave privada del cliente

# al generar req del cliente, ingresar contraseña, demás pasos iguales
./easyrsa gen-req [nopass] # no usar nopass


3.2.1 Verificación

Ingresar contraseña, conexión exitosa


3.3 Configuración de tiempo de certificado

# editar archivo de configuración del servidor
vim /etc/openvpn/easy-rsa-server/3/vars 
set_var EASYRSA_CERT_EXPIRE 90 # unidad en días


3.4 Revocación de certificados

cd /etc/openvpn/easy-rsa-server/3
./easyrsa revoke usuario02
# generar lista de certificados revocados
./easyrsa gen-crl


4、Configuración reocmendada para producción

# servidor
port 1194
proto tcp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/servidor.crt
key /etc/openvpn/certs/servidor.key
dh /etc/openvpn/certs/dh.pem
server 192.168.80.0 255.255.255.0
push "route 192.168.10.0 255.255.255.0"
keepalive 10 120
cipher AES-256-CBC
compress lz4-v2
push "compress lz4-v2"
max-clients 2048
user openvpn
group openvpn
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
verb 3
mute 20
tls-auth /etc/openvpn/certs/ta.key 0



# cliente
client
tls-auth ta.key 1
dev tun
proto tcp
remote  106.15.42.34 1194 #IP pública del servidor OpenVPN en producción
resolv-retry infinite
nobind
ca ca.crt
cert usuario01.crt
key usuario01.key
remote-cert-tls server
cipher AES-256-CBC
verb 3  #este valor no debe cambiarse arbitrariamente
compress lz4-v2 #debe coincidir con el servidor


Etiquetas: openvpn redes-privadas-virtuales alibaba-cloud ECS seguridad-informatica

Publicado el 6-5 17:49