docs: update vpn/openvpn/guide

This commit is contained in:
José Antonio Yáñez Jiménez 2022-06-01 00:07:16 +00:00 committed by José Antonio Yáñez Jiménez
parent 1eca69a155
commit 483d12b06b

View File

@ -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 '<ca>') \
${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') \
${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') \
${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-auth>') \
${KEY_DIR}/ta.key \
<(echo -e '</tls-auth>') \
> ${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
```