====== Varios servicios de VPN en un solo servidor Buster ======
===== Instalar herramientas =====
apt install openvpn easy-rsa
===== Configurar la red a Pasarela =====
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
===== Configuración de VPN-1 =====
==== Servicio 1 con red 10.19.80.0/24 en puerto 1194====
Crear espacio de trabajo para red01
mkdir /var/log/openvpn
mkdir -p /etc/openvpn/server/red01/clientes/generados
Preparar la autoridad certificadora de red01
make-cadir autoridad
cd /etc/openvpn/server/red01/autoridad
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 --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
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"
# Si se desar usar ip fija por cliente
;topology subnet
# Y para colocar las configuraciones específicas por cliente
# habrá que crear el subdirectorio y crear un archivo para cada uno
# que deberá contener algo como : ifconfig-push 10.19.80.10 255.255.255.0
;client-config-dir server/red01/clientes/fijos/
# Algunos parámetros para el cliente
keepalive 10 120
cipher AES-256-GCM
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
==== Generar Certificados de Clientes ====
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/
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-GCM
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="ChonteSV_vpn_1"
if [ $# -ne 1 ]; then
#Avisar que se rquieren mas parámetros
echo ""
echo "USO: $0 "
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 '' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/${SERVIDOR}-ca.crt" >> "/tmp/${CLIENTE}.ovpn"
echo '' >> "/tmp/${CLIENTE}.ovpn"
echo '' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/clientes/${CLIENTE}.crt" >> "/tmp/${CLIENTE}.ovpn"
echo '' >> "/tmp/${CLIENTE}.ovpn"
echo '' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/clientes/${CLIENTE}.key" >> "/tmp/${CLIENTE}.ovpn"
echo '' >> "/tmp/${CLIENTE}.ovpn"
echo '' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/${SERVIDOR}-hmac-ta.key" >> "/tmp/${CLIENTE}.ovpn"
echo '' >> "/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
===== Configuración de VPN-2 =====
==== 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"
# Si se desar usar ip fija por cliente
;topology subnet
# Y para colocar las configuraciones específicas por cliente
# habrá que crear el subdirectorio y crear un archivo para cada uno
# que deberá contener algo como : ifconfig-push 10.19.90.10 255.255.255.0
;client-config-dir server/red02/clientes/fijos/
# Algunos parámetros para el cliente
keepalive 10 120
cipher AES-256-GCM
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
==== Generar Certificados de Clientes ====
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-GCM
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="ChonteSV_vpn_2"
if [ $# -ne 1 ]; then
#Avisar que se rquieren mas parámetros
echo ""
echo "USO: $0 "
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 '' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/${SERVIDOR}-ca.crt" >> "/tmp/${CLIENTE}.ovpn"
echo '' >> "/tmp/${CLIENTE}.ovpn"
echo '' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/clientes/${CLIENTE}.crt" >> "/tmp/${CLIENTE}.ovpn"
echo '' >> "/tmp/${CLIENTE}.ovpn"
echo '' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/clientes/${CLIENTE}.key" >> "/tmp/${CLIENTE}.ovpn"
echo '' >> "/tmp/${CLIENTE}.ovpn"
echo '' >> "/tmp/${CLIENTE}.ovpn"
cat "${DIRECTORIO}/${SERVIDOR}-hmac-ta.key" >> "/tmp/${CLIENTE}.ovpn"
echo '' >> "/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