474 lines
16 KiB
Markdown
474 lines
16 KiB
Markdown
---
|
|
title: OpenVPN - Guía de instalación
|
|
description: Guía de instalación utilizada durante la realización de la práctica
|
|
published: true
|
|
date: 2022-05-31T21:04:15.280Z
|
|
tags: vpn, servidor
|
|
editor: markdown
|
|
dateCreated: 2022-05-31T21:04:15.280Z
|
|
---
|
|
|
|
# Panel Títulos (⌘ 1)
|
|
|
|
```bash
|
|
unimatrix -f -n -s 96 -w && clear && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && perl -pe "system 'sleep .06'" openvpn.txt && echo "" && echo "" && echo "" && sleep 10 && clear
|
|
```
|
|
|
|
```bash
|
|
clear && cowsay -W 220 -f ovpn 'En esta práctica vamos a realizar una instalación de OpenVPN con un PKI compuesto de una CA y una SubCA. El esquema propuesto será este:'
|
|
```
|
|
|
|
```bash
|
|
unimatrix -f -n -s 96 -w && clear && perl -pe "system 'sleep .06'" ovpn-scheme.txt && echo "" && echo "" && echo "" && sleep 10 && clear
|
|
```
|
|
|
|
```bash
|
|
clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 130 -f ansi-shadow 'Instalacion de ' -c | lolcat && echo "" && echo "" && echo "" && figlet -w 220 -f ansi-shadow 'EasyRSA' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
|
|
```
|
|
|
|
# Panel CA (⌘ 2), Luego Panel Signer (⌘ 3), luego Panel oVPN (⌘ 4)
|
|
|
|
```bash
|
|
clear && cowsay -W 76 -f ovpn 'Para comenzar con la instalación de "OpenVPN" será necesario realizar la instalación de EasyRSA, para ello se descargará la última versión de esta aplicación en nuestro CA y nuestro signer, y luego simplemente habrá que descomprimirlo'
|
|
```
|
|
|
|
```bash
|
|
wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.0/EasyRSA-3.1.0.tgz
|
|
```
|
|
|
|
```bash
|
|
cd ~
|
|
tar xvf EasyRSA-3.1.0.tgz
|
|
mv EasyRSA-3.1.0 EasyRSA
|
|
cd EasyRSA
|
|
```
|
|
|
|
```bash
|
|
clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 130 -f ansi-shadow 'Configuracion' -c | lolcat && echo "" && echo "" && echo "" && figlet -w 240 -f ansi-shadow 'de EasyRSA' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
|
|
```
|
|
|
|
```bash
|
|
clear && cowsay -W 76 -f ovpn 'Creamos nuestro fichero de propiedades `vars`'
|
|
```
|
|
|
|
```bash
|
|
nano vars # o vim vars
|
|
```
|
|
|
|
```bash
|
|
set_var EASYRSA_REQ_COUNTRY "ES"
|
|
set_var EASYRSA_REQ_PROVINCE "Valladolid"
|
|
set_var EASYRSA_REQ_CITY "Valladolid"
|
|
set_var EASYRSA_REQ_ORG "Bastionado"
|
|
set_var EASYRSA_REQ_EMAIL "admin@bastionado.es"
|
|
set_var EASYRSA_REQ_OU "Community"
|
|
|
|
set_var EASYRSA_CA_EXPIRE 7090 # La CA durará 20 años
|
|
|
|
set_var EASYRSA_CERT_EXPIRE 180 # Los certificados cliente caducan cada 6 meses
|
|
|
|
set_var EASYRSA_CRL_DAYS 90 # La lista de revocaciones se actualiza aproximadamente cada 3 meses
|
|
|
|
set_var EASYRSA_CERT_RENEW 20 # Los certificados se pueden renovar con 20 días de antelación
|
|
```
|
|
|
|
|
|
```bash
|
|
clear && cowsay -W 76 -f ovpn 'Se hará uso de criptografía de curva elíptica para el cifrado, concretamente una Curva Edwards'
|
|
```
|
|
|
|
```bash
|
|
set_var EASYRSA_ALGO ed
|
|
```
|
|
|
|
|
|
|
|
```bash
|
|
clear && cowsay -W 76 -f ovpn 'La especificación de curva elíptica usada será Curva 25519, definida como una curva segura según SafeCurves'
|
|
```
|
|
|
|
```bash
|
|
set_var EASYRSA_CURVE ed25519
|
|
```
|
|
|
|
```bash
|
|
clear && cowsay -W 220 -f ovpn 'Repetiremos este proceso en Signer y Ovpn'
|
|
```
|
|
|
|
# Panel Títulos (⌘ 1)
|
|
|
|
```bash
|
|
clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 140 -f ansi-shadow 'Creacion de CA' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
|
|
```
|
|
|
|
# Panel CA (⌘ 2)
|
|
|
|
```bash
|
|
clear && cowsay -W 76 -f ovpn 'Para poder realizar la creación de la CA será necesario inicialzar nuestra Infreaestructura de Clave Pública en la propia CA. Se informará de que el fichero vars, anteriormente modificado se ha movido a la PKI, por lo que se borra el inicial, y finalemnte creamos nuestra CA'
|
|
```
|
|
|
|
```bash
|
|
./easyrsa init-pki
|
|
|
|
mv vars pki/vars
|
|
|
|
./easyrsa build-ca # Podríamos añadir 'nopass' para no establecer una Passphrase
|
|
```
|
|
|
|
# Panel Títulos (⌘ 1)
|
|
|
|
```bash
|
|
clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 150 -f ansi-shadow 'Creacion de SubCA ' -c | lolcat && echo "" && echo "" && echo "" && figlet -w 240 -f ansi-shadow 'en Signer' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
|
|
```
|
|
|
|
# Panel Signer (⌘ 3)
|
|
|
|
```bash
|
|
clear && cowsay -W 76 -f ovpn 'Primero se inicializa la infraestructura de Clave Pública en el SubCA, y como anteriormente, se informa que el fichero var ha sido movido a la PKI, por lo que se elimina. Se genera una solicitud de nuestra SubCA y se envía a la CA para que sea validada'
|
|
```
|
|
|
|
```bash
|
|
./easyrsa init-pki
|
|
|
|
mv vars pki/vars
|
|
|
|
./easyrsa build-ca subca
|
|
|
|
scp ~/EasyRSA/pki/reqs/ca.req ca@ca.bastionado.es:/tmp
|
|
```
|
|
|
|
# Panel CA (⌘ 2)
|
|
|
|
```bash
|
|
clear && cowsay -W 76 -f ovpn 'Nos situamos sobre la CA e importamos y firmamos la solicitud, después devolvemos el certificado encadenado de la CA con la SubCA válido a nuestra SubCA, y se regresa a la SubCA y se mueve el certificado a la ruta del puesto PKI'
|
|
```
|
|
|
|
```bash
|
|
./easyrsa import-req /tmp/ca.req signer
|
|
|
|
./easyrsa sign-req ca signer
|
|
|
|
cat pki/issued/signer.crt \
|
|
pki/ca.crt \
|
|
> /tmp/signer.crt
|
|
|
|
scp /tmp/signer.crt signer@signer.bastionado.es:/tmp
|
|
|
|
rm -rf /tmp/signer.crt
|
|
```
|
|
|
|
# Panel Signer (⌘ 3)
|
|
|
|
```bash
|
|
mv /tmp/signer.crt ~/EasyRSA/pki/ca.crt
|
|
```
|
|
|
|
# Panel Títulos (⌘ 1)
|
|
|
|
```bash
|
|
clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 170 -f ansi-shadow 'Creacion de Certificado ' -c | lolcat && echo "" && echo "" && echo "" && figlet -w 220 -f ansi-shadow 'en oPVN' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
|
|
```
|
|
|
|
# Panel oVPN (⌘ 4)
|
|
|
|
```bash
|
|
|
|
clear && cowsay -W 76 -f ovpn 'Primero inicializamos nuestra infraestructura de Clave Pública en oVPN, como se informa que el fichero vars se ha movido a la PKI, se procede a mover el fichero personalizado, luego generamos la solicitud de nuesta VPN, y enviamos la solicitud de nuestra VPN a la SubCA para validarla'
|
|
```
|
|
|
|
```bash
|
|
./easyrsa init-pki
|
|
|
|
mv vars pki/vars
|
|
|
|
./easyrsa gen-req ovpn nopass # Aquí no establecemos Passphrase
|
|
|
|
scp ~/EasyRSA/pki/reqs/ovpn.req signer@signer.bastionado.es:/tmp
|
|
```
|
|
|
|
# Panel Signer (⌘ 3)
|
|
|
|
```bash
|
|
clear && cowsay -W 76 -f ovpn 'Nos situamos sobre la SubCA e importamos y firmamos la solicitud, y devolvemos el certificado válido a nuestro oVPN junto con el certificado de la SubCA'
|
|
```
|
|
|
|
```bash
|
|
./easyrsa import-req /tmp/ovpn.req ovpn
|
|
|
|
./easyrsa sign-req server ovpn
|
|
|
|
scp pki/ca.crt ovpn@ovpn.bastionado.es:/tmp
|
|
scp pki/issued/ovpn.crt ovpn@ovpn.bastionado.es:/tmp
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"OPENVPN"
|
|
|
|
-'Instalación de dependencias OpenVPN'
|
|
clear && cowsay -W 76 -f ovpn 'Comenzamos actualizando nuestro repositorio apt, después se realiza la instalación de unas dependencias previas, se añaden las claves PGP del respositorio de OpenVPN y añadimos el repositorio de OpenVPN a nuestros listado de repositorios'
|
|
|
|
sudo apt update
|
|
|
|
sudo apt -y install ca-certificates wget net-tools gnupg
|
|
|
|
wget -qO- https://swupdate.openvpn.net/repos/repo-public.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/openvpn-archive-keyring.gpg > /dev/null
|
|
|
|
echo "deb [signed-by=/usr/share/keyrings/openvpn-archive-keyring.gpg] http://build.openvpn.net/debian/openvpn/stable bullseye main" | sudo tee /etc/apt/sources.list.d/openvpn-repo.list > /dev/null
|
|
|
|
clear && cowsay -W 76 -f ovpn 'Turno de volver a actualizar el lista de repositorios y ya se puede proceder a la instalación de OpenVPN'
|
|
|
|
sudo apt update
|
|
|
|
sudo apt -y install openvpn
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-'Configuración de certificados y seguridad TLS'
|
|
clear && cowsay -W 76 -f ovpn 'Copiamos los certificados que dejamos en /tmp y la clave privada, volvemos a la ruta de EasyRSA para generar la clave Diffie-Hellman, generamos la firma HMAC para reforzar las capacidades de verificación de integridad TLS y se mueven los ficheros generados a nuestro directorio de OpenVPN'
|
|
|
|
sudo cp ~/EasyRSA/pki/private/ovpn.key /etc/openvpn/
|
|
sudo cp /tmp/ovpn.crt ~/EasyRSA/pki/ovpn.crt
|
|
sudo mv /tmp/{ovpn.crt,ca.crt} /etc/openvpn/
|
|
|
|
cd ~/EasyRSA/
|
|
|
|
./easyrsa --keysize=4096 gen-dh
|
|
|
|
sudo openvpn --genkey secret ta.key
|
|
|
|
sudo mv ~/EasyRSA/ta.key /etc/openvpn/
|
|
sudo mv ~/EasyRSA/pki/dh.pem /etc/openvpn/
|
|
|
|
|
|
|
|
|
|
-'Certificados cliente'
|
|
clear && cowsay -W 76 -f ovpn 'Cona la estructura propuesta las solicitudes de certificados cliente serán generadas desde el servidor de OpenVPN oVPN y firmadas desde la SubCA Signer, de tal modo que, posteriormente, el cliente simplemente recibirá un fichero de configuración para conectar a la VPN junto con sus certificados sin tener que estar intercambiando certificados inicialmente si fuera el propio cliente el que realizara la solicitud de creación de certificado.'
|
|
|
|
clear && cowsay -W 76 -f ovpn 'Crearemos un directorio en nuestra VPN para almacenar las configuraciones de cliente y restringiremos los permisos, después, volvemos a la ruta EasyRSA para generar la solicitud de certificado cliente, copiamos la clave privada generada a nuestro directorio de configuraciones Cliente'
|
|
|
|
mkdir -p ~/client-configs/keys
|
|
|
|
chmod -R 700 ~/client-configs
|
|
|
|
cd ~/EasyRSA/
|
|
|
|
./easyrsa gen-req client1 nopass
|
|
./easyrsa gen-req client2 nopass
|
|
./easyrsa gen-req client3 nopass
|
|
./easyrsa gen-req client4 nopass
|
|
|
|
cp pki/private/{client1.key,client2.key,client3.key,client4.key} ~/client-configs/keys/
|
|
|
|
clear && cowsay -W 76 -f ovpn 'Enviamos las solicitudes de nuestra VPN a la SubCA para validarlas y nos situamos sobre la SubCA e importamos y firmamos las solicitudes, se devuelven los certificacdos válidos a nuestra oVPN, luego regresamos a la VPN y copiamos el certificado a nuestro directorio de configuraciones Cliente, luego copiamos el certificado de la SubCA y la firma HMAC a nuestro directorio de configuraciones Cliente'
|
|
|
|
scp ~/EasyRSA/pki/reqs/{client1.req,client2.req,client3.req,client4.req} signer@signer.bastionado.es:/tmp
|
|
|
|
./easyrsa import-req /tmp/client1.req client1
|
|
./easyrsa import-req /tmp/client2.req client2
|
|
./easyrsa import-req /tmp/client3.req client3
|
|
./easyrsa import-req /tmp/client4.req client4
|
|
|
|
./easyrsa sign-req client client1
|
|
./easyrsa sign-req client client2
|
|
./easyrsa sign-req client client3
|
|
./easyrsa sign-req client client4
|
|
|
|
scp pki/issued/{client1.crt,client2.crt,client3.crt,client4.crt} ovpn@ovpn.bastionado.es:/tmp
|
|
|
|
cp /tmp/{client1.crt,client2.crt,client3.crt,client4.crt} ~/client-configs/keys/
|
|
|
|
exit
|
|
|
|
sudo cp /etc/openvpn/{ca.crt,ta.key} ~/client-configs/keys/
|
|
|
|
|
|
|
|
|
|
|
|
-'Configuración de OpenVPN'
|
|
clear && cowsay -W 76 -f ovpn 'Una vez ya se tiene la terminada completamente la infraestructura de Clave Pública es el momento de configurar el servicio OpenVPN'
|
|
|
|
clear && cowsay -W 76 -f ovpn 'Comenzamos copiando la configuración de ejemplo y lo editamos, se modifica el puerto por defecto y mantenemos el uso del protocolo UDP, más rápido y resistente frente a ataques de denegación de servicio, especificamos la interfaz de red que se creará de forma explícita como tun0'
|
|
|
|
sudo nano /etc/openvpn/server.conf # sudo vim /etc/openvpn/server.conf
|
|
|
|
port 6174
|
|
proto udp
|
|
|
|
dev tun0
|
|
|
|
clear && cowsay -W 76 -f ovpn 'Ahora apuntaremos a nuestros certificados que se han generado anteriormente, se establece la directiva dh con nuestra clave generada anteriormente'
|
|
|
|
ca ca.crt
|
|
cert ovpn.crt
|
|
key ovpn.key
|
|
|
|
dh dh.pem
|
|
|
|
clear && cowsay -W 76 -f ovpn 'Establecemos la subred que se establecerá en las conexiones. Teniendo en cuenta que el servidor tendrá automáticamente la IP 10.10.10.1 y establecemos un fichero de persistencia para que los clientes vuelvan a tener la misma asignación de IP en caso de una caída del servicio'
|
|
|
|
server 10.10.10.0 255.255.255.0
|
|
|
|
ifconfig-pool-persist /var/log/openvpn/ipp.txt
|
|
|
|
clear && cowsay -W 76 -f ovpn 'Forzaremos que todo el tráfico de los clientes sea redirigido por la VPN, establecemos los servidores DNS, y establecemos una directiva para consultar que los clientes seguen conectados cada 10 segundos y se consideran desconectados si no responden en 2 min'
|
|
|
|
push "redirect-gateway def1 bypass-dhcp"
|
|
|
|
push "dhcp-option DNS 1.1.1.1"
|
|
push "dhcp-option DNS 1.0.0.1"
|
|
|
|
keepalive 10 120
|
|
|
|
clear && cowsay -W 76 -f ovpn 'Nos aseguramos de que tls-auth esta habilitado (se debe de eliminar el ; en caso de que exista), escogemos el cifrado AES-256-CBC que ofrece un buen nivel de seguridad y justo debajo se añade la directiva auth'
|
|
|
|
tls-auth ta.key 0 # This file is secret
|
|
|
|
cipher AES-256-CBC
|
|
|
|
auth SHA512
|
|
|
|
clear && cowsay -W 76 -f ovpn 'Haremos que el servicio OpenVPN se ejecute con el usuario nobody y gruop nogroup descomentando estos valores, y las opciones de persistencia tratarán de evitar el acceso a ciertos recursos en el reinicio que puedan dejar de ser accesibles debido a una reducción de privilegios'
|
|
|
|
user nobody
|
|
group nogroup
|
|
|
|
persist-key
|
|
persist-tun
|
|
|
|
clear && cowsay -W 76 -f ovpn 'Escribimos el estado (un resumen de las conexiones) cada minuto en un fichero, también escribimos un fichero de registro que se mantendrá entre sesiones, se establecera el nivel de detalle que va desde 0 (nada) a 9 (ultra detallado) e informamos a los clientes ante un reinicio del servidor para que puedan reconectar posteriormente'
|
|
|
|
status /var/log/openvpn/openvpn-status.log
|
|
|
|
log-append /var/log/openvpn/openvpn.log
|
|
|
|
verb 3
|
|
|
|
explicit-exit-notify 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-'Directivas adicionales'
|
|
clear && cowsay -W 76 -f ovpn 'Se habilita la redirección de tráfico'
|
|
|
|
sudo nano /etc/sysctl.conf # sudo vim /etc/sysctl.conf
|
|
|
|
net.ipv4.ip_forward=1 # Descomentar esta línea
|
|
|
|
sudo sysctl -w net.ipv4.ip_forward=1
|
|
|
|
|
|
|
|
|
|
|
|
-'Puesta en funcionamiento del servicio'
|
|
clear && cowsay -W 76 -f ovpn 'Arrancar y comprobar el estado del servicio OpenVPN, comprobar la existencia de la interfaz virtual de OpenVPN y habilitar el arranque automático de OpenVPN'
|
|
|
|
sudo systemctl restart openvpn@server && sudo systemctl status openvpn@server
|
|
|
|
ip addr show tun0
|
|
|
|
sudo systemctl enable openvpn@server
|
|
|
|
|
|
|
|
|
|
|
|
"Configuración para el cliente"
|
|
-'Plantilla de cliente'
|
|
clear && cowsay -W 76 -f ovpn 'Ahora que ya tenemos nuestra VPN funcionando es el momento de generar la configuración que los clientes importarán para poder conectar a nuestra VPN.'
|
|
clear && cowsay -W 76 -f ovpn 'Se comienza creando en nuestro directorio de configuración de clientes un directorio donde almacenar la configuración individual, se copian las plantillas de configuración de cliente por defecto y se procede a editar'
|
|
|
|
mkdir -p ~/client-configs/files
|
|
|
|
nano ~/client-configs/base.conf # vim ~/client-configs/base.conf
|
|
|
|
clear && cowsay -W 76 -f ovpn 'Especificamos que estamos ante un fichero cliente, se configura el modo de interfaz igual que en el servidor, se hace lo mismo con el protocolo, y establecemos la IP y el puerto de nuestro servidor VPN'
|
|
|
|
client
|
|
|
|
dev tun
|
|
|
|
proto udp
|
|
|
|
remote ovpn.bastionado.es 6174
|
|
|
|
clear && cowsay -W 76 -f ovpn 'Intentamos que el intento de resolución de nombre del servidor VPN sea infinita, útil para equipos que están permanentemente conectados a internet, y con la siguiente regla se hará que el puerto local de salida sea dinámico'
|
|
|
|
resolv-retry infinite
|
|
|
|
nobind
|
|
|
|
user nobody
|
|
group nogroup
|
|
|
|
clear && cowsay -W 76 -f ovpn 'Se realiza un descenso de privilegios después de inicializar en sistemas que no son de Windows, se intenta persisistir los siguientes valores entre reinicios, realizamos la verificación del servidor y sus usos extendidos, en los que establecemos las mismas directivas cipher y auth que establecimos en el servidor, y establecemos el nivel de detalle que va desde 0 (nada) a 9 (ultra detallado) y se establece la directiva key-direction'
|
|
|
|
user nobody
|
|
group nogroup
|
|
|
|
persist-key
|
|
persist-tun
|
|
|
|
remote-cert-tls server
|
|
|
|
cipher AES-256-CBC
|
|
auth SHA512
|
|
|
|
verb 3
|
|
|
|
key-direction 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-'Script de configuración de clientes'
|
|
|
|
+'Generaremos un script que se encargará de crear un fichero incrustado con la configuración de conexión plantilla y los certificados apropiados para cada cliente'
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|