
En este entretenido confinamiento por razones bien gastadas, se dio la necesidad de tener conexiones privadas desde las casas hacia los trabajos, o en todo caso se requiere al revés, o mejor aún entre diferentes regiones del mundo.
Algunos proveedores de Internet brindan IP pública en contratos residenciales, y también el router asignado nos deja poner nuestro equipo en una DMZ, con eso y un Debian (o un servidor en algún rincón de Internet) tenemos lo necesario para tener un servidor de varias VPN, así que dedicándome un rato a probar como hacerlo y esta fue la guía que medio pude armar
Instalar herramientas
apt install openvpn easyrsa
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 /var/log/openvpn 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" # 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-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" # 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-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
Usuario debianero comelasaña y tragra frituras, actualmente desplazado forzosamente de su cubil original, laborando formalmente ajeno a la tecnología linuxosa pero travesiando como siempre en bash.
Se acepta caridad y ofrendas en especies, la camada se los agradecerá 🙂