Instalacion de OpenVPN en Debian 12
¿Que es OpenVPN?
OpenVPN es una herramienta que nos permite crear una red privada virtual (VPN) de una manera sencilla y segura, de esta manera podemos acceder a recursos de una red local desde otra red.
Requisitos
- Sistema Debian 12 actualizado.
- Privilegios de root o sudo.
- Acceso a internet.
Instalacion
Para instalar OpenVPN, solo tenemos que ejecutar el siguiente comando:
root@open-vpn-net1:~# apt install openvpn -y
Configuracion
En este post vamos a configurar un vpn de acceso remoto.
Antes que nada, este es el esquema de red que vamos a utilizar para la configuración de la vpn de acceso remoto:
Como podemos ver el esquema es muy sencillo, tenemos la red local del servidor VPN (192.168.1.0/24) y la red local del cliente VPN (192.168.50.0/24). Y el servidor VPN tiene dos interfaces de red, una para cada red.
Nuestro objetivo es que el cliente VPN Windows 10 pueda acceder a la red local del servidor VPN y tener conectividad con la máquina Windows 7.
Antes de comenzar a configurar openvpn, necesitamos nuestra propia autoridad de certificación (CA), para esto vamos a utilizar openssl.
Instalamos openssl:
root@open-vpn-net1:~# apt install openssl -y
Para que el proceso de creación de la CA y la generación de los certificados sea mas sencillo, vamos a utilizar el siguiente script:
#!/bin/bash
echo "Creando un directorio para la autoridad de certificación"
mkdir /etc/openvpn/ca
echo "Cambiando al directorio de la autoridad de certificación"
cd /etc/openvpn/ca
clear
echo "Creando una nueva clave privada para la autoridad de certificación"
openssl genpkey -algorithm RSA -out ca.key -aes256
clear
echo "Creando una nueva solicitud de certificado para la autoridad de certificación"
openssl req -new -key ca.key -out ca.csr
clear
echo "Creando un nuevo certificado autofirmado para la autoridad de certificación"
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt
clear
echo "Creando un directorio para el certificado del servidor"
mkdir /etc/openvpn/server
echo "Cambiando al directorio del certificado del servidor"
cd /etc/openvpn/server
clear
echo "Creando una nueva clave privada para el certificado del servidor"
openssl genpkey -algorithm RSA -out server.key -aes256
clear
echo "Creando una nueva solicitud de certificado para el servidor"
openssl req -new -key server.key -out server.csr
clear
echo "Creando un nuevo certificado para el servidor, firmado por la autoridad de certificación"
openssl x509 -req -days 365 -in server.csr -CA /etc/openvpn/ca/ca.crt -CAkey /etc/openvpn/ca/ca.key -set_serial 01 -out server.crt
echo "Creando un directorio para el certificado del cliente"
mkdir /etc/openvpn/client
echo "Cambiando al directorio del certificado del cliente"
cd /etc/openvpn/client
clear
echo "Creando una nueva clave privada para el certificado del cliente"
openssl genpkey -algorithm RSA -out client.key -aes256
clear
echo "Creando una nueva solicitud de certificado para el cliente"
openssl req -new -key client.key -out client.csr
clear
echo "Creando un nuevo certificado para el cliente, firmado por la autoridad de certificación"
openssl x509 -req -days 365 -in client.csr -CA /etc/openvpn/ca/ca.crt -CAkey /etc/openvpn/ca/ca.key -set_serial 01 -out client.crt
Este script crea una CA y los certificados para la CA, el servidor vpn y el cliente vpn.
Con la CA y los certificados creados, copiamos los certificados y las claves de la CA y el servidor a la carpeta de openvpn:
root@open-vpn-net1:~# cp /etc/openvpn/ca/ca.crt /etc/openvpn/ca/ca.key /etc/openvpn/server/server.crt /etc/openvpn/server/server.key /etc/openvpn/
Ahora tenemos que crear un archivo de configuración para el servidor vpn:
root@open-vpn-net1:~# nano /etc/openvpn/server.conf
Y agregamos lo siguiente:
port 1194 # El puerto que se usara para las conexiones VPN
proto tcp # El protocolo usado para las conexiones VPN
dev tun # Tipo de dispositivo virtual
ca /etc/openvpn/ca.crt # Archivo del certificado de la autoridad de certificación
cert /etc/openvpn/server.crt # Archivo del certificado del servidor
key /etc/openvpn/server.key # Archivo de la clave privada del servidor
dh /etc/openvpn/dh2048.pem # Archivo Diffie-Hellman para intercambio de claves
server 10.8.0.0 255.255.255.0 # IP del servidor y máscara de red
ifconfig-pool-persist ipp.txt # Archivo que mantiene la asignación de direcciones IP
keepalive 10 120 # Envia paquetes keepalive para mantener la conexión activa
comp-lzo # Comprime los datos de la conexión
user nobody # Ejecuta el servicio como el usuario "nobody"
group nogroup # Ejecuta el servicio como el grupo "nogroup"
persist-key # Mantiene la clave privada en la memoria
persist-tun # Mantiene la configuración de la conexión en la memoria
status openvpn-status.log # Archivo de registro de estado
verb 3 # Nivel de detalle en el registro
push "route 192.168.1.0 255.255.255.0" # Ruta a la red local
Guardamos los cambios y cerramos el archivo.
Ahora tenemos que crear un archivo para el intercambio de claves Diffie-Hellman:
root@open-vpn-net1:~# openssl dhparam -out /etc/openvpn/dh2048.pem 2048
Ahora tenemos que agregar las siguientes reglas iptables para permitir el trafico de red:
root@open-vpn-net1:~# iptables -A INPUT -i tun0 -j ACCEPT
root@open-vpn-net1:~# iptables -A FORWARD -i tun0 -j ACCEPT
root@open-vpn-net1:~# iptables -A INPUT -p udp --dport 1194 -j ACCEPT
- tun0: Interfaz de red virtual de openvpn. (Para ver las interfaces de red ejecutamos el comando “ip a”)
- –dport: Puerto de destino.
Si no tenemos habilitado el reenvio de paquetes (forwarding), tenemos que habilitarlo:
root@open-vpn-net1:~# echo "1" > /proc/sys/net/ipv4/ip_forward
Para que el reenvio de paquetes sea permanente, tenemos que editar el archivo /etc/sysctl.conf:
root@open-vpn-net1:~# nano /etc/sysctl.conf
Y descomentamos la siguiente linea:
net.ipv4.ip_forward=1
Guardamos los cambios y cerramos el archivo.
Ahora tenemos que reiniciar el servicio de openvpn:
root@open-vpn-net1:~# systemctl restart openvpn@server
Si queremos que el servicio se inicie automáticamente al iniciar el sistema, tenemos que habilitarlo:
root@open-vpn-net1:~# systemctl enable openvpn@server
Ahora tenemos que crear un archivo de configuración para el cliente vpn:
root@open-vpn-net1:~# nano /etc/openvpn/client.ovpn
Y agregamos lo siguiente:
client
dev tun # Tipo de dispositivo virtual
proto tcp # El protocolo usado para las conexiones VPN
remote 192.168.50.31 1194 # La dirección IP y puerto del servidor OpenVPN
resolv-retry infinite # Reintenta indefinidamente si la conexión falla
nobind # No vincula el puerto local
user nobody # Ejecuta el servicio como el usuario "nobody"
group nogroup # Ejecuta el servicio como el grupo "nogroup"
persist-key # Mantiene la clave privada en la memoria
persist-tun # Mantiene la configuración de la conexión en la memoria
ca ca.crt # Archivo del certificado de la autoridad de certificación
cert client.crt # Archivo del certificado del cliente
key client.key # Archivo de la clave privada del cliente
ns-cert-type server # Tipo de certificado del servidor
comp-lzo # Comprime los datos de la conexión
verb 3 # Nivel de detalle en el registro
Guardamos los cambios y cerramos el archivo.
Ahora tenemos que copiar los certificados de la CA y el cliente, también tenemos que copiar el archivo de configuración del cliente y la clave privada del cliente a la maquina cliente:
Una vez copiados los archivos, abrimos nuestro cliente openvpn y agregamos el archivo de configuración del cliente:
Le damos un nombre al perfil y si queremos que se inicie la conexión sin tener que introducir la contraseña de la clave privada, marcamos la casilla “Save Private Key Password”.
Ya hemos iniciado la conexión VPN, ahora tenemos conexión con la red local del servidor VPN:
Como podemos ver en la imagen, se ha generado en el cliente una nueva interfaz de red virtual con el direccionamiento que hemos configurado en el servidor VPN. Y podemos hacer ping a la máquina windows de la red local del servidor VPN.
Nota: Cuando reiniciamos el servicio de openvpn, nos pedirá la contraseña de la clave privada.
Si queremos que el servidor VPN deje de pedirnos la contraseña de la clave privada, tenemos que hacer los siguientes pasos:
Modificamos el archivo de configuración del servidor VPN:
root@open-vpn-net1:~# nano /etc/openvpn/server.conf
Y agregamos la siguiente linea:
askpass /etc/openvpn/auth.txt
Guardamos los cambios y cerramos el archivo.
Ahora tenemos que crear el archivo de autenticación:
root@open-vpn-net1:~# nano /etc/openvpn/auth.txt
Y agregamos la contraseña de la clave privada:
vpnpassword
Guardamos los cambios y cerramos el archivo.
Ajustamos los permisos del archivo de autenticación:
root@open-vpn-net1:~# chmod 600 /etc/openvpn/auth.txt
Reiniciamos el servicio de openvpn:
root@open-vpn-net1:~# systemctl restart openvpn@server
Ahora ya no nos pedirá la contraseña de la clave privada.
Con esto ya tenemos configurado nuestro servidor VPN de acceso remoto en Debian 12.