From 483d12b06b286f189ee957f5d29a95c4de99b417 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Antonio=20Y=C3=A1=C3=B1ez=20Jim=C3=A9nez?= Date: Wed, 1 Jun 2022 00:07:16 +0000 Subject: [PATCH] docs: update vpn/openvpn/guide --- vpn/openvpn/guide.md | 235 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 220 insertions(+), 15 deletions(-) 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 +```