====== 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