Muchas veces dudo de conectarme a algunos sitios web utilizando una red pública, o al menos no mis redes de preferencia, pues nunca puedo estar completamente seguro de que es lo que hay tras esa red. Cuando ingresamos a redes Wi-Fi libres como la de bares o cafés, probablemente sin saber estamos aceptando que nuestro tráfico sea trackeado, o analizado, así como también nos exponemos a que alguien pueda estar haciendo uso de esa red para planes un poco mas malévolos como robar contraseñas, usuarios, identificaciones, accesos varios, etc. Es por ello que siempre recomiendo tener un peer de VPN para poder tunelizar todo el tráfico hasta nuestro punto de confianza, en mi caso, la conexión a Internet de mi casa.
Fuera de las cuestiones de seguridad, una VPN también nos sirve, como su nombre indica, para formar parte de una red privada virtual, donde podemos acceder nuestros dispositivos de casa a través de la VPN misma, bastante útil si tenemos un fileserver en casa y necesitamos ver algunos archivos pero no queremos exponerlos a Internet.
OpenVPN
Lo que usaré para crear mi nodo de VPN es el viejo, conocido y potente OpenVPN. Es una herramienta de Software Libre y es un pináculo entre velocidad, confiabilidad y seguridad. Utiliza un protocolo soportado por casi cualquier dispositivo (Windows, Mac, Linux así como también teléfonos Android y Apple) y routers de diferentes modelos y marcas tanto hogareños como empresariales.
Instalar OpenVPN
Asumiendo que ya tienen su servidor Linux corriendo exitosamente sobre su Raspberry PI y como siempre basándome en una instalación de Arch Linux, procedemos:
sudo pacman -S easy-rsa openvpn
Instalará el paquete openvpn completo además de easy-rsa, su dependencia.
Certificados de autoridad
OpenVPN funciona sobre un modelo de certificados para encriptar el tráfico (es por eso que instalamos easy-rsa anteriormente), crearemos los certificados básicos para comenzar. Lo primero que haremos es pasarnos al usuario root para trabajar más cómodos
sudo su -
Ahora configuraremos el archivo de variables de easy-rsa. Para ello, editaremos el archivo
/etc/openvpn/easy-rsa/vars
y descomentaremos las líneas
#set_var EASYRSA_REQ_COUNTRY #set_var EASYRSA_REQ_PROVINCE #set_var EASYRSA_REQ_CITY #set_var EASYRSA_REQ_ORG #set_var EASYRSA_REQ_EMAIL #set_var EASYRSA_REQ_OU
Configurándole cada parámetro:
set_var EASYRSA_REQ_COUNTRY "AR" set_var EASYRSA_REQ_PROVINCE "Buenos Aires" set_var EASYRSA_REQ_CITY "Ciudad Autonoma de Buenos Aires" set_var EASYRSA_REQ_ORG "Raspberry PI 2" set_var EASYRSA_REQ_EMAIL "[email protected]" set_var EASYRSA_REQ_OU "Raspberry PI 2"
Guardamos el archivo y ejecutamos init-pki:
cd /etc/openvpn/easy-rsa/ easyrsa init-pki
Este comando generará los certificados básicos que necesitamos para empezar a trabajar, pero no son todos! Ahora ejecutaremos easyrsa con el parámetro build-ca, para generar los certificate authority
easyrsa build-ca nopass
Así obtendremos ca.crt y ca.key, el par público-privado del certificado de autoridad. Durante la ejecución, el script nos preguntará por diferentes datos que debemos proveerle, principalmente datos nuestros como los que configuramos en el archivo vars.
Certificados de servidor
Además de los certificados de autoridad, también necesitaremos algunos certificados de servidor
cd /etc/openvpn/ easyrsa gen-req server nopass
Pueden reemplazar el nombre «server» por uno personalizado de su agrado. Ahora importaremos el certificado del servidor con el authority que creamos en /etc/openvpn/easy-rsa/
easyrsa import-req /etc/openvpn/server.req server
Recuerden reemplazar server por su nombre customizado, si es que lo cambiaron antes en el gen-req.
Ahora firmaremos el certificado
easyrsa sign-req server server
Tendremos que confirmar con yes
Por último generaremos una key Diffie-Hellman:
cd /etc/openvpn/easy-rsa easyrsa gen-dh
y un HMAC
openvpn --genkey --secret ta.key
Configurar el servidor OpenVPN
La configuración la haremos con el archivo /etc/openvpn/openvpn.conf, utilizando este contenido:
port 1194 proto udp dev tun0 ca /etc/openvpn/easy-rsa/pki/ca.crt cert /etc/openvpn/easy-rsa/pki/issued/vpn.crt key /etc/openvpn/easy-rsa/pki/private/vpn.key dh /etc/openvpn/easy-rsa/pki/dh.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo user nobody group nobody persist-key persist-tun management 127.0.0.1 7505 log-append /var/log/openvpn tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0 key-direction 0 cipher AES-256-CBC auth SHA256 push "redirect-gateway def1" push "remote-gateway pi.reyni.co" #push "dhcp-option DNS 208.67.220.222" #push "dhcp-option DNS 208.67.220.220" push "dhcp-option DNS 192.168.1.3" crl-verify /etc/openvpn/easy-rsa/pki/crl.pem
Ustedes tendrán que ajustar algunos parámetros como ser el path de los archivos generados anteriormente (aunque seguramente concuerden), y el push dhcp-options, ya que yo estoy utilizando mi servidor DNS local (192.168.1.3) en lugar de los DNS de OpenDNS.
La configuración a grandes rasgos es sencilla, configuramos el puerto 1194, por protocolo UDP (lo estandar para OpenVPN), los certificados creados anteriormente, la configuración del servidor propiamente dicho, el server, la asignación de IP y mascara, compresión, keepalive, y finalmente las configuraciones de DNS, gateway y demás para tener acceso a internet.
Configuraciones de red en nuestro servidor
Es importante configurar el ip_forward en nuestro servidor, de esa manera se determina donde el tráfico debe ser routeado. Editamos el archivo /etc/sysctl.conf y agregamos la línea
net.ipv4.ip_forward = 1
Guardamos el archivo y aplicamos los cambios:
sysctl -p
Configuraciones de red en nuestro router
Recuerden abrir el puerto 1194 UDP camino a nuestro servidor en su modem/router, de esta manera podremos acceder el servicio desde internet. En esta imagen pueden ver la configuración en un router Cisco de Fibertel.
Iniciar e instalar el servicio
Arrancamos el servicio con
sudo systemctl start openvpn@server
Deberán reemplazar «server» por el nombre personalizado que usaron anteriormente.
Si todo sale bien, con ps afx podrán ver el servicio corriendo. Para que quede corriendo siempre que se reinicie el servidor,
sudo systemctl enable openvpn@server
Recuerden una vez mas, editar «server» por el nombre personalizado.
Generar configuraciones de cliente
Una vez que tenemos nuestro servidor correctamente configurado, ahora podemos generar los certificados para nuestros clientes.
Primero debemos crear un archivo en /etc/openvpn/client/client.conf que será la plantilla para generar las configuraciones, con este contenido:
client dev tun proto udp remote vpn.reyni.co 1194 resolv-retry infinite nobind user nobody group nogroup persist-key persist-tun cipher AES-256-CBC auth SHA256 key-direction 1 remote-cert-tls server comp-lzo verb 3
Tendrán que editar la línea remote, con su número de IP pública o su dirección de DNS, que será la del servidor VPN.
Ahora creen un archivo en /etc/openvpn/make_config.sh, quien será de gran ayuda para crear las configuraciones de cliente de manera mas simple, con este contenido:
#!/bin/bash if [ $# -eq 0 ] then echo "Usage: $0 profile" exit 1 fi cd /etc/openvpn/easy-rsa/ easyrsa build-client-full ${1} nopass cat /etc/openvpn/client/client.conf \ <(echo -e '') \ /etc/openvpn/easy-rsa/pki/ca.crt \ <(echo -e '\n') \ /etc/openvpn/easy-rsa/pki/issued/${1}.crt \ <(echo -e '\n') \ /etc/openvpn/easy-rsa/pki/private/${1}.key \ <(echo -e '\n') \ /etc/openvpn/easy-rsa/keys/ta.key \ <(echo -e '') \ > /etc/openvpn/client/${1}.ovpn
Editen los paths correspondientes a donde ustedes tengan sus keys, y denle permisos de ejecución al script:
chmod +x make_config.sh
El script se utiliza facilmente:
[root@pi openvpn]# ./make_config.sh tecnovortex Generating a 2048 bit RSA private key ......+++ .......+++ writing new private key to '' ----- Using configuration from /etc/openvpn/easy-rsa/openssl-easyrsa.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows commonName :ASN.1 12:'tecnovortex' Certificate is to be certified until Aug 12 14:18:49 2028 GMT (3650 days) Write out database with 1 new entries Data Base Updated
De esta manera creamos un archivo tecnovortex.ovpn que debemos enviar a nuestro dispositivo. Pueden enviarlo por mail o utilizando scp de forma segura.
Configuración de cliente
Del lado del cliente no hay mucho para hacer.
Para Mac OSX utilizo Tunnelblick. (Ver imagen).
Para Linux utilizo el mismo NetworkManager con el plugin de Openvpn
Para iPhone utilizo OpenVPN Connect (ver mi configuración).
Para Android pueden utilizar OpenVPN For Android, y en Windows pueden utilizar el cliente oficial
Ey! Me perdí!
Toda la ayuda que necesiten la voy a intentar brindar a través de los comentarios en el blog, también pueden consultar el repositorio de github de mi servidor, donde está todo este montón de archivos alojados ahí por si quieren verlo de alguna manera mas cómoda: https://github.com/reynico/my-raspberry/tree/master/openvpn
Conclusión
Para cualquiera de las opciones, basta con importar el cliente .ovpn al dispositivo y eso es todo. Con esta configuración, una vez conectada la VPN estarán navegando de forma encriptada punto a punto hasta su servidor local, esto quiere decir que el tráfico saliente de su teléfono o computadora con VPN establecida es ahora encriptada para la persona que pueda querer robar información mediante spoofing en, por ejemplo, un Starbucks. Por supuesto que esto no arregla problemas de seguridad de por si, como un keylogger en una computadora, pero nos provee una capa de seguridad y comodidad adicional en la que uno puede relajarse un poco mas, sobre todo en estos tiempos donde la gente no le da mucha bola a la seguridad en general
Excelente guía. Definitivamente la debo poner a prueba, acabo de leer la parte 1 y 2 y todo se ve muy bien explicado
Mil gracias por estos tutos. Puede que le empiece a dar utilidad a un Raspberry Pi 2 que me compré y dejé por ahí tirada.
Es una pena.
Y estos post son la excusa ideal para desempolvarlas y darles un uso práctico.
Para eso se puede usar PiVPN, mil veces más sencillo, tan fácil como ejecutar un comando, el comando es:
curl -L https://install.pivpn.io | bash
Para más información http://pivpn.io/
Miguel, la idea de este, y todos los posts que vendrán a continuación como parte de una guía para darle un uso a un Raspberry PI, es que quienes estén interesados puedan ver como suceden las cosas paso por paso, en vez de una instalación automatizada. Podría darles también una imagen de la memoria SD y que la graben y ya, pero no es la idea. Saludos.
Hola Nico, muy buena la parte 2. Aprovecho para hacerte una consulta, porque la vez que quise editar el router de Fibertel no pude, y como me está funcionando bien, no quisiera gastar en otro y que el de ellos me lo pasen a Bridge. ¿Como hiciste para poder configurar un forwardeo de puertos en el router de ellos?
Saludos y gracias!
Ger! En mi caso tengo un dpc3828, el panel está en 192.168.1.1, usuario admin, password cisco. Ahí dentro tenés el tab de port forwarding (asi como tambien todo para editar, rangos de IP, dns, wifi, etc). Comentame que modem/router tenés!
Muy buena data, entré perfecto!! Increible que lo tengan asi. En uno anterior, me acuerdo que habia que hacerle un reset de fabrica, configurar todo «offline», y despues conectarlo con ellos y rezar que cuando pisen la configuración no te pisen los nateos.
Mil gracias Nico!!!
Excelente! Tengo una duda… con este tipo de VPN, puedo tener la misma IP local conectandome desde cualquier otro lado? O solo sirve para tunelear la info?
Hola!
La IP local de la computadora/celular desde el que te conectás? Si, sin problema
Definitivamente es la mejor compra que he hecho en muchos años.
He tenido todos los modelos representantivos es decir la 1, 2 y 3.
Mi distribución favorita es sin duda alguna osmc una vez instalada configuro el addon de YouTube que para mi es indispensable y configuro simpleiptv para poder ver listas de canales en 1080p, como tengo conectado un disco duro externo de 1tb por usb añado mi colección de películas y series a la biblioteca de kodi.
Como siempre viene bien tener un cliente de torrents instalo y configuro transmission utilizando weaved para poder acceder desde fuera de casa y poder añadir torrents desde el móvil estando fuera de casa.
Jdownloader2 no necesita presentación y definitivamente es un indispensable es mucho más sencillo de configurar que transmission pues desde la misma configuración se puede indicar que abra los puertos automáticamente para poder añadir descargas desde fuera de casa.
Retrosmc para tener retropie dentro de osmc y emular los clásicos.
Plex server para poder compartir la biblioteca del disco duro externo de 1tb. En red local funciona de lujo, fuera de casa al tener que hacer transcoding al vuelo no sirve de mucho pues el procesador del raspberry pi no es especialmente potente.
Widevine y Chromium para poder ver Netflix y Amazon prime video iniciando las X con un simple script.
Y últimamente la uso para minar con MinerGate pues la tengo siempre encendida 24h/7 días.
Todo queda dentro de la misma distribución y sin tener que andar cambiando de micro sd o sistema operativo. Por ese motivo es que mi distribución favorita es osmc.
Aún me falta probar que tal funciona el raspberry pi como un nas con open media vault. Pero tengo que investigar si se puede integrar dentro de osmc para evitar cambiar de distribución.
Aplicaciones útiles si cuentas con Android
Kore control remoto de kodi muy útil
Raspmanager temperatura del procesador, espacio libre y matar procesos fácilmente entre muchas otras cosas
Weaved pi acceder cómodamente a todas las conexiones
Transmission remote me es más cómodo que la interfaz web de transmission
Home remote control emulador de teclado y mouse. Especialmente útil cuando lanzas las X y controlas todo cómodamente con el celular
Cliente de plex ver la biblioteca compartida
Juicessh acceder a configurar algo puntualmente. Es mucho más cómodo conectarse por putty o por la terminal de GNU/Linux pero para cosas puntuales puede ser útil
AndFTP ver el servidor ftp desde el teléfono
Saludos, y gracias por publicar este tutorial.
Nunca antes me habia interesado mucho en esto del VPN, pero con tu tutorial me entro el gusanillo y he configurado un servidor.
Tengo un servidor DNS local, y me funciona en mi equipo, pero cuando intento navegar con el VPN encendido, ya sea en windows o en el android, simplemente se queda ahi y nunca llega a realizar la peticion.
Conectado a la VPN, que dirección de DNS tenés? Tu DNS local?
Lo he resuelto amigo, no recuerdo que fue lo que hice, porque resolvi casi el mismo dia. Me esta funcionando bien por ahora.