martes, 28 de febrero de 2012

Creación Vpn (OpenVpn) entre Ubuntu y movil con Android rooteado

A manera muy general una Vpn es una conexión segura que conecta a traves de internet dispositivos como si fuera una red local.

Para que usar una vpn:
*Transferencia de archivos, impresion remota de manera segura y encriptada.
*Navegacion segura en internet.
*Creación de una red de trabajo remotamente.
*Uso de un VNC para manejo remoto de escritorio

Este tutorial se enfoca en la configuración de un servidor openvpn bajo Ubuntu 10.04 y la conexión de un cliente movil con sistema operativo Android 2.3.5 (Samsung Galaxy Note) previamente rooteado.

La configuración del server no es de mi autoria, aunque agrego comentarios de solución en problemas que se me presentaron.
El cliente puede ser cualquier equipo que soporte Android 2.2 o superior rooteado.
Abrir el puerto 1194 de nuestro ruteador donde se instalará el Server.
Tener en cuenta la velocidad de transferencia de datos se ve limitada a nuestra conexión de banda ancha de subida.

Instalaciòn del server OpenVpn en Ubuntu:

OpenVPN es un Software que hace de cliente y servidor según como lo configuremos, aclaro que hay 2 versiones de este:
* OpenVPN Community Software: Es la versión que utilizaremos y es 100% Open Source
* OpenVPN Access Server: Es la versión de pago, puede usar gratis solo hasta 2 usuarios, los usuarios adicionales son muy económicos, además tiene extras como panel de administración web, es súper fácil de configurar y mas.

Instalamos OpenVPN y también OpenSSL, ya que la seguridad se basa en ssl.

En la terminal:
sudo apt-get -y install openvpn
sudo apt-get -y install openssl

Configuramos el Demonio de OpenVPN para que No Auto Inicie con el Sistema
comentamos todo agregando # al comienzo de cada linea.
sudo nano /etc/default/openvpn

tambien eliminar el script de inicio, para evitar que no inicie sin configurar
sudo update-rc.d -f /etc/init.d/openvpn remove

Ahora Creamos el Archivo openvpn.conf en /etc/openvpn/
sudo nano /etc/openvpn/server.conf

y colocamos esta configuración:
dev tun
proto tcp
port 1194
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/servidor.crt
key /etc/openvpn/keys/servidor.key
dh /etc/openvpn/keys/dh2048.pem
user nobody
group nogroup
server 10.6.0.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/clients.txt
status /etc/openvpn/status.txt
persist-key
persist-tun
push "redirect-gateway def1"
push "route 192.168.0.0 255.255.255.0"
keepalive 10 120
verb 3
comp-lzo
max-clients 2

si no quieren usar la vpn para internet seguro, osea, navegar sin usar internet desde la vpn, quitar la linea “redirect-gateway”. (recomiendo la navegación segura, no quitarla)

Otros datos que pueden modificar:

* ca, cert, key y dh = son la entidad, el certificados, la llave y la Diffie Hellman del servidor, mas adelante los crearemos.
* server 10.6.0.0 255.255.255.0 = es el rango de ip que usara la vpn, usen otro pero, no usar el mismo que la red real.
* ifconfig-pool-persist ipp.txt = guarda a quien se le asigno cada ip en la vpn
* proto y port = protocolo y puerto, se puede usar tcp y utp, en utp no me dio buenos resultados, el puerto pueden cambiarlo.
* duplicate-cn = permite que se use el mismo certificado y llave en varios clientes al mismo tiempo, recomiendo no activarlo.
* up /etc/openvpn/openvpn.up = es un script que carga openvpn al iniciar, se usa para el ROUTING y FORWARDING, mas adelante lo creamos.
* client-to-client = es para evitar que los usuario de la vpn se vean entre si, según el caso es útil.
* comp-lzo = compresión, comprime todo el trafico de la vpn.
* verb 3 = aumenta o disminuye los detalles de error en el server.
* max-clients 30 = cantidad máxima de usuarios conectados simultáneamente al servidor, se puede aumentar o disminuir.
* push route = permite ver o estar en la red detras del vpn server, ojo no activar client-to-client. segmento de nuestra red y mascara de red.
* push “redirect = obliga al cliente a usar la vpn como gateway
* server 10.6.0.0 255.255.255.0 Este es el segmento que se asiganará al cliente.

Ahora creamos el script para que configure e inicie el servidor de vpn.
sudo nano /etc/init.d/vpnserver

y pegamos este codigo, cambiar el rango de ip según la configuración de paso anterior
#!/bin/sh
#
vpnserver_start()
{
echo "VPN Server [OK]"
echo 1 > /proc/sys/net/ipv4/ip_forward
/etc/init.d/networking restart > /dev/null
/sbin/iptables -t nat -A POSTROUTING -s 10.6.0.0/24 -o eth0 -j MASQUERADE
/usr/sbin/openvpn --config /etc/openvpn/server.conf 2>> /etc/openvpn/error.txt 1>> /etc/openvpn/normal.txt &
}
vpnserver_stop()
{
echo "VPN Server [NO]"
/usr/bin/killall "openvpn"
iptables -F
iptables -X
/etc/init.d/networking restart > /dev/null
}
vpnserver_restart()
{
vpnserver_stop
sleep 1
vpnserver_start
}
#
case "$1" in
'start')
vpnserver_start
;;
'stop')
vpnserver_stop
;;

'restart')
vpnserver_restart
;;
*)
vpnserver_start
;;
esac

ahora le asignamos permisos de ejecutable
sudo chmod +x /etc/init.d/vpnserver

tambien hay que configurar para que auto inicie con el sistema
sudo update-rc.d vpnserver defaults

bueno ya configuramos OpenVPN, ahora tenemos que activar el modulo TUN en el kernel, con estas lineas, lo cargamos y listo
sudo modprobe tun
sudo echo "tun" >> /etc/modules

como verán no fue tan difícil la configuración, pero ahora viene lo mas lento:
* Crear Diffie Hellman de 2048bits
* Crear la Entidad emisora de certificados.
* Crear los Certificados y llaves del servidor.
* Crear los certificados y llaves de cada usuario.
Copiamos los ejemplo de easy-rsa para crear la entidad, los certificados, llaves y encriptación, que usa OpenVPN
sudo cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/

ahora hay que entrar en la carpeta donde están las utilidades que copiamos y crear la carpeta keys
sudo cp -R /usr/share/doc/openvpn/examples/easy-rsa/ /etc/openvpn/
cd /etc/openvpn/easy-rsa/2.0
sudo mkdir keys

solo nos queda editar el archivo vars que esta en /etc/openvpn/easy-rsa/2.0
sudo nano /etc/openvpn/easy-rsa/2.0/vars

y modificamos estos valores
export KEY_DIR="$EASY_RSA/keys"

por
export KEY_DIR="/etc/openvpn/easy-rsa/2.0/keys"

es para genere si o si en /etc/openvpn/easy-rsa/2.0/keys
seguimos, también modificamos los parámetros para Diffie Hellman de 2048bits
export KEY_SIZE=1024

por
export KEY_SIZE=2048

solo nos faltan los datos para la entidad emisora
export KEY_COUNTRY="US"
export KEY_PROVINCE="CA"
export KEY_CITY="SanFrancisco"
export KEY_ORG="Fort-Funston"
export KEY_EMAIL="me@myhost.mydomain"

modifica cada valor por los de tu país, provincia, ciudad, empresa y correo
un ejemplo:
export KEY_COUNTRY="AR"
export KEY_PROVINCE="SF"
export KEY_CITY="Armstrong"
export KEY_ORG="LAGA-Systems"
export KEY_EMAIL="info@lagasystems.com.ar"

Bueno ahora estamos preparados para comenzar, seguir estos pasos al pie de la letra, porque un error y se arruina todo.
ejecutamos
source ./vars

y nos pide que limpiemos por si hay entidades, certificados y llaves, lo hacemos con gusto
./clean-all

Ahora generamos la seguridad Diffie Hellman de 2048bits
./build-dh

ahora generamos la entidad emisora de certificados les pedirá los mismos datos que en el archivos vars recomiendo completar cada uno, aunque ya están, no importa
./build-ca

Ya estamos para poder generar lo certificados y llaves primero el servidor, cambiar server por el nombre que gusten,les pedirá los mismos datos que en el archivos vars recomiendo completar cada uno, aunque ya están, no importa.
./build-key-server servidor

ya tenemos los certificados y llaves de servidor ahora el cliente, cambiar cliente por el nombre que gusten,
les pedirá los mismos datos que en el archivos vars recomiendo completar cada uno, aunque ya están, no importa.
./build-key cliente

este paso se debe repetir para cada cliente o usuario que quiere conectar a la vpn ya tenemos todo para funcionar, no, falta copiar los archivos que generamos al lugar que configuramos en openvpn.conf
ya que copiar la carpeta keys a /etc/openvpn/
sudo cp -R /etc/openvpn/easy-rsa/2.0/keys /etc/openvpn/

ahora comprobamos que este todo en su lugar, entramos en la carpeta /etc/openvpn/keys
cd /etc/openvpn/keys

y con un ls miramos si están los archivos
ahora generamos un archivo mas, este lo genera openvpn
sudo openvpn --genkey --secret ta.key

Solo falta copiar los archivos ca.crt, cliente.crt, cliente.key, si creaste mas clientes copia los crt y key de cada un pendrive u otro medio no usar email para enviarlos, es como darle la llave de tu casa a un desconocido.
Listo ya esta todo en el servidor, ahora lo iniciamos para probar que todo esta correcto
sudo /etc/init.d/vpnserver start

Si no hay errores ya tenemos nuestra vpn funcionando, solo falta el cliente.

Problema detectado posterior a la instalación:
Modulo eth0 no se carga, por consiguiente no hay salida y entrada a nuestro Server.
solución:Editar /etc/network/interfaces
sudo nano /etc/network/interfaces

Algo similar debe quedar:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp


Instalaciòn del cliente OpenVpn en Android(rooteado):

Dependiendo la marca de nuestro dispositivo Android puede traer ya cargado el mudulo tun, el cual es necesario para el enlace tunel sobre internet.
En mi caso (Samsung Galaxy Note)ya tiene el modulo instalado de fabrica, en caso de no saber, bajar del market la app tun.ko gratuita. Podran saber si esta instalado el modulo o en caso negativo lo instalará.
En mi dispositivo no cuento con el modulo OpenVPN instalado de fabrica en el menu de (AJUSTES/CONEXIONES INALAMBRICAS/CONFIGURACION VPN)por lo tanto descargamos tambien 2 app que nos ayudaran OpenVPN Settings y OpenVPN Installer gratuitas del market.
Una vez instaladas abrimos OpenVPN Installer e instalamos el OpenVPN binary en ambas rutas:
/system/xbin/ifconfig
/system/bin/ifconfig
y cerramos.

Con un editor de texto, gedit puede ser, pegan este código. lo guardan con nombre client.conf en /sdcard/openvpn/
client
dev tun
proto tcp
remote IP-DEL-SERVIDOR PUERTO
resolv-retry infinite
nobind
#user nobody
#group nobody
persist-key
persist-tun
ca ca.crt
cert cliente.crt
key cliente.key
comp-lzo
tun-mtu 1500
keepalive 10 120
verb 4

Colocan en IP-DEL-SERVIDOR su dominio o ip y puerto asignado que fue 1194
junto con los archivos ca.crt, cliente.crt, cliente.key y client.conf los copian al dispositivo en la ruta /sdcard/openvpn/

Abrimos OpenVPN Setting y habilitamos OpenVPN y OpenVPN tunnel. Si todo es correctos se autenticará y nos conectará a nuestra red local.

Problema detectado en la conexión
Dispositovo se conecta al server y obtiene ip, aún asi no navega, no se visualizan archivos remotos.
Solución: habilitar en OpenVPN Settings uso de VPN DNS Server, colocar la dirección ip del router o dispositivo que nos de salida a internet de nuestra red local. En mi caso 192.168.1.1