Montando nuestra VPN

Hoy en día es habitual conectarse desde diferentes lugares mediante los múltiples dispositivos que utilizamos de manera cotidiana: móviles, tablets, relojes, libros electrónicos o demás. Por supuesto, esto implica que nuestros datos están viajando por las conexiones de los propietarios de esas redes, lo que supone un gran riesgo de seguridad. Esto no necesariamente significa que el dueño sea “el malo”, simplemente puede ser negligente administrando su red; nunca se puede saber quién puede estar detrás de una red, por muy “honrado” que sea su propietario.

Con esto me estoy refiriendo en concreto a un enemigo, las redes WiFi; nos conectamos a ellas en cafeterías, parques, plazas, hoteles, casas de amigos… Y claro, siempre puede que haya alguien “pegando la oreja”.

Hay quien puede pensar que no tiene nada que ocultar, pero al margen del valor comercial de nuestros datos (navegación, información  para estudios comerciales, etc), puede haber otro tipo de amenazas: robo de datos bancarios, cuentas de redes sociales, suplantación de identidad y otras cosas que es mejor ni imaginar.

Por ello hoy vamos a hablar de cómo evitar esto montando nuestra propia VPN. Antes de ponernos a ello, explicar brevemente qué conseguiremos y qué no montando una VPN.

En primer lugar una VPN es, citando a Wikipedia, una tecnología de red que permite una extensión segura de la red local (LAN) sobre una red pública o no controlada como Internet.

En otras palabras, una VPN nos permite enviar nuestro tráfico cifrado desde una conexión en la que no confiamos (WiFi del hotel, cafetería, etc.) hasta nuestro servidor (situado en nuestra casa), por donde saldrá a Internet como haría normalmente si estuviéramos físicamente allí (i.e., en nuestra casa). Gracias a esto, y asumiendo que nuestra casa es segura, nadie podrá espiar este tráfico en su camino hasta nuestra casa, desde donde podrá viajar normalmente desde una red que es segura.

Por último, antes de empezar hay que dejar claro que nuestro proveedor de servicios de Internet (y cualquiera que tenga acceso a esos datos) ve con normalidad el tráfico de salida.

Dicho esto, comencemos con el montaje. Vamos a utilizar una Raspberry Pi B, que es suficiente para lo que se quiere hacer. El coste aproximado del hardware es de unos 50€. En cuanto a software utilizaremos OpenVPN, un software libre para conexiones VPN. Son necesarios conocimientos mínimos de redes y ganas de probar cosas.

Este tutorial es válido para otras distribuciones, en líneas generales, y se asume que se tiene una Raspberry Pi montada y operativa.

Parte 1 – Montando el servidor

Empecemos, en primer lugar, instalando el paquete con sus respectivas dependencias:

sudo apt-get update
sudo apt-get install openvpn

Una vez instalado:

cp –r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa

Editamos el archivo vars, con cualquier editor de texto (vim, nano, etc):

vim /etc/openvpn/easy-rsa/vars

Dejamos la siguiente linea así:

export KEY_SIZE=2048

Y establecemos al final del archivo los valores adecuados para los siguientes parámetros:

jv0

Ahora tenemos que generar los certificados una vez dentro del directorio easy-rsa:

source ./vars
./clean-all
./build-ca

Esto puede tardar un rato. Cuanto más alto se establezca el valor del export KEY_SIZE mayor será el tiempo que tarde en generarlo. Una vez generado el certificado, pulsamos enter según nos vaya preguntando, hasta que vuelva a aparecer el prompt.

Generamos el certificado del server:

./build-key-server saw

Pulsamos enter hasta que nos pregunte si deseamos firmar el certificado, después aceptamos 2 veces con Y.

jv1

Ahora generamos el certificado del cliente:

./build-key

Pulsamos enter hasta que nos vuelta a preguntar dos veces si queremos firmar el certificado como el paso anterior y ya tenemos certificado cliente.

Generamos la clave HMAC con el siguiente comando:

openvpn --genkey --secret ta.key
cp ta.key keys
cp -r easy-rsa/keys/ .

Una vez hecho esto, debemos modificar la configuración de la VPN para poner el servidor en funcionamiento:

vim /etc/openvpn/server.conf

Dejamos el archivo como el que aparece a continuación:

Captura de pantalla de 2015-09-28 10-02-30

Habilitamos el bit de forwarding, descomentando esta línea para que funcione entre reinicios:

echo 1 > /proc/sys/net/ipv4/ip_forward

Eliminamos el # de la línea #net.ipv4.ip_forward=1 en el siguiente fichero:

vim /etc/sysctl.conf

Cargamos el módulo tun:

modprobe tun

Tras esto, habilitamos el servicio y lo arrancamos:

/etc/init.d/openvpn start

Añadimos la siguiente linea para el firewall:

iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s "192.168.88.0/24" -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s "192.168.88.0/24" -j MASQUERADE

Finalmente, solo guardar estas reglas para que funcionen tras un reinicio:

iptables-save

Parte 2 – Conectando el cliente

Ahora tenemos que configurar el cliente. Esto puede variar según el sistema operativo utilizado: Linux, Mac OSX, iOS, Android y si quieres, también en Windows.

En este caso vamos a configurarlo utilizando Linux. En concreto usando network-manager. El paquete a instalar puede variar entre distribuciones. En mi caso es:

openvpn
network-manager
networkmanager-openvpn

Necesitaremos para ello los siguientes certificados del servidor VPN:

  • ca.crt
  • lector1.crt
  • lector1.key
  • ta.key

La configuración es relativamente simple, abrimos el gestor y lo dejamos como aparece en la captura:

 

jv2

 

En pasarela, se debe poner por supuesto el dominio o IP correcto que necesitemos.

Seleccionamos opciones avanzadas y en la pestaña de general, revisamos que el puerto sea el correcto (1194), activamos las pestañas LZO y TCP (si no lo están). Añadimos en la pestaña autenticación TLS la clave ta.key y seleccionamos la dirección 1. Por último seleccionamos seguridad y cambiamos el campo cifrado a AES-256-CBC.

Y con esto ya estaría todo configurado y podríamos conectarnos en las redes públicas sin peligro de ser espiados (por la gente que está en esa red claro ;) ).

Comments

  1. Buenas tardes, me parece fantástico este articulo, la verdad que me ha venido como anillo al dedo, ya que llevaba tiempo queriendo montar mi propio servidor VPN. He seguido todos los pasos y la verdad que el servicio OpenVPN funciona genial, lo he probado con un móvil y desde otro ordenador conectado a otra red y se conecta super rápido. El problema que tengo es que ni el movil ni el otro pc, salen a internet a través de la VPN, se queda el navegador cargando y no llega a mostrar ninguna página, por otra parte el adaptar de red que me crea OpenVPN en Windows aparece como “sin conexión a Internet” :(

    El OpenVPN lo tengo desplegado en la maquina con IP 192.168.1.100, mascara 255.255.255.0, gateway 192.168.1.1 y los DNS de Google, con el correspondiente puerto 1194 UDP abierto en el router.

    La configuración del servidor OpenVPN es la siguiente: Net IP assigns: 10.8.0.0 mascara 25.255.255.0, device en tun0, y la configuracion adicional:
    push “route 192.168.1.0 255.255.255.0”
    push “dhcp-option DNS 8.8.8.8”
    push “redirect-gateway tun0 bypass-dhcp”

    La red que se crea el ordenador cliente es la siguiente (lo único que sin salida a internet): Direccion IPv4 10.8.0.6, mascara de subred 255.255.255.252, DHCP v4 10.8.0.1 servidor DNS 10.8.0.1

    Para que se puede establecer conexión tengo que tener “iptables” parado, ya que si lo inicio, ni el movil ni el pc se pueden conectar a la VPN

    Ya intenté meter la configuración iptables que se muestra en el articulo y tampoco me funciona.

    ¿Es necesario tener iptables habilitado para que funcione la VPN o solo es por seguridad?

    ¿Como puedo redireccionar el trafico para que la IP 10.8.0.6 del cliente tenga acceso a internet?

    Un saludo, muchísimas gracias, la verdad es que ya estoy sin ideas.

  2. Buen artículo

  3. Hola PedroV,

    es un poco dificil saber el problema sin hacer pruebas, iptables es necesario mas allá de la seguridad; lo suyo sería que borraras todas las reglas que hayas puesto y que pruebes con las del post adaptandolas a tus redes e interfaces.

    Prueba también que el bit de ip_forwarding este habilitado.

    Siento no poder ayudarte mucho más, pero es complciado desde aquí.

    Un saludo.

  4. Hola de nuevo, muchas gracias javier v por tu respuesta, he seguido intentado hacer de todo sin resultado positivo, así tengo la configuración actualmente, lo del ip_forwarding lo tengo así:

    # Controls IP packet forwarding
    net.ipv4.ip_forward = 1

    Las interfaces que tengo al arrancar OpenVPN en CentOS 6 son las siguientes:

    eth1: inet addr:192.168.1.80 Bcast:192.168.1.255 Mask:255.255.255.0
    tun0: inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255

    Ejecuto los siguientes comandos para configurar iptables:

    iptables -A FORWARD -m state –state RELATED,ESTABLISHED -j ACCEPT
    iptables -A FORWARD -s “10.8.0.0/24” -j ACCEPT
    iptables -A FORWARD -j REJECT
    iptables -t nat -A POSTROUTING -s “10.8.0.0/24” -j MASQUERADE
    service iptables save

    Asi me queda iptables:

    Chain INPUT (policy ACCEPT)
    target prot opt source destination
    ACCEPT all — anywhere anywhere state RELATED,ESTABLISHED
    ACCEPT icmp — anywhere anywhere
    ACCEPT all — anywhere anywhere
    ACCEPT tcp — anywhere anywhere state NEW tcp dpt:ssh
    REJECT all — anywhere anywhere reject-with icmp-host-prohibited
    Chain FORWARD (policy ACCEPT)
    target prot opt source destination
    REJECT all — anywhere anywhere reject-with icmp-host-prohibited
    ACCEPT all — anywhere anywhere state RELATED,ESTABLISHED
    ACCEPT all — 10.8.0.0/24 anywhere
    REJECT all — anywhere anywhere reject-with icmp-port-unreachable
    Chain OUTPUT (policy ACCEPT)
    target prot opt source destination

    Si activo iptables el cliente OpenVPN se desconecta, y si paro iptables el cliente se conecta, pero sin conexión a internet.

    Muchisimas gracias por vuestr ayuda, un saludo.