docs: update vpn/openvpn/guide
This commit is contained in:
parent
1eca69a155
commit
483d12b06b
@ -2,7 +2,7 @@
|
|||||||
title: OpenVPN - Guía de instalación
|
title: OpenVPN - Guía de instalación
|
||||||
description: Guía de instalación utilizada durante la realización de la práctica
|
description: Guía de instalación utilizada durante la realización de la práctica
|
||||||
published: true
|
published: true
|
||||||
date: 2022-05-31T23:35:29.354Z
|
date: 2022-06-01T00:07:12.718Z
|
||||||
tags: vpn, servidor
|
tags: vpn, servidor
|
||||||
editor: markdown
|
editor: markdown
|
||||||
dateCreated: 2022-05-31T21:04:15.280Z
|
dateCreated: 2022-05-31T21:04:15.280Z
|
||||||
@ -479,7 +479,7 @@ auth SHA512
|
|||||||
```
|
```
|
||||||
|
|
||||||
```bash
|
```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
|
```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
|
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"
|
```bash
|
||||||
-'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 '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
|
mkdir -p ~/client-configs/files
|
||||||
|
|
||||||
nano ~/client-configs/base.conf # vim ~/client-configs/base.conf
|
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
|
client
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
clear && cowsay -W 76 -f ovpn 'Configuramos el modo de interfaz y el protocolo igual que en el servidor.'
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
dev tun
|
dev tun
|
||||||
|
|
||||||
proto udp
|
proto udp
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
clear && cowsay -W 76 -f ovpn 'Establecemos la IP y puerto de nuestro servidor VPN.'
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
remote ovpn.bastionado.es 6174
|
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
|
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
|
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
|
user nobody
|
||||||
group nogroup
|
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'
|
```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.'
|
||||||
user nobody
|
```
|
||||||
group nogroup
|
|
||||||
|
|
||||||
|
```bash
|
||||||
persist-key
|
persist-key
|
||||||
persist-tun
|
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
|
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
|
cipher AES-256-CBC
|
||||||
auth SHA512
|
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
|
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
|
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'
|
# allow packets from vpn interface
|
||||||
|
iifname $vpn_if oifname $outside_if accept
|
||||||
+'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'
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user