Varios servicios de VPN en un solo servidor Buster

Instalar herramientas

apt install openvpn easy-rsa

Ajustar el reenvío de paquetes

echo 1 > /proc/sys/net/ipv4/ip_forward

En /etc/sysctl.conf descomentar la linea que contiene

net.ipv4.ip_forward=1

Servicio 1 con red 10.19.80.0/24 en puerto 1194

Crear espacio de trabajo para red01

mkdir -p /etc/openvpn/server/red01/clientes/generados

Preparar la autoridad certificadora de red01

cp -r /usr/share/easy-rsa/ /etc/openvpn/server/red01/autoridad
cd /etc/openvpn/server/red01/autoridad
cp vars.example vars

Hay que editar las variables para identificar la autoridad de la primera red

nano vars

Encontrar donde están estas variables

#set_var EASYRSA_REQ_COUNTRY "US"
#set_var EASYRSA_REQ_PROVINCE "California"
#set_var EASYRSA_REQ_CITY "San Francisco"
#set_var EASYRSA_REQ_ORG "Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL "me@example.net"
#set_var EASYRSA_REQ_OU "My Organizational Unit"

Habrá que descomentarlas y modificarlas a su gusto

set_var EASYRSA_REQ_COUNTRY "SV"
set_var EASYRSA_REQ_PROVINCE "SanSalvador"
set_var EASYRSA_REQ_CITY "San Salvador"
set_var EASYRSA_REQ_ORG "ChonteSV"
set_var EASYRSA_REQ_EMAIL "chirote@chonte.sv"
set_var EASYRSA_REQ_OU "vpn 01"

Se inicializa la autoridad certificadora

./easyrsa init-pki
./easyrsa build-ca nopass

Preguntará que nombre desea para la autoridad, pude ponerle lo que se le ocurra, en este ejemplo ChonteSV_vpn_1

Common Name (eg: your user, host, or server name) [Easy-RSA CA]:ChonteSV_vpn_1

Luego se generan los certificados para este primer servicio, primero la solicitud de firma, pedirá un nombre para el servidor que solicita pero este fue pasado por medio del comando, solo basta darle Enter

./easyrsa build-server-full "ChonteSV_vpn_1" nopass

Se crea una llave de intercambio Diffie-Hellman

./easyrsa gen-dh

Y también una firma HMAC

openvpn --genkey --secret ta.key

Lo siguiente es juntar todo lo del servidor ordenadamente

cp ta.key /etc/openvpn/server/red01/ChonteSV_vpn_1-hmac-ta.key
cp pki/ca.crt /etc/openvpn/server/red01/ChonteSV_vpn_1-ca.crt
cp pki/private/ChonteSV_vpn_1.key /etc/openvpn/server/red01/
cp pki/issued/ChonteSV_vpn_1.crt /etc/openvpn/server/red01/
cp pki/dh.pem /etc/openvpn/server/red01/ChonteSV_vpn_1-dh.pem

Para cada cliente que se deba conectar hay que crear certificados, lo cual puede ser incomodo pero es necesario por seguridad, pero depende de la configuración del servicio se puede usar un solo certificado para todos equipos que se conectarán… esto depende mas de sus escenarios, en este caso se creará para un cliente llamado chonte001_vpn_1

./easyrsa build-client-full "chonte001_vpn_1" nopass

Y se pone todo en orden del para el/los cliente/s

cp pki/issued/chonte001_vpn_1.crt /etc/openvpn/server/red01/clientes/
cp pki/private/chonte001_vpn_1.key /etc/openvpn/server/red01/clientes/

Después de tanto trabajo para los archivos previos necesarios para el servidor, hay que crear la configuración del primer servicio

cd /etc/openvpn
nano servicio1.conf

Y le llenamos con la siguiente configuración

port 1194
proto tcp
dev tun
# La autoridad del servicio
ca server/red01/ChonteSV_vpn_1-ca.crt
cert server/red01/ChonteSV_vpn_1.crt
# Los chunches del servidor
key server/red01/ChonteSV_vpn_1.key
# La seguridad extra
dh server/red01/ChonteSV_vpn_1-dh.pem
tls-auth server/red01/ChonteSV_vpn_1-hmac-ta.key 0
# La red privada por lo general la 10.x.x
server 10.19.80.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
# Algunos parámetros para el cliente
keepalive 10 120
cipher AES-256-CBC
auth SHA256
user nobody
group nogroup
persist-key
persist-tun
client-to-client
comp-lzo adaptive
# Esto se descomenta si se desa usar
# un certificado para muchos clientes
# no es recomendado pero ahi está
;duplicate-cn
# Los venditos logs
status /var/log/openvpn/openvpn-status-servicio1.log
log /var/log/openvpn/openvpn-servicio1.log
log-append /var/log/openvpn/openvpn-servicio1.log
verb 4
explicit-exit-notify 0

Y podemos arrancar el primer servicio preparado

systemctl start openvpn@servicio1
systemctl status openvpn@servicio1

Luego se prepara el archivo a compartir con los clientes, para lo cual y por facilidades futuras tendremos un archivo base para completar

cd /etc/openvpn/server/red01/
nano clientes/clientered01.opvn

Se le coloca el siguiente contenido, suponiendo que se tiene el dominio chonte.sv

client
dev tun
proto tcp
remote chonte.sv 1194
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
tls-version-min 1.0
remote-cert-tls server
cipher AES-256-CBC
auth SHA256
comp-lzo adaptive
key-direction 1
mute-replay-warnings
verb 4

Como se ha generado un certificado y llave para un usuario, se pondrá todo en un solo archivo, lo que conviene tener en un script

nano crearOvpnCliente.sh

Y llevará estas lineas

#!/bin/bash
SERVICIO="red01"
DIRECTORIO="/etc/openvpn/server/${SERVICIO}"
SERVIDOR="ChoteSV_vpn_1"
if [ $# -ne 1 ]; then
#Avisar que se rquieren mas parámetros
echo ""
echo "USO: $0 <nombre del cliente>"
echo ""
echo " ej: $0 \"${SERVICIO}-gente-001\""
else
CLIENTE="$1"
# Esto lo ajustaré algún día
# cd "${DIRECTORIO}/autoridad/"
# ./easyrsa build-client-full "${CLIENTE}" nopass
# cp "pki/issued/${CLIENTE}.crt" "${DIRECTORIO}/clientes/"
# cp "pki/private/${CLIENTE}.key" "${DIRECTORIO}/clientes/"
cat "${DIRECTORIO}/clientes/cliente${SERVICIO}.opvn" > "/tmp/${CLIENTE}.ovpn"
echo '<ca>' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/${SERVIDOR}-ca.crt" >> "/tmp/${CLIENTE}.ovpn"
echo '</ca>' >> "/tmp/${CLIENTE}.ovpn"
echo '<cert>' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/clientes/${CLIENTE}.crt" >> "/tmp/${CLIENTE}.ovpn"
echo '</cert>' >> "/tmp/${CLIENTE}.ovpn"
echo '<key>' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/clientes/${CLIENTE}.key" >> "/tmp/${CLIENTE}.ovpn"
echo '</key>' >> "/tmp/${CLIENTE}.ovpn"
echo '<tls-auth>' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/${SERVIDOR}-hmac-ta.key" >> "/tmp/${CLIENTE}.ovpn"
echo '</tls-auth>' >> "/tmp/${CLIENTE}.ovpn"
mv "/tmp/${CLIENTE}.ovpn" "${DIRECTORIO}/clientes/generados/"
ls -lhs "${DIRECTORIO}/clientes/generados/${CLIENTE}.ovpn"
fi

Entonces podremos crear los archivos .ovpn que se necesiten, en este ejercicio se creo uno

chmod 700 crearOvpnCliente.sh
./crearOvpnCliente.sh chonte001_vpn_1

Dejando el archivo a compartir con un cliente en /etc/openvpn/server/red01/clientes/generados/

ls -l /etc/openvpn/server/red01/clientes/generados/chonte001_vpn_1.ovpn

El servicio ya está funcionando y basta que en el cliente pueda importarse el archivo, pero si se desea que el servidor haga enrutamiento y enmascaramiento de las peticiones de red es bueno crear un archivo para la reglas de iptables

nano ruteo.sh

Se le coloca le contenido siguiente suponiendo que la tarjeta que da salida a internet es la eth0

#!/bin/bash
iptables -t nat -A POSTROUTING -s 10.19.80.0/24 -o eth0 -j MASQUERADE
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT

Este script debería correrse cada vez que sea necesario, o utilizar otra herramienta como ufw para automatizar el asunto

chmod 700 ruteo.sh
./ruteo.sh

Servicio 2 con red 10.19.90.0/24 en puerto 1195

Todo es repetir lo echo en el servicio anterior pero para una red diferente, primero hay que crear el espacio de trabajo para red02

mkdir -p /etc/openvpn/server/red02/clientes/generados

Preparar la autoridad certificadora de red02

cp -r /usr/share/easy-rsa/ /etc/openvpn/server/red02/autoridad
cd /etc/openvpn/server/red02/autoridad
cp vars.example vars

Hay que editar las variables para identificar la autoridad de la segunda red

nano vars

Encontrar donde están estas variables

#set_var EASYRSA_REQ_COUNTRY "US"
#set_var EASYRSA_REQ_PROVINCE "California"
#set_var EASYRSA_REQ_CITY "San Francisco"
#set_var EASYRSA_REQ_ORG "Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL "me@example.net"
#set_var EASYRSA_REQ_OU "My Organizational Unit"

Habrá que descomentarlas y modificarlas a su gusto

set_var EASYRSA_REQ_COUNTRY "SV"
set_var EASYRSA_REQ_PROVINCE "SanSalvador"
set_var EASYRSA_REQ_CITY "San Salvador"
set_var EASYRSA_REQ_ORG "ChonteSV"
set_var EASYRSA_REQ_EMAIL "chirote@chonte.sv"
set_var EASYRSA_REQ_OU "vpn 02"

Se inicializa la autoridad certificadora

./easyrsa init-pki
./easyrsa build-ca nopass

Preguntará que nombre desea para la autoridad, pude ponerle lo que se le ocurra, en este ejemplo ChonteSV_vpn_2

Common Name (eg: your user, host, or server name) [Easy-RSA CA]:ChonteSV_vpn_2

Luego se generan los certificados para este primer servicio, primero la solicitud de firma, pedirá un nombre para el servidor que solicita pero este fue pasado por medio del comando, solo basta darle Enter

./easyrsa build-server-full "ChonteSV_vpn_2" nopass

Se crea una llave de intercambio Diffie-Hellman

./easyrsa gen-dh

Y también una firma HMAC

openvpn --genkey --secret ta.key

Lo siguiente es juntar todo lo del servidor ordenadamente

cp ta.key /etc/openvpn/server/red02/ChonteSV_vpn_2-hmac-ta.key
cp pki/ca.crt /etc/openvpn/server/red02/ChonteSV_vpn_2-ca.crt
cp pki/private/ChonteSV_vpn_2.key /etc/openvpn/server/red02/
cp pki/issued/ChonteSV_vpn_2.crt /etc/openvpn/server/red02/
cp pki/dh.pem /etc/openvpn/server/red02/ChonteSV_vpn_2-dh.pem

Para cada cliente que se deba conectar hay que crear certificados, lo cual puede ser incomodo pero es necesario por seguridad, pero depende de la configuración del servicio se puede usar un solo certificado para todos equipos que se conectarán… esto depende mas de sus escenarios, en este caso se creará para un cliente llamado chonte001_vpn_2

./easyrsa build-client-full "chonte001_vpn_2" nopass

Y se pone todo en orden del para el/los cliente/s

cp pki/issued/chonte001_vpn_2.crt /etc/openvpn/server/red02/clientes/
cp pki/private/chonte001_vpn_2.key /etc/openvpn/server/red02/clientes/

Después de tanto trabajo para los archivos previos necesarios para el servidor, hay que crear la configuración del segundo servicio

cd /etc/openvpn
nano servicio2.conf

Y le llenamos con la siguiente configuración

port 1195
proto tcp
dev tun
# La autoridad del servicio
ca server/red02/ChonteSV_vpn_2-ca.crt
cert server/red02/ChonteSV_vpn_2.crt
# Los chunches del servidor
key server/red02/ChonteSV_vpn_2.key
# La seguridad extra
dh server/red02/ChonteSV_vpn_2-dh.pem
tls-auth server/red02/ChonteSV_vpn_2-hmac-ta.key 0
# La red privada por lo general la 10.x.x
server 10.19.90.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
# Algunos parámetros para el cliente
keepalive 10 120
cipher AES-256-CBC
auth SHA256
user nobody
group nogroup
persist-key
persist-tun
client-to-client
comp-lzo adaptive
# Esto se descomenta si se desa usar
# un certificado para muchos clientes
# no es recomendado pero ahi está
;duplicate-cn
# Los venditos logs
status /var/log/openvpn/openvpn-status-servicio2.log
log /var/log/openvpn/openvpn-servicio2.log
log-append /var/log/openvpn/openvpn-servicio2.log
verb 4
explicit-exit-notify 0

Y podemos arrancar el primer servicio preparado

systemctl start openvpn@servicio2
systemctl status openvpn@servicio2

Luego se prepara el archivo a compartir con los clientes, para lo cual y por facilidades futuras tendremos un archivo base para completar

cd /etc/openvpn/server/red02/
nano clientes/clientered02.opvn

Se le coloca el siguiente contenido, suponiendo que se tiene el dominio chonte.sv

client
dev tun
proto tcp
remote chonte.sv 1195
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
tls-version-min 1.0
remote-cert-tls server
cipher AES-256-CBC
auth SHA256
comp-lzo adaptive
key-direction 1
mute-replay-warnings
verb 4

Como se ha generado un certificado y llave para un usuario, se pondrá todo en un solo archivo, lo que conviene tener en un script

nano crearOvpnCliente.sh

Y llevará estas lineas

#!/bin/bash
SERVICIO="red02"
DIRECTORIO="/etc/openvpn/server/${SERVICIO}"
SERVIDOR="ChoteSV_vpn_2"
if [ $# -ne 1 ]; then
#Avisar que se rquieren mas parámetros
echo ""
echo "USO: $0 <nombre del cliente>"
echo ""
echo " ej: $0 \"${SERVICIO}-gente-001\""
else
CLIENTE="$1"
# Esto lo ajustaré algún día
# cd "${DIRECTORIO}/autoridad/"
# ./easyrsa build-client-full "${CLIENTE}" nopass
# cp "pki/issued/${CLIENTE}.crt" "${DIRECTORIO}/clientes/"
# cp "pki/private/${CLIENTE}.key" "${DIRECTORIO}/clientes/"
cat "${DIRECTORIO}/clientes/cliente${SERVICIO}.opvn" > "/tmp/${CLIENTE}.ovpn"
echo '<ca>' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/${SERVIDOR}-ca.crt" >> "/tmp/${CLIENTE}.ovpn"
echo '</ca>' >> "/tmp/${CLIENTE}.ovpn"
echo '<cert>' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/clientes/${CLIENTE}.crt" >> "/tmp/${CLIENTE}.ovpn"
echo '</cert>' >> "/tmp/${CLIENTE}.ovpn"
echo '<key>' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/clientes/${CLIENTE}.key" >> "/tmp/${CLIENTE}.ovpn"
echo '</key>' >> "/tmp/${CLIENTE}.ovpn"
echo '<tls-auth>' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/${SERVIDOR}-hmac-ta.key" >> "/tmp/${CLIENTE}.ovpn"
echo '</tls-auth>' >> "/tmp/${CLIENTE}.ovpn"
mv "/tmp/${CLIENTE}.ovpn" "${DIRECTORIO}/clientes/generados/"
ls -lhs "${DIRECTORIO}/clientes/generados/${CLIENTE}.ovpn"
fi

Entonces podremos crear los archivos .ovpn que se necesiten, en este ejercicio se creo uno

chmod 700 crearOvpnCliente.sh
./crearOvpnCliente.sh chonte001_vpn_2

Dejando el archivo a compartir con un cliente en /etc/openvpn/server/red02/clientes/generados/

ls -l /etc/openvpn/server/red02/clientes/generados/chonte001_vpn_2.ovpn

El servicio ya está funcionando y basta que en el cliente pueda importarse el archivo, pero si se desea que el servidor haga enrutamiento y enmascaramiento de las peticiones de red es bueno crear un archivo para la reglas de iptables

nano ruteo.sh

Se le coloca le contenido siguiente suponiendo que la tarjeta que da salida a internet es la eth0

#!/bin/bash
iptables -t nat -A POSTROUTING -s 10.19.90.0/24 -o eth0 -j MASQUERADE
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT

Este script debería correrse cada vez que sea necesario, o utilizar otra herramienta como ufw para automatizar el asunto

chmod 700 ruteo.sh
./ruteo.sh

Pendientes

Mejorar el script para crear los clientes

Añadir como se revocan clientes (para banearlos)

Lo que se venga de la creatividad

Fuentes

https://www.howtoforge.com/how-to-install-and-configure-openvpn-server-on-debian-10/ https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-debian-10 https://wiki.archlinux.org/index.php/Easy-RSA https://wiki.gentoo.org/wiki/Create_a_Public_Key_Infrastructure_Using_the_easy-rsa_Scripts https://www.hugeserver.com/kb/openvpn-multiple-ports/ http://systemadmin.es/2013/01/mismo-certificado-servidor-openvpn