46 KiB
46 KiB
title | description | published | date | tags | editor | dateCreated |
---|---|---|---|---|---|---|
OpenVPN - Guía de instalación | Guía de instalación utilizada durante la realización de la práctica | true | 2022-06-02T09:08:06.065Z | vpn, servidor | markdown | 2022-05-31T21:04:15.280Z |
Panel Títulos (⌘1)
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
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:'
unimatrix -f -n -s 96 -w && clear && perl -pe "system 'sleep .06'" ovpn-scheme.txt && echo "" && echo "" && echo "" && sleep 10 && clear
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)
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'
wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.1.0/EasyRSA-3.1.0.tgz
cd ~
tar xvf EasyRSA-3.1.0.tgz
mv EasyRSA-3.1.0 EasyRSA
cd EasyRSA
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
clear && cowsay -W 76 -f ovpn 'Creamos nuestro fichero de propiedades `vars`'
nano vars # o vim vars
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
clear && cowsay -W 76 -f ovpn 'Se hará uso de criptografía de curva elíptica para el cifrado, concretamente una Curva Edwards'
set_var EASYRSA_ALGO ed
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'
set_var EASYRSA_CURVE ed25519
clear && cowsay -W 220 -f ovpn 'Repetiremos este proceso en Signer y Ovpn'
Panel Títulos (⌘1)
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)
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'
./easyrsa init-pki
mv vars pki/vars
./easyrsa build-ca # Podríamos añadir 'nopass' para no establecer una Passphrase
Panel Títulos (⌘1)
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)
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'
./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)
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'
./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)
mv /tmp/signer.crt ~/EasyRSA/pki/ca.crt
Panel Títulos (⌘1)
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)
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'
./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)
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'
./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
Fin día 1
Panel Títulos (⌘1)
clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 170 -f ansi-shadow 'INSTALACION DE' -c | lolcat && echo "" && echo "" && echo "" && figlet -w 220 -f ansi-shadow 'OPEN VPN' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
Panel oVPN (⌘4)
clear && cowsay -W 76 -f ovpn 'Comenzamos actualizando nuestro repositorio apt para después realizar la instalación de unas dependencias previas'
sudo apt update
sudo apt -y install ca-certificates wget net-tools gnupg
clear && cowsay -W 76 -f ovpn 'Vamos a utilizar el repositorio mantenido por OpenVPN para instalar una versión más actualizada del mismo, por lo que, en primer lugar, debemos añadir las claves GPG creando un Keyring ya que `APT Key` está obsoleto.'
wget -qO- https://swupdate.openvpn.net/repos/repo-public.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/openvpn-archive-keyring.gpg > /dev/null
clear && cowsay -W 76 -f ovpn 'Añadimos el repositorio de OpenVPN apuntando el firmado al Keyring que acabos de crear.'
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
clear && cowsay -W 76 -f ovpn 'Es el momento de recuperar los certificados que dejamos en /tmp y la clave privada.'
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/
clear && cowsay -W 76 -f ovpn 'Ahora volvemos a la ruta de EasyRSA para generar la clave Diffie-Hellman. Se trata de un algoritmo que permite crear una clave secreta entre dos equipos que nunca han tenido contacto previo, a través de un canal inseguro, y mediante el envío de solo dos mensajes. Aunque es algo lento, generaremos una clave de 4096 bits.'
cd ~/EasyRSA/
./easyrsa --keysize=4096 gen-dh
clear && cowsay -W 76 -f ovpn 'En el modo de clave estática, se genera una clave precompartida que se comparte entre ambos pares de OpenVPN antes de iniciar el túnel. Esta clave estática contiene 4 claves independientes: HMAC de envío, HMAC de recepción, cifrado y descifrado. Por defecto, en el modo de clave estática, ambos hosts utilizarán la misma clave HMAC y la misma clave de cifrado/descifrado. Sin embargo, utilizando el parámetro `--secret`, es posible utilizar las 4 claves de forma independiente.'
sudo openvpn --genkey secret ta.key
clear && cowsay -W 76 -f ovpn 'Ya podemos mover las claves generadas a la instalación de OpenVPN.'
sudo mv ~/EasyRSA/ta.key /etc/openvpn/
sudo mv ~/EasyRSA/pki/dh.pem /etc/openvpn/
Panel Títulos (⌘1)
clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 170 -f ansi-shadow 'CERTIFICADOS DE' -c | lolcat && echo "" && echo "" && echo "" && figlet -w 220 -f ansi-shadow 'CLIENTE' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
Panel oVPN (⌘4)
clear && cowsay -W 76 -f ovpn 'Con 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 `oVPN` para almacenar las configuraciones de cliente y restringiremos los permisos'
mkdir -p ~/client-configs/keys
chmod -R 700 ~/client-configs
clear && cowsay -W 76 -f ovpn 'Volvemos a la ruta EasyRSA para generar las solicitudes de certificado cliente. Crearemos múltiples solicitudes para distintos clientes. Después copiaremos las claves privadas a nuestra ruta de configuración de clientes.'
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.'
scp ~/EasyRSA/pki/reqs/{client1.req,client2.req,client3.req,client4.req} signer@signer.bastionado.es:/tmp
Panel Signer (⌘3)
clear && cowsay -W 76 -f ovpn 'Nos situamos sobre `Signer` e importamos y firmamos las solicitudes, después devolveremos los certificacdos válidos a nuestra oVPN.'
./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
Panel oVPN (⌘4)
clear && cowsay -W 76 -f ovpn 'Copiamos los certificados firmados a nuestra ruta de configuración de clientes. También copiaremos dos ficheros clave: `ca.crt` y ta.key`. En el fichero que tendrá el cliente para conectar a nuestra VPN estará la cadena de certificados (es decir, de claves públicas) de la autoridad de certificación ya que el proceso de autenticación es recíproco, los clientes también validan la identidad del servidor. Por otra parte, también incluimos la clave precompartida que se utilizará para la derivación de las claves simétricas y de autenticación.'
cp /tmp/{client1.crt,client2.crt,client3.crt,client4.crt} ~/client-configs/keys/
sudo cp /etc/openvpn/{ca.crt,ta.key} ~/client-configs/keys/
Panel Títulos (⌘1)
clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 170 -f ansi-shadow 'CONFIGURACION DE' -c | lolcat && echo "" && echo "" && echo "" && figlet -w 220 -f ansi-shadow 'OPEN VPN' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
Panel oVPN (⌘4)
clear && cowsay -W 76 -f ovpn 'Una vez hemos finalizado completamente la infraestructura de Clave Pública es el momento de configurar el servicio OpenVPN.'
clear && cowsay -W 76 -f ovpn 'Crearemos un fichero de configuración desde cero para conocer detalladamente todas las características que utilizaremos.'
sudo nano /etc/openvpn/server.conf # sudo vim /etc/openvpn/server.conf
clear && cowsay -W 76 -f ovpn 'No utilizaremos el puerto estándar, 1194, para reducir la superficie de exposición. Por otra parte, utilizaremos el protocolo UDP para reducir los tiempos de latencia.'
port 6174
proto udp
clear && cowsay -W 76 -f ovpn 'Trabajaremos con una interfaz tipo `tun`. OpenVPN puede trabajar con interfaces tipo `tun` a nivel de red (Capa 3 OSI) y tipo `tap`, a nivel de enlace (Capa 2 OSI). Si utilizarámos una interfaz de tipo `tap` tendríamos acceso automáticamente a la subred completa del servidor, ya que la interfaz estaría actuando como un `switch`, pero también generaríamos grandes problemas de enrutamiento. Utilizando `tun` estaremos realizando un enlace punto a punto, por lo que, si queremos tener visibilidad de otras redes deberemos añadir otras opciones. Hablaremos más adelante de ellas.'
dev tun0
clear && cowsay -W 76 -f ovpn 'Ahora apuntaremos a nuestros certificados que hemos generado anteriormente y establecemos la directiva Diffie-Hellman 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 primera IP de está subred, es decir, 10.10.10.1.'
server 10.10.10.0 255.255.255.0
clear && cowsay -W 76 -f ovpn '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'
ifconfig-pool-persist /var/log/openvpn/ipp.txt
clear && cowsay -W 76 -f ovpn 'Como comentamos anteriormente, al utilizar `tun`, si queremos que los clientes puedan ver algo más que al servidor deberemos habilitar enrutamientos. Supongamos que oVPN se encuentra conectado a una sub red tipo `192.168.128.0/24` y queremos que los clientes tengan conectvidad. En este caso deberíamos añadir la siguiente directiva: `push "route 192.168.128.0 255.255.255.0"`. Además, si nuestro servidor VPN no es la puerta de enlace de esta subred deberemos añadir un enrutamiento en ésta para que redirija el tráfico de `10.10.10.0/24` hacia la IP de oVPN.'
clear && cowsay -W 76 -f ovpn 'En nuestro escenario no vamos a habilitar el enrutamiento de subredes, sin embargo forzaremos que todo el tráfico de los clientes sea redirigido por la VPN. `push` hace referencia a que la directiva se volcará sobre los clientes, `def1` Modifica la tabla de enrutamiento de los clientes para redirigir todo el tráfico hacia la intrerfaz VPN y `bypass-dhcp` Añade una ruta directa al servidor DHCP de OpenVPN.'
push "redirect-gateway def1 bypass-dhcp"
clear && cowsay -W 76 -f ovpn 'También podemos sobrescribir los servidores DNS de los clientes, estableciendo los que queramos.'
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 1.0.0.1"
Establecemos una directiva para consultar que los clientes siguen conectados cada 10 segundos y se consideran desconectados si no responden en 2 minutros.
keepalive 10 120
clear && cowsay -W 76 -f ovpn 'Ahora habilitaremos la directiva `tls-auth`. Como comentamos anteriormente, esta directiva añade una capa adicional de autenticación HMAC sobre el canal de control TLS para mitigar los ataques DoS y los ataques a la pila TLS. En pocas palabras, --tls-auth habilita una especie de "cortafuegos HMAC" en el puerto TCP/UDP de OpenVPN, donde los paquetes del canal de control TLS que lleven una firma HMAC incorrecta pueden ser descartados inmediatamente sin respuesta.'
tls-auth ta.key 0
clear && cowsay -W 76 -f ovpn 'La directiva `cipher` cifra los paquetes del canal de datos con el algoritmo de cifrado escogido, en este caso `AES-256-CBC`, un modelo de cifrado por bloques de bloques de 256 bits. En todo caso, éste es el nivel de cifrado mínimo exigido por el servidor, si el cliente puede utilizar un esquema de cifrado más potente y moderno (por ejemplo AES-256-GCM, más rápido) éste cambiará de forma dinámica.'
cipher AES-256-CBC
clear && cowsay -W 76 -f ovpn 'La directiva `auth` nos permitirá autenticar los datos encriptados enviados y recibidos respectivamente. Utilizaremos un `Hash` seguro para este menester como `SHA512`.'
auth SHA512
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.'
user nobody
group nogroup
clear && cowsay -W 76 -f ovpn 'Estas 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'
persist-key
persist-tun
clear && cowsay -W 76 -f ovpn 'Escribimos el estado (un resumen de las conexiones) cada minuto en un fichero y también escribimos un fichero de registro que se mantendrá entre sesiones.'
status /var/log/openvpn/openvpn-status.log
log-append /var/log/openvpn/openvpn.log
clear && cowsay -W 76 -f ovpn 'También establecemos el nivel de detalle que va desde 0 (nada) a 9 (ultra detallado), utilizando un valor propicio para producción.'
verb 3
clear && cowsay -W 76 -f ovpn 'Para finalizar nuestro fichero de configuraciób informamos a los clientes ante un reinicio del servidor para que puedan reconectar posteriormente.'
explicit-exit-notify 1
Panel Títulos (⌘1)
clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 170 -f ansi-shadow 'DIRECTIVAS' -c | lolcat && echo "" && echo "" && echo "" && figlet -w 220 -f ansi-shadow 'ADICIONALES' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
Panel oVPN (⌘4)
clear && cowsay -W 76 -f ovpn 'Tanto si habilitamos el enrutamiento de subredes como si hacemos que todo el tráfico de los clientes pase a través de la VPN deberemos permitir que nuestro servidor VPN realice 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
clear && cowsay -W 76 -f ovpn 'Con todo configurado, es el momento de levantar nuestro servicio, comprobando también que se ha creado la interfaz virtual `tun0`.'
sudo systemctl restart openvpn@server && sudo systemctl status openvpn@server
ip addr show tun0
clear && cowsay -W 76 -f ovpn 'Si todo esto es correcto podemos habilitar el servicio en inicio automático.'
sudo systemctl enable openvpn@server
Panel Títulos (⌘1)
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)
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 '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.'
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.'
client
clear && cowsay -W 76 -f ovpn 'Configuramos el modo de interfaz y el protocolo igual que en el servidor.'
dev tun
proto udp
clear && cowsay -W 76 -f ovpn 'Establecemos la IP y puerto de nuestro servidor VPN.'
remote ovpn.bastionado.es 6174
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.'
resolv-retry infinite
clear && cowsay -W 76 -f ovpn 'Con la siguiente directiva hacemos que el puerto local de salida sea dinámico.'
nobind
clear && cowsay -W 76 -f ovpn 'Realizamos un descenso de privilegios después de inicializar en sistemas que no son Windows.'
user nobody
group nogroup
clear && cowsay -W 76 -f ovpn 'Intentamos persistir los siguientes valores entre reinicios, al igual que en el servidor, por el descenso de privilegios.'
persist-key
persist-tun
clear && cowsay -W 76 -f ovpn 'Realizamos verificación del certificado del servidor y sus usos extendidos.'
remote-cert-tls server
clear && cowsay -W 76 -f ovpn 'Establecemos las mismas directivas `cipher` y `auth` que establecimos en el servidor.'
cipher AES-256-CBC
auth SHA512
clear && cowsay -W 76 -f ovpn 'Establecemos el nivel de detalle que va desde 0 (nada) a 9 (ultra detallado).'
verb 3
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.'
key-direction 1
Panel Títulos (⌘1)
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)
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.'
nano ~/client-configs/make_config.sh # vim ~/client-configs/make_config.sh
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.'
#!/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
clear && cowsay -W 76 -f ovpn 'Establecemos permisos de ejecución sobre nuestro script.'
chmod 700 ~/client-configs/make_config.sh
clear && cowsay -W 76 -f ovpn 'Y ahora ya podemos generar nuestros ficheros `ovpn` para nuestros clientes.'
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)
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)
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`.'
sudo nano /etc/nftables.conf # sudo vim /etc/nftables.conf
#!/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
# 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;
}
}
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.'
clear && cowsay -W 76 -f ovpn 'Ahora solo nos queda reiniciar el servicio, comprobar que ha levantado correctamente y habilitar su inicio automático.'
sudo systemctl restart nftables.service && sudo systemctl status nftables.service
sudo systemctl enable nftables.service
Panel Títulos (⌘1)
clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 190 -f ansi-shadow 'RECOVACION DE' -c | lolcat && echo "" && echo "" && echo "" && figlet -w 230 -f ansi-shadow 'CERTIFICADOS' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
Panel Signer (⌘3)
clear && cowsay -W 76 -f ovpn 'El sistema de autenticación que hemos establecido utiliza certificados que deben ser renovados para los clientes cada dos meses, pero, ¿qué ocurre si queremos que un cliente deje de poder conectar a los 15 días de expedir su certificado? Para este escensario deberemos generar una Lista de revocación de certificados. Vayamos, por tanto, a nuestra SubCA y revoquemos uno de los clientes.'
cd ~/EasyRSA
./easyrsa revoke client4
clear && cowsay -W 76 -f ovpn 'Con el certificado ya revocado es el momento de generar nuestra lista de revocación, que posteriormente copiaremos al servidor oVPN.'
./easyrsa gen-crl
scp ~/EasyRSA/pki/crl.pem ovpn@ovpn.bastionado.es:/tmp
Panel oVPN (⌘4)
clear && cowsay -W 76 -f ovpn 'Ahora moveremos la CRL a la instalación de OpenVPN y añadiremos la directiva `crl-verify` apuntando a nuestra lista.'
sudo mv /tmp/crl.pem /etc/openvpn
sudo nano /etc/openvpn/server.conf # sudo vim /etc/openvpn/server.conf
crl-verify crl.pem
clear && cowsay -W 76 -f ovpn 'Solo nos queda reiniciar nuestro servidor y comprobar que funciona correctamente.'
sudo systemctl restart openvpn@server && sudo systemctl status openvpn@server
Fin Día 2
Panel Títulos (⌘1)
clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 130 -f ansi-shadow 'OPENVPN' -c | lolcat && echo "" && echo "" && echo "" && figlet -w 200 -f ansi-shadow 'TOR' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
Panel oVPN (⌘4)
clear && cowsay -W 76 -f ovpn 'Ya que todo el tráfico de los clientes se enruta a través de la VPN, ¿Y si les damos la posibilidad de que puedan conectar a una VPN que además enrute todo su tráfico a través de nodos TOR? Sus comunicaciones quederán ocultas y podremos escoger el nodo de salida, haciendo que tanto la dirección de los clientes como del servidor queden ocultas.'
clear && cowsay -W 76 -f ovpn 'Crearemos copias de nuestra configuración base para clientes, servidor y del script de generación de configuración y alteraremos los valores para nuestra VPN alternativa.'
cp ~/client-configs/base.conf ~/client-configs/base-tor.conf
cp ~/client-configs/make_config.sh ~/client-configs/make_config_tor.sh
sudo cp /etc/openvpn/server.conf /etc/openvpn/tor.conf
clear && cowsay -W 76 -f ovpn 'Editamos el fichero de servidor OpenVPN TOR.'
sudo nano /etc/openvpn/tor.conf # sudo vim /etc/openvpn/tor.conf
clear && cowsay -W 76 -f ovpn 'Tenemos que modificar el puerto, el rango de IPs, los ficheros log y el DNS que utilizará. El resto de opciones las podemos mantener iguales.'
port 6175
dev tun1
server 10.10.20.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp-tor.txt
push "dhcp-option DNS 10.10.20.1"
push "dhcp-option DNS 1.1.1.1"
status /var/log/openvpn/openvpn-status-tor.log
log-append /var/log/openvpn/openvpn-tor.log
clear && cowsay -W 76 -f ovpn 'Con todo configurado, es el momento de levantar nuestro servicio, comprobando también que se ha creado la interfaz virtual `tun1`.'
sudo systemctl restart openvpn@tor && sudo systemctl status openvpn@tor
ip addr show tun1
clear && cowsay -W 76 -f ovpn 'Si todo esto es correcto podemos habilitar el servicio en inicio automático.'
sudo systemctl enable openvpn@tor
clear && cowsay -W 76 -f ovpn 'Es el momento de instalar TOR.'
sudo apt install tor -y
clear && cowsay -W 76 -f ovpn 'Editaremos el fichero de configuración de TOR.'
sudo nano /etc/tor/torrc # sudo vim /etc/tor/torrc
VirtualAddrNetwork 10.192.0.0/10
AutomapHostsOnResolve 1
AutomapHostsSuffixes .onion,.exit
DNSPort 10.10.20.1:53530
TransPort 10.10.20.1:9040
ExitNodes {us} StrictNodes 1
clear && cowsay -W 76 -f ovpn 'Configuraremos la resolución de dominios `onion` y `exit` y la resolución DNS y HTTP a la dirección IP que tiene nuestra interfaz `tun1`. Por otra parte, solicitaremos que el nodo de salida de TOR sea a través de un servidor de los Estados Unidos.'
clear && cowsay -W 76 -f ovpn 'Levantamos nuestro servicio TOR y comprobamos que todo funciona correctamente.'
sudo systemctl restart tor.service && sudo systemctl status tor.service
sudo netstat -tulpen | grep tor
clear && cowsay -W 76 -f ovpn 'Habilitamos el inicio automático del servicio.'
sudo systemctl enable tor.service
clear && cowsay -W 76 -f ovpn 'Modificamos la configuración y script de generación de configuraciones cliente para la variante TOR.'
nano ~/client-configs/base-tor.conf # vim ~/client-configs/base-tor.conf
remote ovpn.bastionado.es 6175
nano ~/client-configs/make_config_tor.sh # vim ~/client-configs/make_config_tor.sh
#!/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-tor.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-tor-${1}.ovpn
clear && cowsay -W 76 -f ovpn 'Y ahora ya podemos generar nuestros ficheros `ovpn` TOR para nuestros clientes.'
cd ~/client-configs
sudo ./make_config_tor.sh client1
sudo ./make_config_tor.sh client2
sudo ./make_config_tor.sh client3
sudo ./make_config_tor.sh client4
clear && cowsay -W 76 -f ovpn 'Ahora deberemos modificar nuestras Net Filter Tables para que en la cadena de pre enrutamiento el tráfico de nuestra segunda VPN se redirija hacia los nodos TOR, estableciendo así un proxy transparente que redirigirá todo el tráfico de los clientes que conecten en esta modalidad.'
sudo dd if=/dev/null of=/etc/nftables.conf && sudo vim /etc/nftables.conf
#!/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
define vpn_port_tor=6175
define vpn_if_tor=tun1
define vpn_subnet_tor=10.10.20.0/24
table inet filter {
chain input {
# allow OpenVPN connections to the Server
udp dport $vpn_port accept
# allow OpenVPN TOR connections to the Server
udp dport $vpn_port_tor 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
# allow packets from vpn interface
iifname $vpn_if oifname $outside_if accept
# allow packets from vpn interface
iifname $vpn_if_tor oifname $outside_if accept
}
chain output {
## Transproxy leak blocked:
# https://trac.torproject.org/projects/tor/wiki/doc/TransparentProxy#WARNING
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
# enable NAT for TOR VPN
iifname $vpn_if_tor oifname $outside_if ip saddr $vpn_subnet_tor masquerade
}
chain prerouting {
# Transparent proxy to TOR
type nat hook prerouting priority 0;
iifname $vpn_if_tor ip saddr $vpn_subnet_tor udp dport 53 counter dnat to 10.10.20.1:53530
iifname $vpn_if_tor ip protocol tcp ip saddr $vpn_subnet_tor counter dnat to 10.10.20.1:9040
iifname $vpn_if_tor ip protocol udp ip saddr $vpn_subnet_tor counter dnat to 10.10.20.1:9040
}
}
clear && cowsay -W 76 -f ovpn 'Reiniciamos nuestro servicio y comprobamos que todo funciona correctamente.'
sudo systemctl restart nftables.service && sudo systemctl status nftables.service
Panel Títulos (⌘1)
clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 130 -f ansi-shadow 'SERVIDOR WEB' -c | lolcat && echo "" && echo "" && echo "" && figlet -w 240 -f ansi-shadow 'PARA ACCESO CLIENTE' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
clear && cowsay -W 240 -f ovpn 'Nuestra PKI y nuestro servidor VPN están listos para recibir a clientes, sin embargo, para que esto ocurra los clientes deberían recibir sus ficheros de configuración.
Para esto, levantaremos un pequeño servidor Web que ponga a disposición de los clientes, mediante una autenticación básica, los ficheros de configuración.'
Panel oVPN (⌘4)
clear && cowsay -W 76 -f ovpn 'Utilizamos el repositorio del desarrollador de Debian Ondřej Surý para tener una versión más actualizada y compatible de NginX que la que incorpora Debian por defecto.'
curl -sSL https://packages.sury.org/nginx/README.txt | sudo bash -x
clear && cowsay -W 76 -f ovpn 'Ahora ya podemos actualizar la información de repositorios.'
sudo apt update
clear && cowsay -W 76 -f ovpn 'Y proceder a instalar todos los paquetes de NginX. Instalaremos adicionalmente `apache2-utils` para poder generar ficheros de autenticación básica `htpasswd`.'
sudo apt install -y nginx-core nginx-common nginx nginx-full apache2-utils
clear && cowsay -W 76 -f ovpn 'Generaremos ahora los ficheros de autenticación básica `htpasswd`. Cada cliente dispondrá de un usuario y clave únicos.'
cd /var/www
sudo htpasswd -c .htpasswd1 client1
sudo htpasswd -c .htpasswd2 client2
sudo htpasswd -c .htpasswd3 client3
sudo htpasswd -c .htpasswd4 client4
clear && cowsay -W 76 -f ovpn 'Es el momento de configurar NginX. Modificamos el fichero de configuración vaciándolo primero.'
sudo dd if=/dev/null of=/etc/nginx/nginx.conf && sudo vim /etc/nginx/nginx.conf
clear && cowsay -W 76 -f ovpn 'Establecemos unas opciones de configuración básicas, ocultando la información de versión de NginX.'
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
}
http {
sendfile on;
tcp_nopush on;
types_hash_max_size 2048;
server_tokens off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
clear && cowsay -W 76 -f ovpn 'Ahora configuraremos la aplicación web. Modificamos el servidor por defecto vaciándolo primero.'
sudo dd if=/dev/null of=/etc/nginx/sites-available/default && sudo vim /etc/nginx/sites-available/default
clear && cowsay -W 76 -f ovpn 'Utilizaremos una configuración básica escuchando por HTTP ya que, en realidad, este NginX no recibirá las solicitudes directas de internet, si no que éstas vendrán redireccionadas desde otro NginX que proporciona balanceo de carga y la seguridad necesaria para poder servir una aplicación web con garantías. Aquí es donde estableceremos la autenticación básica en las rutas de descarga de certificados de los diferentes clientes.'
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html;
server_name _;
location /download/client1 {
try_files $uri $uri/ =404;
auth_basic "Client Area";
auth_basic_user_file /var/www/.htpasswd1;
}
location /download/client2 {
try_files $uri $uri/ =404;
auth_basic "Client Area";
auth_basic_user_file /var/www/.htpasswd2;
}
location /download/client3 {
try_files $uri $uri/ =404;
auth_basic "Client Area";
auth_basic_user_file /var/www/.htpasswd2;
}
location /download/client4 {
try_files $uri $uri/ =404;
auth_basic "Client Area";
auth_basic_user_file /var/www/.htpasswd4;
}
}
clear && cowsay -W 76 -f ovpn 'Con la configuración de NginX ya preparada tenemos que desplegar los ficheros de nuestra aplicación web. Para ello, primero descargaremos estos ficheros.'
sudo wget -P /tmp https://wiki.bastionado.es/assets/files/openvpn-server/bastionado-vpn.tar
clear && cowsay -W 76 -f ovpn 'Descomprimimos los ficheros de la aplicación en el directorio desde el que la serviremos.'
sudo tar -xvf /tmp/bastionado-vpn.tar -C /var/www/html
clear && cowsay -W 76 -f ovpn 'Y ahora copiaremos todas las configuraciones cliente a las diferentes rutas de servicio.'
sudo cp /home/ovpn/client-configs/files/bastionado-client1.ovpn /var/www/html/download/client1
sudo cp /home/ovpn/client-configs/files/bastionado-client2.ovpn /var/www/html/download/client2
sudo cp /home/ovpn/client-configs/files/bastionado-client3.ovpn /var/www/html/download/client3
sudo cp /home/ovpn/client-configs/files/bastionado-client4.ovpn /var/www/html/download/client4
sudo cp /home/ovpn/client-configs/files/bastionado-tor-client1.ovpn /var/www/html/download/client1
sudo cp /home/ovpn/client-configs/files/bastionado-tor-client2.ovpn /var/www/html/download/client2
sudo cp /home/ovpn/client-configs/files/bastionado-tor-client3.ovpn /var/www/html/download/client3
sudo cp /home/ovpn/client-configs/files/bastionado-tor-client4.ovpn /var/www/html/download/client4
clear && cowsay -W 76 -f ovpn 'Lo siguiente que debemos hacer es otorgar la posesión de los ficheros al usuario y grupo que utilizará NginX y establecer los permisos correctos.'
sudo chown -R www-data:www-data /var/www
sudo find /var/www -type f -print0|sudo xargs -0 chmod 660
sudo find /var/www -type d -print0|sudo xargs -0 chmod 770
clear && cowsay -W 76 -f ovpn 'Comprobaremos que toda la configuración de NginX es correcta y después arrancaremos y habilitaremos el inicio automático del servicio.'
sudo nginx -T
sudo systemctl restart nginx.service && sudo systemctl status nginx.service
sudo systemctl enable nginx.service
Panel Títulos (⌘1)
Cliente en Windows de Alberto
clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 130 -f ansi-shadow 'PROBANDO' -c | lolcat && echo "" && echo "" && echo "" && figlet -w 220 -f ansi-shadow 'OPEN VPN' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 10 && clear
clear && cowsay -W 240 -f ovpn 'Ahora que hemos terminado completamente la configuración y que todo está operativo es el momento de ver si todo funciona correctamente. Para ello, veamos como un cliente Windows descarga su configuración conecta correctamente a la VPN.'
Panel oVPN (⌘4)
clear && cowsay -W 76 -f ovpn 'Mientras el cliente está conectando a la VPN podemos monitorizar nuestro servicio.'
sudo tail -f /var/log/openvpn/openvpn.log
Panel Títulos (⌘1)
Cliente Android
clear && cowsay -W 240 -f ovpn 'OpenVPN es multiplataforma, por lo que otros clientes, como por ejemplo Android, también pueden conectar. En este caso, además, utilizaremos la VPN TOR y comprobaremos como nuestra dirección IP de salida está en Estados Unidos y podemos acceder a dominios .onion.'
Panel oVPN (⌘4)
clear && cowsay -W 76 -f ovpn 'De nuevo, mientras el cliente está conectando a la VPN podemos monitorizar nuestro servicio.'
sudo tail -f /var/log/openvpn/openvpn-tor.log
Panel Títulos (⌘1)
Cliente MacOS
clear && cowsay -W 240 -f ovpn 'La VPN TOR también puede utilizarse sin problemas en plataformas de escritorio como MacOS.'
Panel Títulos (⌘1)
Cliente iOS
clear && cowsay -W 240 -f ovpn 'Si recordamos nuestros pasos anteriores anulamos el certificado del cliente 4 metiéndolo en nuestra Lista de revocación de certificados. Veamos qué ocurre cuando el cliente intenta conectar al servicio.'
Panel oVPN (⌘4)
clear && cowsay -W 76 -f ovpn 'En la monitorización de nuestro servicio podemos observar como se registra, durante el saludo entre servidor y cliente, que su certificado está en la CRL y por lo tanto el servidor OpenVPN rechaza la conexión, lo que se traduce en que el cliente se queda indefinidamente intentando conectar sin éxito.'
sudo tail -f /var/log/openvpn/openvpn-tor.log
Panel Títulos (⌘1)
clear && echo "" && echo "" && echo "" && echo && echo "" && echo "" && echo "" && echo "" && echo "" && echo "" && figlet -w 190 -f ansi-shadow 'THE END' -c | lolcat -a -d 1 && echo "" && echo "" && echo "" && sleep 5 && unimatrix -f -n -s 96 -w && clear