diff --git a/vpn/openvpn/guide.md b/vpn/openvpn/guide.md
index e70597b..cae0794 100644
--- a/vpn/openvpn/guide.md
+++ b/vpn/openvpn/guide.md
@@ -2,7 +2,7 @@
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-31T23:35:29.354Z
+date: 2022-06-01T00:07:12.718Z
tags: vpn, servidor
editor: markdown
dateCreated: 2022-05-31T21:04:15.280Z
@@ -479,7 +479,7 @@ auth SHA512
```
```bash
-clear && cowsay -W 76 -f ovpn 'Haremos que el servicio OpenVPN realice una desescalada de privilegios ejecutándose con el usuario `nobody` y grupo `nogroup` tras iniciarse.'
+clear && cowsay -W 76 -f ovpn 'Haremos que el servicio OpenVPN realice un descenso de privilegios ejecutándose con el usuario `nobody` y grupo `nogroup` tras iniciarse.'
```
```bash
@@ -560,64 +560,269 @@ clear && cowsay -W 76 -f ovpn 'Si todo esto es correcto podemos habilitar el ser
sudo systemctl enable openvpn@server
```
+# Panel Títulos (⌘1)
+```bash
+clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 170 -f ansi-shadow 'CONFIGURACION' -c | lolcat && echo "" && echo "" && echo "" && figlet -w 220 -f ansi-shadow 'PARA CLIENTES' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
+```
+# Panel oVPN (⌘4)
-"Configuración para el cliente"
--'Plantilla de cliente'
+```bash
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'
+```
+```bash
+clear && cowsay -W 76 -f ovpn 'Comenzaremos creando en nuestro directorio de configuración de clientes un directorio donde almacenar la configuración individual y crearemos un fichero plantilla para la configuración del cliente.'
+```
+
+```bash
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'
+```bash
+clear && cowsay -W 76 -f ovpn 'Especificamos que estamos ante un fichero cliente.'
+```
+```bash
client
+```
+```bash
+clear && cowsay -W 76 -f ovpn 'Configuramos el modo de interfaz y el protocolo igual que en el servidor.'
+```
+
+```bash
dev tun
-
proto udp
+```
+```bash
+clear && cowsay -W 76 -f ovpn 'Establecemos la IP y puerto de nuestro servidor VPN.'
+```
+
+```bash
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'
+```bash
+clear && cowsay -W 76 -f ovpn 'Estableceremos que el intento de resolución de nombres del servidor VPN sea infinita, útil para equipos que no están permanentemente conectados a internet, como por ejemplo portátiles o dispositivos móviles.'
+```
+```bash
resolv-retry infinite
+```
+```bash
+clear && cowsay -W 76 -f ovpn 'Con la siguiente directiva hacemos que el puerto local de salida sea dinámico.'
+```
+
+```bash
nobind
+```
+```bash
+clear && cowsay -W 76 -f ovpn 'Realizamos un descenso de privilegios después de inicializar en sistemas que no son Windows.'
+```
+
+```bash
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
+```bash
+clear && cowsay -W 76 -f ovpn 'Intentamos persistir los siguientes valores entre reinicios, al igual que en el servidor, por el descenso de privilegios.'
+```
+```bash
persist-key
persist-tun
+```
+```bash
+clear && cowsay -W 76 -f ovpn 'Realizamos verificación del certificado del servidor y sus usos extendidos.'
+```
+
+```bash
remote-cert-tls server
+```
+```bash
+clear && cowsay -W 76 -f ovpn 'Establecemos las mismas directivas `cipher` y `auth` que establecimos en el servidor.'
+```
+
+```bash
cipher AES-256-CBC
auth SHA512
+```
+```bash
+clear && cowsay -W 76 -f ovpn 'Establecemos el nivel de detalle que va desde 0 (nada) a 9 (ultra detallado).'
+```
+
+```bash
verb 3
+```
+```bash
+clear && cowsay -W 76 -f ovpn 'La directiva `key-direction` establece una forma alternativa de especificar el parámetro opcional de dirección para las opciones `tls-auth` y `secret`, Es útil cuando toda la configuración de cliente de OpenVPN, incluídos certificados y claves van empaquetados en un fichero incrustado, como vamos a realizar.'
+```
+
+```bash
key-direction 1
+```
+# Panel Títulos (⌘1)
+
+```bash
+clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 220 -f ansi-shadow 'SCRIPT PARA GENERAR' -c | lolcat && echo "" && echo "" && echo "" && figlet -w 230 -f ansi-shadow 'CONFIGURACIONES CLIENTE' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
+```
+
+# Panel oVPN (⌘4)
+
+```bash
+clear && cowsay -W 76 -f ovpn '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.'
+```
+
+```bash
+nano ~/client-configs/make_config.sh # vim ~/client-configs/make_config.sh
+```
+
+```bash
+clear && cowsay -W 76 -f ovpn 'Como podemos observar, nuestro `script` concatenará la configuración de cliente base, la cadena de claves públicas de nuestra entidad certificadora, la clave pública y privada del cliente y la firma HMAC.'
+```
+
+```bash
+#!/bin/bash
+
+# First argument: Client identifier
+
+KEY_DIR=/home/ovpn/client-configs/keys
+OUTPUT_DIR=/home/ovpn/client-configs/files
+BASE_CONFIG=/home/ovpn/client-configs/base.conf
+
+cat ${BASE_CONFIG} \
+ <(echo -e '') \
+ ${KEY_DIR}/ca.crt \
+ <(echo -e '\n') \
+ ${KEY_DIR}/${1}.crt \
+ <(echo -e '\n') \
+ ${KEY_DIR}/${1}.key \
+ <(echo -e '\n') \
+ ${KEY_DIR}/ta.key \
+ <(echo -e '') \
+ > ${OUTPUT_DIR}/bastionado-${1}.ovpn
+```
+
+```bash
+clear && cowsay -W 76 -f ovpn 'Establecemos permisos de ejecución sobre nuestro script.'
+```
+
+```bash
+chmod 700 ~/client-configs/make_config.sh
+```
+
+```bash
+clear && cowsay -W 76 -f ovpn 'Y ahora ya podemos generar nuestros ficheros `ovpn` para nuestros clientes.'
+```
+
+```bash
+cd ~/client-configs
+
+sudo ./make_config.sh client1
+sudo ./make_config.sh client2
+sudo ./make_config.sh client3
+sudo ./make_config.sh client4
+```
+
+# Panel Títulos (⌘1)
+
+```bash
+clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 190 -f ansi-shadow 'REDIRECCION DE' -c | lolcat && echo "" && echo "" && echo "" && figlet -w 230 -f ansi-shadow 'TRAFICO' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
+```
+
+# Panel oVPN (⌘4)
+
+```bash
+clear && cowsay -W 76 -f ovpn 'Como hemos visto, nuestra VPN recibirá todo el tráfico de los clientes, por lo que si queremos que éstos puedan tener salida a internet debemos redirigir su tráfico desde la interfaz `tun` hacia la interfaz de salida de nuestro servidor. Para ello, haremos uso de `NetFilter Tables`.'
+```
+
+```bash
+sudo nano /etc/nftables.conf # sudo vim /etc/nftables.conf
+```
+
+```bash
+#!/usr/sbin/nft -f
+
+flush ruleset
+define vpn_port=6174
+define vpn_if=tun0
+define outside_if=enp0s17
+define vpn_subnet=10.10.10.0/24
+
+table inet filter {
+ chain input {
+ # allow OpenVPN VPN connections to the Server
+ udp dport $vpn_port accept
+ }
+ chain forward {
+ #Drop forwarded packets if they are not matched
+ type filter hook forward priority 0; policy drop;
+ # allow existing connections
+ ct state related,established accept
--'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'
+ # allow packets from vpn interface
+ iifname $vpn_if oifname $outside_if accept
+ }
+
+ chain output {
+ # Security drops
+ ct state invalid counter drop
+ oifname != "lo" ip saddr != 127.0.0.1 ip daddr != 127.0.0.1 tcp flags & (fin|ack) == fin|ack counter drop
+ oifname != "lo" ip saddr != 127.0.0.1 ip daddr != 127.0.0.1 tcp flags & (rst|ack) == rst|ack counter drop
+ }
+
+}
+
+# create a ipv4 table only for NAT entries (you need both chains even if they're empty)
+table ip nat {
+ chain postrouting {
+ type nat hook postrouting priority 100;
+
+ # enable NAT for VPN
+ iifname $vpn_if oifname $outside_if ip saddr $vpn_subnet masquerade
+
+ }
+
+ chain prerouting {
+ type nat hook prerouting priority 0;
+
+ }
+
+}
+```
+
+```bash
+clear && cowsay -W 76 -f ovpn 'Aparte de unas reglas básicas de seguridad, en esta configuración encontramos la aceptación del tráfico encontrante por el puerto que hemos configurado para el servidor de OpenVPN y el enrutamiento del tráfico de OpenVPN hacia la interfaz de salida en la cadena de post enrutamiento.'
+```
+
+```bash
+clear && cowsay -W 76 -f ovpn 'Ahora solo nos queda reiniciar el servicio, comprobar que ha levantado correctamente y habilitar su inicio automático.'
+```
+
+```bash
+sudo systemctl restart nftables.service && sudo systemctl status nftables.service
+
+sudo systemctl enable nftables.service
+```