LinuxParty
OpenVPN nos permite de forma gratuita crear una red virtual privada (Virtual Private Network ) desde por ejemplo un smartphone hasta nuestra red privada de casa.Podemos aprender un poco mas sobre VPN en estas entradas.
Descargar e instalar OpenVPN
# apt-get install openssl openvpn
Crear CA
Para firmar los certificados, tanto el que se creará para el servidor como para cualquier dispositivo que quiera conectar a la VPN, será necesario crear una autoridad certificadora.
La forma mas sencilla de crear una PKI (Public Key Infrastructure) es mediante easy-rsa:
En caso de que no se haya instalado con OpenVPN lo haremos nosotros:
# apt-get install easy-rsa
# make-cadir /etc/openvpn/easy-rsa
# cd /etc/openvpn/easy-rsa
# source ./vars
Lo siguiente solo es necesario como precaución, y lo que hace es borrar todo certificado existente. NO deberá de ejecutarse si no hemos instalado easy-rsa recientemente y sospechamos que pueden existir otros certificados generados anteriormente
# ./clean-all
Ahora generamos los parámetros Diffie Hellman:
# ./build-dh
Creamos la CA:
# ./build-ca
Los dos comandos anteriores deberán de haber generado los siguientes archivos bajo el directorio /etc/openvpn/easy-rsa/keys:
- dh2048.pem: contiene los parámetros Diffie Hallman
- ca.crt: certificado público de la entidad certificadora
- ca.key: cable privada de la autoridad certificadora
Nota: los archivos .key deben de tener permisos restrictivos (-r——– root:root) ya que contienen la clave privada con la que se cifran las comunicaciones.
Crear certificados
A continuación se van a crear certificados para todos los servidores/dispositivos/hosts que vayan a mantener comunicaciones mediante VPN. En este ejemplo solo va haber un servidor OpenVPN (el cual tendrá su respectivo certificado) y un cliente.
Certificado servidor:
# ./build-key-server <nombre_del_servidor>
Durante la creación del certificado (tanto para el del servidor como para el de los clientes) se realizarán una serie de preguntas que podemos modificar desde el archivo ./vars
Nota: si realizamos cualquier modificación en el archivo vars deberemos de volver a ejecutar el comando source ./vars
Una vez generado, aparecerán sus respectivos archivos bajo el directorio keys/
- <nombre_del_servidor>.crt
- <nombre_del_servidor>.key
Certificado cliente:
# ./build-key <hostname_dispositivo_cliente>
En realidad podemos introducir cualquier otro nombre, pero sin duda como mejor se identifica es así.
Esto igualmente creará sus respectivos archivos.
Crear archivo de configuración cliente
Ya tengamos un dispositivo Android o un sistema Windows o Linux, deberemos de crear un archivo de configuración para el cliente.
# cd /etc/openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf .
# cp client.conf <hostname_dispositivo_cliente>.conf
Nota: si el archivo de configuración va a ir destinado a un dispositivo Android, deberemos de cambiar la extensión .conf por .ovpn
# vi <hostname_dispositivo_cliente>.conf client dev tun proto udp remote my-server-1 1194 resolv-retry infinite nobind user nobody group nogroup persist-key persist-tun ca ca.crt cert <hostname_dispositivo>.crt key <hostname_dispositivo>.key ns-cert-type server comp-lzo verb 3
Nota: el valor my-server-1 11194 deberemos de cambiarlo por nuestra IP pública o fqdn y si estamos utilizando Windows la interfaz será dev tap
Donde ubicar cada archivo de certificado
En realidad aún falta lo mas importante, que evidentemente es configurar el servidor, pero si estamos siguiendo estos pasos, vamos mejor a situar cada certificado y archivo generados hasta el momento en su sitio.
En el directorio /etc/openvpn del servidor deberán de estar:
- dh2048.pem
- ca.crt
- <hostname_server>.crt
- <hostname_server>.key
En el directorio /etc/openvpn del cliente (Linux):
Deberemos de transferir los archivos que abajo se citan desde el servidor en el que hemos generado los certificados y el archivo de configuración (habitualmente el propio servidor OpenVPN), hasta el cliente (scp, ftp, USB…).
- ca.crt
- <hostname_dispositivo>.crt
- <hostname_dispositivo>.key
- <hostname_dispositivo>.conf
Si el dispositivo es por ejemplo un Andriod deberemos de modificar los parámetros ca, cert y key del archivo de configuración, indicando la ruta en el que hemos transferido los archivos, normalmente algo parecido a /sdcard/memory0/Documents/…
Importante: deberemos de realizar todos los pasos desde el apartado “Crear certificados/Certificado cliente” hasta aquí, para cualquier dispositivo extra que quiera conectar con el servidor.
Configurar el servidor OpenVPN
Hasta ahora esta todo prácticamente preparado para una vez configurado los parámetros de configuración del servidor, iniciemos el servicio y la conexión este lista.
# cd /etc/openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz .
# unzip server.conf.gz .
# vi server.conf local 192.168.1.4 // IP interna del servidor OpenVPN port 1194 proto udp dev tun topology subnet ca ca.crt cert <hostname_server>.crt key <hostname_server>.key dh dh2048.pem server 10.8.0.0 255.255.255.0 // network y mask túnel ifconfig-pool-persist ipp.txt push "route 192.168.1.0 255.255.255.0" // network y mask a la que queremos acceder desde el exterior keepalive 10 120 comp-lzo user nobody group nogroup persist-key persist-tun status openvpn-status.log log-append openvpn.log verb 3
Configurar forwarding
Para que el sistema sea capaz de reenviar los paquetes de la interfaz tun0 o tap0 a eth0 deberemos de habilitar el forwarding en el sistema:
# vi /etc/sysctl.conf net.ipv4.ip_forward=1
# sysctl -p /etc/sysctl.conf
Nota: para que el sistema sepa que hacer con los paquetes que llegan por la interfaz túnel, es necesario crear una ruta estática con el comando route add, pero no preocuparos porque esto ya lo hace OpenVPN al iniciarse.
Port forwarding
Dependiendo del router de nuestro proveedor la habilitación de los puertos será de una forma u otra pero normalmente esta opción se encuentra en la pestaña “port forwarding” o similar.
Lo primero es acceder a nuestro router por la IP 192.168.1.1, introducir el usuario y contraseña del router y buscar la pestaña anterior. Si es necesario buscar en la red el manual de como hacerlo para vuestro router específico.
En definitiva lo que se quiere hacer es avisar al router de que todos los paquetes que vayan con destino al puerto 1194 desde el exterior (Internet) se reenvíen al host 192.168.1.4 (en nuestro caso es esta la IP del servidor OpenVPN) por el puerto 1194.
A continuación dejo un screenshot de esta configuración en un router de Jazztel (en mi caso estoy utilizando la ip 192.168.1.50):
Configurar IPtables
Si tenemos activo el cortafuego de Linux IPtables en el servidor, deberemos de crear algunas reglas para que el tráfico sea debidamente enrutado, de lo contrario no será necesario:
# iptables -A FORWARD -i eth0 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A FORWARD -s 10.8.0.0/24 -o eth0 -j ACCEPT
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Cuando reiniciemos estas reglas desaparecerán. Existen diferentes formas de hacer que persistan o se creen al inicio, aquí solo vamos a comentar una de las posibles válidas, y es meter estas reglas en el archivo /etc/rc.local antes de la línea exit 0 para que cuando el servidor se reinicie se ejecuten estas tres reglas al inicio:
# vi /etc/rc.local iptables -A FORWARD -i eth0 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -s 10.8.0.0/24 -o eth0 -j ACCEPT iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE exit0
Configurar UFW
Si tenemos activo el cortafuego de UFW en el servidor VPN, deberemos de crear algunas reglas para que el tráfico sea debidamente enrutado, de lo contrario no será necesario:
# ufw allow ssh
# ufw allow 1194/udp
# vim /etc/default/ufw
DEFAULT_FORWARD_POLICY="ACCEPT"
# vim /etc/ufw/before.rules
#
rules.before
#
Rules that should be run before the ufw command line added rules. Custom
rules should be added to one of these chains:
ufw-before-input
ufw-before-output
ufw-before-forward
#
START OPENVPN RULES
NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
Allow traffic from OpenVPN client to ens3
-A POSTROUTING -s 10.8.0.0/8 -o ens3 -j MASQUERADE
COMMIT
END OPENVPN RULES
Don't delete these required lines, otherwise there will be errors
*filter
# ufw enable
# ufw status
Status: active To Action From -- ------ ---- 22
ALLOW Anywhere 1194/udp
ALLOW Anywhere 22 (v6)
ALLOW Anywhere (v6) 1194/udp (v6)
ALLOW Anywhere (v6)
Activar los servicios
Una vez realizado todo, es el momento de iniciar OpenVPN:
Si el sistema en el que trabajamos utiliza SysV:
# service openvpn start
Si por el contrario utiliza Systemd:
# systemctl start openvpn@server
IP dinámica y configuración del cliente
En las siguientes entradas veremos como configurar el lado del cliente para iniciar conexión, y como establecer un servicio noIP para que aunque nuestra IP pública cambie (IP dinámica) podamos seguir conectándonos a través de un fqdn.
-
Seguridad
- Conexión Segura NFS en Linux, Tunelizar NFS sobre SSH y Configuración de NFS sobre SSH para Mayor Seguridad
- Utilizar ssh sin contraseña con ssh-keygen y ssh-copy-id
- Millones de teléfonos móviles podrían ser vulnerables a la vigilancia del gobierno chino
- Cómo limitar las conexiones SSH a la red local en Linux
- Los televisores inteligentes son como un «caballo de Troya digital» en los hogares
- Snort para Windows, detección de Intrusos y seguridad.
- Detección de Intrusiones con las herramientas: BASE y Snort.
- El Sistema de Detección de Intrusos: Snort. ( Windows y Linux )
- Configuración con Ejemplos de Snort para Windows, detección de intrusiones
- ¿El gobierno de EE. UU. ignoró la oportunidad de hacer que TikTok fuera más seguro?
- ¿Qué es SSH y cómo se utiliza? Los conceptos básicos de Secure Shell que necesitas saber
- Asegurar memcached del servidor, para evitar amplificar ataques DDoS
- Consejos de Seguridad para Pagos Móviles en España: Protege tus Transacciones con Estos Consejos Prácticos
- 22 herramientas de seguridad de servidores Linux de código abierto en 2023
- 8 hábitos que deben tomar los teletrabajadores altamente seguros