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.

De Bruselas a Brujas en tren, con Internet de alta velocidad

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

 

13 COMENTARIOS

  1. Edgar

    Excelente guía. Definitivamente la debo poner a prueba, acabo de leer la parte 1 y 2 y todo se ve muy bien explicado

  2. Diego M. - PepiMDQ

    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.

    • Nico

      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.

  3. Germán

    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!

    • Nico

      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!

      • Germán

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

  4. Fredy Rebossio

    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

  5. Edgar

    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

  6. Mauricio

    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.

      • Mauricio

        Lo he resuelto amigo, no recuerdo que fue lo que hice, porque resolvi casi el mismo dia. Me esta funcionando bien por ahora.

Dejá una respuesta

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí