VPN: Conectar a casa remotamente, usando Raspberry

FacebooktwitterinstagramFacebooktwitterinstagram

¿Para que podemos necesitar una VPN? – En muchas ocasiones nos encontramos lejos de casa (este post también puede ser válido para una pequeña oficina) y necesitamos algo que tenemos en nuestro NAS o bien conectarnos a nuestros PCs para dejar descargándose alguna cosa en torrent. También cabe la posibilidad que estemos en terreno «hostil», que es como suelo denominar cualquier cosa que no sea mi propia red y especialmente todos los accesos WIFI gratis y/o posiblemente monitorizados.

Si no queremos utilizar servicios gratuitos de conexión remota (¿alguien sabe de donde sacan dinero estos buenos samaritanos?) y tampoco queremos exponer nuestra red interna mediante la apertura de puertos en nuestro router, una solución de bajo coste (40€) puede ser la implantación de un acceso VPN mediante el uso de una Raspberry PI. Las instrucciones son válidas para cualquier otra distribución de linux que tengamos en casa, aunque variarán los comandos de instalación y es posible que también alguna ruta.

Al lío…

La foto final (mas o menos) de lo que queremos montar es la siguiente:

Esquema suuuuuper currado de acceso VPN

 

Para ello, deberemos instalar en nuestra Raspberry la distribución Raspbian Jesse Lite. Esta distribución ocupa apenas 300mb y traerá consigo lo mínimo para montar un sistema base. Es recomendable que un sistema que va a dar acceso a toda nuestra red, lo mantengamos bien limpio, aunque si quieres usar otra distribución «allá tu y tu pelo».

Una vez instalada la distribución, debemos instalar OpenVPN mediante el comando:

$ sudo apt-get install open-vpn

Esto instalará además cualquier otro software necesario, es decir, las dependencias de OpenVPN con otros paquetes como SSL, por ejemplo. Para no usar sudo en cada comando, podemos ejecutar lo siguiente para obtener una shell de root:

$ sudo -s

En la mayoría de comandos he mantenido el prompt con la ruta en la que estoy ejecutando el comando. Tenlo en cuenta si vas a usar copy/paste. En otros comandos, he incluido anotaciones o aclaraciones usando el carácter «#», por lo que puedes copiarlos y pegarlos sin problemas porque no se ejecutarán esos comentarios.

Crear certificados de OpenVPN (las cerraduras y las llaves)

OpenVPN lleva consigo una serie de scripts (guiones de texto con los que podemos lanzar varios comandos de forma secuencial y automática) que facilita mucho la tarea de creación y el mantenimiento de los certificados que serán algo así como las «llaves» y al mismo tiempo la «cerradura» de acceso a nuestra red.

Vamos a copiar al directorio /etc/openvpn el directorio que contiene dichos scripts:

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

Una vez hecho esto, vayamos al recién creado directorio /etc/openvpn/easy-rsa para proceder:

# cd /etc/openvpn/easy-rsa

Lo primero que tenemos que hacer es que nuestro entorno tenga correctamente asignadas las variables. Si esto te ha sonado a chino del sur de Beijing, tranquilo, que tampoco es necesario entenderlo. Es como cuando el mecánico te cuenta lo de la junta del cigüeñal.

Para hacer esto, debemos ejecutar lo siguiente:

root@localhost:/etc/openvpn/easy-rsa# source ./vars
root@localhost:/etc/openvpn/easy-rsa# ./clean-all

El primer comando carga las variables y con el segundo nos aseguramos que no hay ninguna clave antigua, de ejemplo o similar.

Ahora llega el primer momento interesante: Vamos a crear la CA!! (Pronunciesé imitando a Fernando Fernán-Gomez, o pierde mucho fuelle). La CA, Certification Authority será la firma que avalará que todas las llaves que se entreguen a los clientes y al servidor vienen de nosotros y no podrán ser alteradas.

root@localhost:/etc/openvpn/easy-rsa# ./build-ca RedInterna
Generating a 1024 bit RSA private key
............++++++
....................................++++++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----

Ahora nos pedirá una serie de información que identifica nuestro certificado servidor para con nuestros clientes usuarios. Puedes dejar la información por defecto y no es relevante su cambio para la finalidad de una VPN casera, pero si quieres dejarlo bonito y hacer las cosas bien, no cuesta más de 10 segundos:

Country Name (2 letter code) [US]:ES
State or Province Name (full name) [CA]:Madrid
Locality Name (eg, city) [SanFrancisco]:Madrid
Organization Name (eg, company) [Fort-Funston]:Asociación de amigos de la VPN
Organizational Unit Name (eg, section) [changeme]:Departamento de Informática
Common Name (eg, your name or your server's hostname) [changeme]:aduana  
Name [changeme]:CA-aduana
Email Address [mail@host.domain]:aduana@jesusdml.es

 

Creando el certificado del servidor

Tenemos la CA creada y ahora vamos a crear el certificado/clave del servidor se usará dicha CA para firmarlo y darle así veracidad.

root@localhost:/etc/openvpn/easy-rsa# ./build-key-server aduana.jesusdml.es
Generating a 1024 bit RSA private key
...........................++++++
.................++++++
writing new private key to 'aduana.jesusdml.es.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----

Como vamos a dejarlo bonito, al igual que con la CA, alteraré los ejemplos:

Country Name (2 letter code) [US]:ES
State or Province Name (full name) [CA]:Madrid
Locality Name (eg, city) [SanFrancisco]:Madrid
Organization Name (eg, company) [Fort-Funston]:Asociación de amigos de la VPN
Organizational Unit Name (eg, section) [changeme]:Departamento de Informática
Common Name (eg, your name or your server's hostname) [aduana.jesusdml.es]:
Name [changeme]:Server-aduana
Email Address [mail@host.domain]:aduana@jesusdml.es

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: (Pulsar Intro(1))
An optional company name []:(Pulsar Intro(2))
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'ES'
stateOrProvinceName   :PRINTABLE:'Madrid'
localityName          :PRINTABLE:'Madrid'
organizationName      :T61STRING:'Asociaci\0xC3\0xB3n de amigos de la VPN'
organizationalUnitName:T61STRING:'Departamento de Inform\0xC3\0xA1tica'
commonName            :PRINTABLE:'aduana.jesusdml.es'
name                  :PRINTABLE:'Server-aduana'
emailAddress          :IA5STRING:'aduana@jesusdml.es'
Certificate is to be certified until Mar 29 15:14:56 2026 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Ya hemos creado y firmado el certificado del servidor. Tal y como se puede leer en el punto (1), es posible asignar una contraseña que se nos solicitaría en el arranque del servicio. Dado el carácter «hogareño, casero, pequeño, peludo, suave; tan blando por fuera, que se diría todo de algodón, que no lleva huesos.» de este artículo, lo vamos a dejar tal cual (living la vida loca). Así mismo, tampoco necesitaremos indicarle un nombre secundario de empresa (2). En ambos casos, pulsaremos intro para continuar.

Para comprobar que tanto la CA como el servidor tienen sus certificados correctamente creados, podemos ir al directorio keys y ejecutar ls. Algunos de estos ficheros son de la «parte CA» y otros del propio servidor:

root@localhost:/etc/openvpn/easy-rsa/keys# ls -1
01.pem #Listado de certificados dados por la CA y numerados en index.txt
aduana.jesusdml.es.crt # Certificado del servidor formato pem.
aduana.jesusdml.es.csr # Requerimiento de certificado usado por el script.
aduana.jesusdml.es.key # Clave privada del servidor.
ca.crt # Certificado de la CA.
ca.key # Clave privada de la CA.
index.txt # Listado de claves creadas por la CA.
index.txt.attr # Atributos de los certificados creados por la CA.
index.txt.old # Backup del anterior.
serial # Número de serie a usar por la CA para el siguiente certificado.
serial.old # Backup del anterior.

Otras claves de servidor

Lo siguiente, será crear la clave DH (Diffe-Hellman) a usar por el servidor. No es necesaria la introducción de ningún dato. Esta clave se debe generar en cada servidor VPN. Su creación tarda un par de minutos en nuestra Raspberry:

root@localhost:/etc/openvpn/easy-rsa# ./build-dh 
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
......................+......................+....(y más puntitos, cruces y algún asterisco)

Si todo sale bien, se habrá añadido el fichero dh1024.pem en nuestro directorio keys.

Además, podemos crear un nivel extra de seguridad mediante el uso de HMAC. Este protocolo firmará los paquetes iniciales de la conexión para evitar que nuestro servidor atienda peticiones de cualquiera que pueda estar haciendo un escaneo de puertos o un ataque de fuerza bruta. Si los paquetes de conexión no están firmados por esta clave, el servidor no hará caso de los mismos. El siguiente comando creará esta clave y la depositará en /etc/openvpn/easy-rsa/keys:

root@localhost:/etc/openvpn/easy-rsa/keys# openvpn --genkey --secret ta.key

Darle una llave a los usuarios/clientes

Una vez creadas la CA y el certificado del servidor, vamos a crear las llaves de los clientes que también serán certificados. Es importante que tengamos claro el uso que vamos a dar de estas llaves. Los dispositivos en las que las instalemos se pueden perder y por ello es importante que tengamos en consideración su mantenimiento.

Por ejemplo, si vamos a usar nuestra VPN en nuestro portátil, tablet y teléfono, recomiendo crear un certificado independiente ya que en el caso de pérdida, podemos revocar el del elemento perdido sin afectar el acceso con los otros. Así mismo, si varias personas van a acceder a la VPN, mejor crear un certificado de cliente para cada uno. Como también los vamos a dejar bonitos, deberíamos de ser coherentes con los parámetros dados en la CA y el servidor:

root@localhost:/etc/openvpn/easy-rsa# ./build-key Jesusdml-Movil
Generating a 1024 bit RSA private key
..........................++++++
.......++++++
writing new private key to 'Jesusdml-Movil.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [US]:ES
State or Province Name (full name) [CA]:Madrid
Locality Name (eg, city) [SanFrancisco]:Madrid
Organization Name (eg, company) [Fort-Funston]:Asociación de amigos de la VPN
Organizational Unit Name (eg, section) [changeme]:Dirección Gneral. de la cocina
Common Name (eg, your name or your server's hostname) [Jesusdml-Movil]:
Name [changeme]:Jesus D.
Email Address [mail@host.domain]:jd@jesusdml.es

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: (Pulsar intro(1))
An optional company name []:(Pulsar Intro(2))
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'ES'
stateOrProvinceName   :PRINTABLE:'Madrid'
localityName          :PRINTABLE:'Madrid'
organizationName      :T61STRING:'Asociaci\0xC3\0xB3n de amigos de la VPN'
organizationalUnitName:T61STRING:'Direcci\0xC3\0xB3n Gneral. de la cocina'
commonName            :PRINTABLE:'Jesusdml-Movil'
name                  :PRINTABLE:'Jesus D.'
emailAddress          :IA5STRING:'jd@jesusdml.es'
Certificate is to be certified until Mar 29 15:58:26 2026 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Una vez creado el primer usuario, el resto debería tener la misma secuencia. Tan sólo, cambiará el CN, en este caso Jesusdml-Movil, de los otros certificados creados.

WARNING, be careful with pickpockets : Al igual que en la creación del servidor, podremos asignar una contraseña (1) al certificado. Ojo con esto, que si no le pones contraseña estarás conectando a tu red a cualquiera que se haga con una copia de ese certificado.

Después de la creación del certificado de usuario, se habrán agregado cuatro nuevos ficheros al directorio keys:

02.pem
Jesusdml-Movil.crt
Jesusdml-Movil.csr
Jesusdml-Movil.key

Así mismo, si viste el interior de los ficheros index.txt y serial, su contenido también ha variado para incluir el nuevo certificado e incrementando en 1 el número que ya había, respectivamente.

Configurando el Servidor

Hasta ahora hemos visto la creación de las claves necesarias para que se identifiquen entre sí el servidor y los usuarios, todos ellos bendecidos por la CA. Ahora toca la parte quizá más complicada, pero tampoco mucho, de la VPN: El servidor.

Antes de empezar, dado que tenemos todas las claves en /etc/openvpn/easy-rsa/keys es recomendable que hagamos un link a /etc/openvpn/keys para que se acorten las líneas del ejemplo de fichero de configuración y no se me descuadre la maquetación del blog, o por que así queda más bonito. Esto lo haremos con el siguiente comando:

root@localhost:/etc/openvpn# ln -s /etc/openvpn/easy-rsa/keys/ /etc/openvpn/keys

Para configurar el servidor, debemos crear un fichero de texto y denominarlo my-vpn.conf en el directorio /etc/openvpn.conf. Esto lo podemos hacer con vim o cualquier otro editor de texto. En cualquier caso, el contenido deberá ser el siguiente (recomiendo quitarle los comentarios explicativos precedidos por «#»):

port 443# Puerto por el que conectará la VPN (1). Por defecto 1194.
proto tcp # Protocolo usado por la VPN (1). Por defecto udp
dev tun # Usaremos un dispositivo tipo túnel.(2)
ca /etc/openvpn/keys/ca.crt # Certificado de la CA
cert /etc/openvpn/keys/server.crt # Certificado del servidor
key /etc/openvpn/keys/server.key  # Clave del servidor
dh /etc/openvpn/keys/dh1024.pem # Clave DH
server 192.168.230.0 255.255.255.0 # Red virtual que se creará para "el otro lado"(3)
ifconfig-pool-persist ipp.txt # Fichero en el servidor pondrá las direcciones IP de los usuarios.

# Así mismo, también podemos añadir (o no) algunas opciones para los clientes
push "dhcp-option DOMAIN local" # Cambia el dominio DNS de los usuarios conectados
push "dhcp-option SEARCH local" # Cambia el dominio de búsqueda DNS de los usuarios conectados
push "dhcp-option DNS 8.8.8.8" # Cambia el servidor de DNS que usarán los usuarios
push “route 192.168.x.0 255.255.255.0” # Indica al dispositivo del usuario las redes que están "dentro" de la VPN. Cambia la red por la que tengas en el interior de casa o de tu oficina.
push "redirect-gateway" # Le decimos que "todo" el tráfico salga por la VPN.(4)

keepalive 10 120 # Indica cada cuanto tiempo se envían paquetes de mantenimiento de conexión.
tls-auth /etc/openvpn/keys/ta.key 0 # Ruta del fichero de firma TSL/auth
comp-lzo # Indica el uso de la compresión de tráfico. Muy útil para usuarios remotos con conexiones 3G/4G
user openvpn # Usuario usado por el servidor
group openvpn # Usuario usado por el servidor
status /var/log/openvpn-status.log # Fichero para el registro de estado del servidor.
log-append /var/log/openvpn.log # Fichero de registros de eventos del servidor.
verb 4 # Nivel de información en el log. Va del 1 al 11. Si hay problemas, probar con números superiores. 
mute 20 # Indica que después de 20 eventos iguales, no se almacenarán en el fichero.

El fichero se puede copiar/pegar tal cuál ya que todo el texto que va precedido del símbolo # hasta el final de la línea, se considerará como comentario y el servidor OpenVPN no lo leerá. Bien, ahora las aclaraciones a los «numeritos»:

(1) Por defecto el puerto de VPN es el 1194. Cambiándolo por el uso del 443 y del protocolo tcp en vez de el udp, podremos usar nuestra VPN en muchos sitios que restringen el uso de VPNs al simular el uso del HTTPS que usa esos puertos.

(2) OpenVPN puede crear dispositivos tun y tap. Los dispositivos tun crean una red paralela a la existente que conecta al cliente con el servidor manteniéndose separadas del resto de redes que pudiera haber en ambos extremos. Los dispositivos tap suelen usarse para unir de forma virtual varios puntos como si se tratasen de la misma red y puede transportar cualquier protocolo (tun únicamente soporta IP). Si quieres más información sobre esto, puedes seguir este enlace.

(3) Este direccionamiento, denominado habitualmente «Dominio de encriptación», se mantendrá entre las partes que estén dentro de la VPN para comunicarse y enrutarse entre ellas. Es importante que no se repita en otras partes de la red. Por ejemplo, casi todos tenemos en casa la red 192.168.1.0/24 o 192.168.0.0/24, por lo que deberíamos escoger cualquier otro direccionamiento, tal y como he puesto en el ejemplo.

(4) En el caso de que dejemos esta directiva como tal, la VPN se pondrá como ruta por defecto, es decir, que irá por allí todo el tráfico de Internet y de otras redes a las que puedan acceder desde donde se conecten los clientes/usuarios de la VPN. En caso que que queramos seguir saliendo a Internet sin pasar por la VPN, deberemos añadir el carácter # delante de la línea o bien eliminarla.

Configuración de red del servidor

Para que el servidor pueda enviar tráfico entre los usuarios de la VPN y los equipos que tengamos dentro de la red interna, es necesario activar ese reenvío. Deberemos hacer lo siguiente:

  1. Abrir el fichero /etc/sysctl.conf con vim.
  2. Buscar la línea
    • #net.ipv4.ip_forward=1
  3. Eliminar la almohadilla del principio dejando la línea de esta forma:
    • net.ipv4.ip_forward=1
  4. Salvar el fichero y cargar los cambios con el comando:
    # sysctl -p

Ahora es el turno de que los usuarios de VPN sean «enmascarados» por el servidor de VPN. Para ello debemos ejecutar el comando:

# iptables -t nat -A POSTROUTING -s 192.168.230.0/24 -o eth0 -j MASQUERADE

Recuerda que la red 192.168.230.0/24 es la que está en el fichero de configuración de ejemplo que puse más arriba, por lo que si pusiste otra, deberás cambiarlo. Por otra parte, eth0 es el interface de red con el que Raspbian nombra el interface que va conectado al cable. Si quieres «sacar» a los usuarios a redes que están conectadas vía WiFi, deberás usar wlan0.

Para hacer permanentes los cambios, podemos ejecutar los siguientes comandos:

iptables-save > /etc/network/iptables
# echo "pre-up iptables-restore < /etc/network/iptables" >> /etc/network/interfaces

Bien, ya no queda nada por explicar? alguna duda? Continuemos para bingo, que queda poco 🙂

Configurando los clientes de VPN

Ya que tenemos el servidor configurado y todo preparado, podemos comenzar a configurar los clientes. Para el caso, vamos a configurar un usuario en Linux, iPhone y Mac. Si usas otros sistemas, podéis utilizar software para Windows, Linux y Android, todos con su cliente OpenVPN pero con el mismo espíritu. Lo importante es que tengamos claro los ficheros que vamos a necesitar. Voy a usar los nombres que he usado en el artículo, por lo que si los habéis cambiado, adaptadlos:

  • ca.crt
  • Jesusdml-Movil.crt
  • Jesusdml-Movil.key
  • ta.key (hay que transmitirlo por un medio seguro. No lo enviéis por correo a los usuarios (o si, como queráis))

Además de los ficheros, necesitaremos un fichero de configuración (OMG, otro!!) que deberá tener el siguiente contenido (en consonancia con el del ejemplo que ponía para el servidor. Adaptadlo si lo habéis cambiado). Esta configuración está pensada en Linux, OSX y iPhone, pero he dejado comentada con el carácter «;» las líneas dedicadas a otros sistemas:

client # Indicamos que somos un cliente
dev tun # Deberemos usar el mismo tipo de dispositivo que el servidor
;dev-node MyTap # En sistemas Windows, indicar el dispositivo.
proto tcp # Mantener igual que en la configuración del servidor. 
remote aduana.jesusdml.es 443 # Nombre y puerto del servidor VPN. Recomiendo usar dnsexit o similar en caso de tener una IP dinámica.

;remote-random # En caso de haber puesto varios servidores de VPN.

resolv-retry infinite # Intentará resolver el nombre del servidor contínuamente.

nobind # Dejar que el puerto local sea asignado automáticamente.

;user nobody # En Linux deberemos descomentarlo (eliminar ";")
;group nobody # En Linuz deberemos descomentarlo.

persist-key # Mantener las claves intercambiadas hasta que desconectemos.
persist-tun # Mantener el túnel aunque se desconecte.

;http-proxy-retry # En el caso de conectarnos vía proxy, si debemos reintentar la conexión aunque nos desconecte.
;http-proxy [proxy server] [proxy port #] # Indicar servidor puerto del proxy

;mute-replay-warnings # En redes WiFi suelen darse paquetes duplicados. Con esto, se evitará registrar dichos paquetes. Activarlo en WiFi/3G/4G

# Indicar la ruta de los certificados propios, la CA y el fichero de autenticación TLS/Auth.
ca ca.crt
cert Jesusdml-Movil.crt
key Jesusdml-Movil.key
tls-auth ta.key 1

comp-lzo # Habilita el uso de comprensión.


verb 3 # Activa el nivel de log en 3.

Esta configuración básica, es la que vamos a utilizar en los siguientes clientes:

Linux IPhone OSX/MAC

Open VPN Connect iOS

OpenVPN Client

Open VPN Connect iOS

OpenVPN Connect

Tunnelblick, Open VPN OSX MAC Apple

Tunnelblick

 

Linux: OpenVPN Client

La instalación y configuración en Linux es más sencilla de lo que parece. Lo primero es instalar OpenVPN con apt-get, yum o lo que tengamos en la distribución:

# apt-get install openvpn openssl

Moveremos a un directorio seguro o, por defecto a /etc/openvpn el fichero de configuración de cliente llamándolo cliente.ovpn y los certificados al directorio /etc/openvpn/keys. Hay que editar en el fichero de configuración la ruta de los ficheros de certificados para que cuadren con el directorio. Por ejemplo:

...
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/Jesusdml-Movil.crt
key /etc/openvpn/keys/Jesusdml-Movil.key
tls-auth /etc/openvpn/keys/ta.key 1
...

Una vez hecho esto, ejecutaremos el cliente de openvpn (como root):

# openvpn --config cliente.ovpn
Thu Mar 31 21:45:08 2016 OpenVPN 2.2.1 arm-linux-gnueabihf [SSL] [LZO2] [EPOLL] [PKCS11] [eurephia] [MH] [PF_INET6] [IPv6 payload 20110424-2 (2.2RC2)] built on Dec  1 2014
Thu Mar 31 21:45:08 2016 NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables
Thu Mar 31 21:45:08 2016 Control Channel Authentication: using '/etc/openvpn/keys/ta.key' as a OpenVPN static key file
Thu Mar 31 21:45:08 2016 Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Thu Mar 31 21:45:08 2016 Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Thu Mar 31 21:45:08 2016 LZO compression initialized
Thu Mar 31 21:45:08 2016 Control Channel MTU parms [ L:1544 D:168 EF:68 EB:0 ET:0 EL:0 ]
Thu Mar 31 21:45:08 2016 Socket Buffers: R=[87380->131072] S=[16384->131072]
Thu Mar 31 21:45:08 2016 Data Channel MTU parms [ L:1544 D:1450 EF:44 EB:135 ET:0 EL:0 AF:3/1 ]
Thu Mar 31 21:45:08 2016 Local Options hash (VER=V4): 'ee93348a’
Thu Mar 31 21:45:08 2016 Expected Remote Options hash (VER=V4): ‘gh555lp1'
Thu Mar 31 21:45:08 2016 Attempting to establish TCP connection with [AF_INET]aduana.jesusdml.es:443 [nonblock]
Thu Mar 31 21:45:09 2016 TCP connection established with [AF_INET]aduana.jesusdml.es:443
Thu Mar 31 21:45:09 2016 TCPv4_CLIENT link local: [undef]
Thu Mar 31 21:45:09 2016 TCPv4_CLIENT link remote: [AF_INET]aduana.jesusdml.es:443
Thu Mar 31 21:45:09 2016 TLS: Initial packet from [AF_INET]aduana.jesusdml.es:443, sid=74999111 gh555lp1
Thu Mar 31 21:45:09 2016 VERIFY OK: depth=1, /C=ES/ST=Madrid/L=Madrid/O=Asociación de amigos de la VPN/OU=Departamento de Informática/CN=aduana.jesusdml.es/name=Server-aduana/emailAddress=aduana@jesusdml.es
Thu Mar 31 21:45:09 2016 VERIFY OK: depth=0, /C=ES/ST=Madrid/L=Madrid/O=Asociación de amigos de la VPN/OU=Dirección Gneral. de la cocina/CN=Jesusdml-Movil/name=Jesus D./emailAddress=jd@jesusdml.es
Thu Mar 31 21:45:09 2016 Data Channel Encrypt: Cipher 'BF-CBC' initialized with 128 bit key
Thu Mar 31 21:45:09 2016 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Thu Mar 31 21:45:09 2016 Data Channel Decrypt: Cipher 'BF-CBC' initialized with 128 bit key
Thu Mar 31 21:45:09 2016 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Thu Mar 31 21:45:09 2016 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA
Thu Mar 31 21:45:09 2016 [raspi.local] Peer Connection Initiated with [AF_INET]192.168.x.x:443
Thu Mar 31 21:45:11 2016 SENT CONTROL [raspi.local]: 'PUSH_REQUEST' (status=1)
Thu Mar 31 21:45:11 2016 PUSH: Received control message: 'PUSH_REPLY,dhcp-option DOMAIN local,dhcp-option SEARCH local,dhcp-option DNS 8.8.8.8,route 192.168.x.0 255.255.255.0,redirect-gateway,route 192.168.230.1,topology net30,ping 10,ping-restart 120,ifconfig 192.168.230.2 192.168.230.1’
Thu Mar 31 21:45:11 2016 Options error: Unrecognized option or missing parameter(s) in [PUSH-OPTIONS]:11: .69.9 (2.2.1)
Thu Mar 31 21:45:11 2016 OPTIONS IMPORT: timers and/or timeouts modified
Thu Mar 31 21:45:11 2016 OPTIONS IMPORT: --ifconfig/up options modified
Thu Mar 31 21:45:11 2016 OPTIONS IMPORT: route options modified
Thu Mar 31 21:45:11 2016 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
Thu Mar 31 21:45:11 2016 ROUTE default_gateway= 192.168.x.1
Thu Mar 31 21:45:11 2016 TUN/TAP device tun0 opened
Thu Mar 31 21:45:11 2016 TUN/TAP TX queue length set to 100
Thu Mar 31 21:45:11 2016 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Thu Mar 31 21:45:11 2016 /sbin/ifconfig tun0 192.168.230.2 pointopoint 192.168.230.1 mtu 1500
Thu Mar 31 21:45:11 2016 /sbin/route add -net 192.168.x.x netmask 255.255.255.255 gw 192.168.x.1
Thu Mar 31 21:45:11 2016 /sbin/route del -net 0.0.0.0 netmask 0.0.0.0
Thu Mar 31 21:45:11 2016 /sbin/route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.230.1
Thu Mar 31 21:45:11 2016 /sbin/route add -net 192.168.x.0 netmask 255.255.255.0 gw 192.168.230.1

Si todo se ha configurado e instalado bien, ya deberías estar conectado a tu flamante VPN en Linux!

iPhone: VPN Connect

El software de iPhone es (todavía) más sencillo de configurar. Debemos instalar el software desde la AppStore y una vez hecho esto, abrimos iTunes con el iPhone/iPad conectado.

En aplicaciones de iPhone, en la parte derecha, bajamos hasta ver las aplicaciones con Archivos Compartidos:

VPN IOS TunnelBlick

Seleccionamos «OpenVPN» y en la parte inferior pulsamos sobre «Añadir», seleccionando posteriormente los siguientes ficheros:

  • ca.crt
  • Jesusdml-Movil.crt
  • Jesusdml-Movil.key
  • ta.key
  • openvpn.ovpn

Después sincronizamos el iPhone/iPad y en la aplicación de OpenVPN, ya nos aparecerá la nueva configuración. Tan solo debemos activarla con el botón de desplazamiento y voilá! 😀

Movil iPhone iPad VPN 2 Movil iPhone iPad VPN

OSX: Tunnelblick

La instalación en OSX es realmente sencilla usando Tunnelblick. Una vez instalado el software, debemos crear un directorio que contenga los siguientes ficheros:

  • ca.crt
  • Jesusdml-Movil.crt
  • Jesusdml-Movil.key
  • ta.key
  • openvpn.ovpn

El nombre del directorio puede ser cualquier, pero hay que terminarlo con la extensión .tblk. En el fichero de configuración, debemos quitar los directorios de ruta a los certificados, CA y demás. Por ejemplo:

...
ca ca.crt
cert Jesusdml-Movil.crt
key Jesusdml-Movil.key
tls-auth ta.key 1
...

Una vez hecho esto, hacemos doble-click sobre el nuevo directorio creado, que se habrá transformado en un fichero .tblk y el programa importará automáticamente la configuración. Para activar la VPN habrá que ir al nuevo icono con forma de túnel de la barra superior y seleccionar «Conectar… «Nombre de la VPN»».

Si todo ha salido bien, veremos como salen las notificaciones de nuestra conexión a la VPN 😀

VPN OSX 2 VPN OSX 2

 

Bien, ya hemos llegado al final de este pequeño pero entretenido artículo, manual, o llámalo Perry Mason. Espero que te sea de utilidad y que no comas mucho antes del verano, que luego vienen las lamentaciones con los bikinis y bañadores. Advertido quedas.

Un Saludo.

Jesus D. Muñoz

Print Friendly, PDF & Email
FacebooktwitterredditlinkedinmailFacebooktwitterredditlinkedinmail
marzo 31, 2016

Etiquetas: , , , , , ,
  • Hola Jesus,

    Buen tutorial, solo me queda la duda sobre el tema de como tratar el ‘port forwarding’, no veo como el ruteador va a resolver las peticiones que lleguen de los clientes vpn

    • Hola, Jorge

      En realidad no es necesario porque de esto ya se encarga la raspberry (ver linea iptables -t nat -A POSTROUTING -s 192.168.230.0/24 -o eth0 -j MASQUERADE)

      Al router le llega como cualquier tráfico que le llegue desde la raspberry.

      Saludos,

  • Hola Jesús,
    Simplemente agradecerte la creación del documento pues me ha servido para aclarar conceptos y ver el proceso de configuración de una VPN desde Linux. No lo he probado todavía pero me siento mucho más capaz de realizarlo después de leer tu informe.

    Siento que Manuel haya tenido dificultades, pero yo creo que es más debido a su inexperiencia (como él mismo explica) que a lo acertado o no de tu trabajo. Te animo a que sigas haciendo este tipo de aportaciones pues son muy educativas y ayudan a los demás. Animo a Manuel a que tenga paciencia y que poco a poco vaya profundizando en el conocimiento de Linux. Seguro que con el tiempo encontrará más interesante tu documento. Es cierto que para algunos usuarios el conocimiento de algunos sistemas operativos tiene mucha dificultad. A los que nos gusta saber como funcionan las cosas, superar esas dificultades es muy instructivo y en eso Linux ayuda mucho.

    Un saludo

    Armando

    • Hola Armando. A veces la cosa se complica por las diferencias que hay a la hora de hacer lo mismo entre diferentes distribuciones. Estoy preparando un artículo para monitorizar sistemas con Kibana/elk/Logstash. Espero que me sirva para volver poco a poco con el blog, que últimamente no me da la vida, jejeje. saludos!

  • Hola,

    El mundo linux es precioso pero para gente inteligente y no los que somos normales(vamos torpes), lo ponéis todo muy fácil y no loes (creo yo) llevo dos días para crear un servidor en mi Raspberry Pi 3 y no paso de descargar el Raspbian que aconsejas, cuando decís se instala OPENVPN mi ubuntu conectado a la raspberry pi por SSH ni se entera siempre dice lo mismo «paquete no se encuentra» decis de cambiar de servidor al mejor cambio y nada no se encuentra, vamos para gente lista yo incapaz siquiera de instalar el jodido OPENVPN ni otros paquetes que ahora ni recuerdo ejemplo EASY-RSA(tengo la cabeza a punto de petar).
    Tienes algún manual que diga como extraer de donde sea estos programas.
    SALUDOS
    Tienes algun tutorial donde vengas los

    • Hola!
      Siento tu desánimo pero no creo que porque no te haya salido algo, seas menos inteligente. Linux y cualquier otro SO necesitan su tiempo cuanto estamos «trasteando» e instalando cosas que no vengan metidas en un asistente. Dicho esto, no se muy bien a que te refieres con ese error. Que comando ejecutas? Si quieres instalar open-vpn en la raspberry, necesitas ejecutar los comandos que pongo en el artículo tal y como aparecen y respetando las mayúsculas y minúsculas (en Linux una «A» y una «a» son dos caracteres diferentes). Antes de subir el artículo, probé paso a paso (y copiando/pegando) en una raspberry de prueba y me funcionó a la perfección, por lo que intuyo que puede ser algún problema de la versión/sabor de raspbian que estás usando o bien que el planteamiento es erróneo. En el caso que planteo, es la Raspberry la que sirve como servidor de VPN y hay que instalar todo allí (en realidad, los certificados y la ca los puedes generar en otro sitio, pero para no liar más la cuestión lo hice así). Si te parece bien, mándame una captura del error por si puedo hacer algo.

      Un saludo,

  • Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *