Saturday, March 12, 2011

Servidor VPN con OpenVPN/Shorewall y clientes Windows/Linux

El servidor VPN (Virtual Private Network) brinda la tecnologia de red que nos permitira extender las capacidades de alcance de nuestra red local sobre Internet, un gran ejemplo de esto seria la posibilidad de que dos sucursales se comuniquen utilizando como unico medio el internet.


Una Solucion VPN nos sumergiria en un mar de beneficios, como por ejemplo la reduccion de costos, comunicacion sin fronteras, integridad, confidencialidad, y seguridad de los datos. Con la tecnologia VPN podremos conectar redes locales sin importar la zona geografica, con el simple hecho de estar conectado a internet, nos ahorraremos los grandes costos de los enlaces fisicos, y nos proporcionaria una conexion sumamente segura.

Podemos mencionar distintos tipos de Redes Privadas Virtuales (VPN):

VPN de Acceso Remoto: Este tipo de VPN consiste en brindar a los colaboradores externos la posibilidad de conectarse a la red desde sitios remotos a traves de internet, al ser autenticados con una relacion de confianza, mayormente tienen los mismos accesos que un colaborador interno.

VPN Punto a Punto: Este tipo de VPN consiste en proporcionar un tunel para la conexion de puntos remotos (Sucursales) a una sede central, para asi eliminar los costosos enlaces Punto a Punto tradicionales (Utilizando medios fisicos).

VPN sobre Red Local: Este tipo de VPN, tambien denominado "VPN OVER LAN" consiste en un VPN de Acceso remoto, pero en vez de utilizar internet como vinculo de acceso, utilizaria la misma red Local. Normalmente esto se usa para proporcionar seguridad extra a ciertas zonas de la red, como por ejemplo que ciertos usuarios que tengan las relaciones de confianzas necesarias puedan acceder a la VPN.



Ahora que ya tenemos algunos conceptos basicos de la tecnologia VPN, podemos hablar de la solucion que vamos a implementar en este articulo, la cual se denomina OpenVPN, y segun Wikipedia es:

OpenVPN es una solución de conectividad basada en software: SSL (Secure Sockets Layer) VPN Virtual Private Network (red virtual privada), OpenVPN ofrece conectividad punto-a-punto con validación jerárquica de usuarios y host conectados remotamente, resulta una muy buena opción en tecnologías Wi-Fi (redes inalámbricas EEI 802.11) y soporta una amplia configuración, entre ellas balanceo de cargas. Está publicado bajo la licencia GPL, de software libre.

En esta guia vamos a configurar un Servidor VPN basico, donde un cliente se conectara desde el exterior a nuestro servidor, en pocas palabras realizaremos un VPN de Acceso Remoto, antes de poner en practica la guia deben de tener conocimientos de Shorewall como requisito (Asi como tenerlo instalado y configurado - GUIA DE SHOREWALL), ya que sera utilizado.



Lo primero que tenemos que hacer es instalar los paquetes necesarios, lo podemos hacer con el siguiente comando:

yum install openvpn lzo

Luego nos dirigimos al directorio de OpenVPN:

cd /etc/openvpn/

Para facilitar la tarea de configuracion vamos a copiar la carpeta de easy-rsa 2.0 en /etc/openvpn/:

cp -r /usr/share/openvpn/easy-rsa/ /etc/openvpn
 
Luego entramos a la carpeta easy-rsa/2.0 (La que esta en /etc/openvpn) y  modificamos las ultimas lineas de 
el archivo vars de acuerdo a nuestros casos, en mi caso a quedado asi:
 
export KEY_COUNTRY="RD"
export KEY_PROVINCE="ST"
export KEY_CITY="SantoDomingo"
export KEY_ORG="punto-libre.org"
export KEY_EMAIL="ramphis@punto-libre.org" 
 
Luego de guardado el archivo vars, vamos a cargar las variables recien modificadas 
(Cada vez que queramos generar un nuevo certificado con datos diferentes, deberemos 
ejecutar el comando), con el comando (Ojo: deberemos estar en el directorio 
/etc/openvpn):
 
source /etc/openvpn/easy-rsa/2.0/./vars
 
Luego limpiamos todas las firmas digitales presentes:
 
sh /etc/openvpn/easy-rsa/2.0/clean-all
 
Luego creamos el certificado del servidor, dejando todo por defecto:
 
sh /etc/openvpn/easy-rsa/2.0/build-ca
 
Luego creamos el fichero dh1024.pem, el cual tiene los parametros del protocolo Diffie-Hellman DE 1024 Bits:
 
sh /etc/openvpn/easy-rsa/2.0/build-dh
 
Luego generamos la firma digital del servidor:
 
sh /etc/openvpn/easy-rsa/2.0/build-key-server server
 
Luego generamos las llaves de los clientes, en este caso solamente generaremos una llave para un cliente:

sh /etc/openvpn/easy-rsa/2.0/build-key cliente1

Las llaves que generemos las encontraremos en la carpeta keys que esta dentro de la 
carpeta easy-rsa.
 
El siguiente paso seria crear el archivo de configuracion del servidor VPN, para su 
creacion creamos en el directorio /etc/openvpn el archivo servidorvpn-tcp-1194.conf 
(Es primordial que termine con .conf) y en el copiamos los siguientes parámetros:

port 1194
proto tcp
dev tun
#---- Seccion de llaves -----
ca easy-rsa/2.0/keys/ca.crt
cert easy-rsa/2.0/keys/server.crt
key easy-rsa/2.0/keys/server.key
dh easy-rsa/2.0/keys/dh1024.pem
#----------------------------
server 192.168.50.0 255.255.255.0
ifconfig-pool-persist ipp.txt
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status-servidorvpn-udp-1194.log
verb 3
client-to-client
duplicate-cn
max-clients 20
 
Aqui una descripcion de la configuracion:

port: el puerto por donde escuchara el servidor VPN.
proto: el protocolo que se usara para la conexion.
dev: tipo de interfaz de conexion virtual que se usara.
ca: ubicacion del fichero de Autoridad certificadora.
cert: ubicacion del fichero .crt generado por nosotros.
key: ubicacion del fichero .key de llave generado por nosotros.
dh: ubicacion del fichero .pen generado por nosotros.
server: rango de red virtual que se utilizara.
ifconfig-pool-persist: fichero donde se registran las maquinas conectadas.
keepalive 10 120: envia un paquete cada diez segundos y si no es respondido antes 
de los 120 segundos, dará por caida la conexion.
comp-lzo: los datos que se manejan por el tunel VPN seran compactados.
persist-key: resuelve el problema de las llaves que persisten
persist-tun: permite que no se cierren y se vuelvan abrir los dispositivos TAP/TUN al correr up/down.
status: fichero donde se almacenara el log de estado
verb: nivel de informacion deseado
Hay una cosa que tenemos que tener en cuenta, y es que en el parametro server no 
podemos especificar un rango de red el cual probablemente tenga el cliente VPN, ya 
que causaria conflictos... escogan rangos de red pocos usuales como por ejemplo 
192.168.50.0/24.
client-to-client: Sin este parametro los clientes VPN no podran comunicarse con los otros clientes VPN.
duplicate-cn: Con este parametro estamos especificando que los clientes pueden conectarse al mismo tiempo
con el mismo certificado.
max-clients: Clientes maximos que se pueden conectar al mismo tiempo.
 
Luego tenemos que hacer unas configuraciones del sistema... cargamos el modulo:

modprobe tun

Habilitamos Ip Forwarding, para ello abrimos el archivo /etc/sysctl.conf y verificamos que
el siguiente parametro este asi:

net.ipv4.ip_forward = 1

Y luego ejecutamos el siguiente comando:

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

Comprobamos que tenemos /dev/net/tun, si no existe lo creamos:

mknod /dev/net/tun c 10 200

Configuracion en Shorewall:

En shorewall vamos a tener que agregar unos cuantos parametros, y empezaremos 
por agregar la zona, que como ya sabemos se encuentra en /etc/shorewall/zones,
independientemente de la configuracion que tengamos deberemos agregar 
lo siguiente:

#ZONE                DISPLAY 
vpn                       ipv4

Luego le asignamos a la interfaz tun0 (este fue mi caso, puedes verificar con el 
comando ifconfig) la zona vpn (Archivo /etc/shorewall/interfaces):
 
#ZONE                INTERFACE             BROADCAST             OPTIONS
vpn                       tun0                     detect                     dhcp

Luego independientemente de la configuracion que tengamos vamos crear las politicas 
para esta zona (archivo /etc/shorewall/policy), por ejemplo si tenemos la zona 
net(Internet),fw(Firewall/Server),loc(Red Local), una configuracion de ejemplo seria: 

#SOURCE         DEST         POLICY
fw                       all         ACCEPT
loc                      all         ACCEPT
net                      all         DROP
vpn                     all         ACCEPT
 
Estamos aceptando todas las conexiones menos las que vengan desde internet, ahora 
independientemente de nuestra reglas en shorewall deberemos abrir el puerto 1194 
(Puerto escogido anteriormente) a las conexiones que vengan desde interior para 
poder permitir que los clientes se conecten, editamos el archivo rules de /etc/shorewall: 

#ACTION       SOURCE          DEST           PROTO   DEST PORT
ACCEPT          net                     fw                tcp          1194
ACCEPT          fw                      net               tcp          1194

Y para finalizar con shorewall editamos el archivo tunnels de /etc/shorewall, en este 
archivo deberemos definir las conexiones VPN, tenemos que especificar el puerto que 
utilizaremos y la direccion de red donde se encuentra el servidor, en mi caso 
192.168.1.0/24.

#TYPE                         ZONE       GATEWAY ZONE
openvpnserver:1194      vpn            192.168.1.0/24
 
Configuracion de clientes Linux:

Para la configuracion de los clientes VPN en plataformas Linux utilizaremos el mismo 
OpenVPN (Tambien es posible utilizar NetworkManager), para empezar debemos 
tener en nuestra maquina cliente Linux los ficheros generados previamente:
  1. ca.crt
  2. cliente1.crt
  3. cliente1.csr
  4. cliente1.key
Como sabemos todos estos ficheros se generaron en la carpeta keys en 
/etc/openvpn/easy-rsa/2.0/keys. Cuando tengamos los ficheros en nuestra 
maquina, instalamos openvpn:

yum install openvpn
 
Luego creamos dentro de la carpeta /etc/openvpn otra carpeta llamada keys
y en esta copiaremos los ficheros mencionados anteriormente, y creamos un archivo 
de configuracion en /etc/openvpn llamado cliente1-udp-1194.ovpn, con el siguiente 
contenido:

client
dev tun
proto tcp
remote ''dominio o ip del servidor vpn" 1194
float
resolv-retry infinite
nobind
persist-key
persist-tun
#------ SECCION DE LLAVES --------
ca keys/ca.crt
cert keys/cliente.crt
key keys/cliente.key
ns-cert-type server
#---------------------------------
comp-lzo
verb 3 

Aqui una descripcion de cada parametro:

client: especifica que openvpn sera utilizado como cliente.
dev: tipo de interfaz virtual que se usara.
proto: protocolo que se usara para la conexion.
remote: se especifica el dominio o ip del servidor VPN con su puerto.
float: acepta paquetes desde cualquier direccion, no solo los 
especificados en --remote.
resolv-retry: si la resolucion falla hace una re-comprobacion en los 
segundos especificados.
nobind: no agrega bind a la direccion local o al puerto.
persist-key: resuelve el problema de las llaves que persisten.
persist-tun: permite que no se cierren y se vuelvan abrir los dispositivos TAP/TUN 
al correr up/down.
ca: ubicacion del fichero de Autoridad certificadora.
cert: ubicacion del fichero .crt generado por nosotros.
key: ubicacion del fichero .key de llave generado por nosotros
comp-lzo: Compacta los datos transmitidos.

Luego cargamos el modulo, activamos ip forwarding y comprobamos que 
tenemos /dev/net/tun (Ya explicamos anteriormente como realizarlo).

Y para finalizar de configurar el cliente, reiniciamos openvpn:

service openvpn restart

Con esto tendriamos conexion solamente con las maquinas que tengamos dentro 
de la VPN, en caso de querer conectividad con la red local deberemos de agregar a el 
archivo de configuración del cliente lo siguiente:

route 192.168.1.0 255.255.255.0

Esto es en caso de que la red local sea esa, tambien si queremos ponerle un servidor 
DNS, lo hacemos con el siguiente parámetro:

dhcp-option DNS 192.168.1.100

Donde 192.168.1.100 es la IP del servidor DNS, al finalizar el archivo de configuracion 
quedaria así:

client
dev tun
proto tcp
remote ''dominio o ip del servidor vpn" 1194
float
resolv-retry infinite
nobind
persist-key
persist-tun
route 192.168.1.0 255.255.255.0
dhcp-option DNS 192.168.1.100
#------ SECCION DE LLAVES --------
ca keys/ca.crt
cert keys/cliente.crt
key keys/cliente.key
ns-cert-type server
#---------------------------------
comp-lzo
verb 3 

Luego reiniciamos el servicio OpenVPN y podremos tener conectividad con las 
maquinas de la red local, y poder hacer consultas al servidor DNS.

Configuracion de un cliente Windows:
 
Para configurar un cliente Windows deberemos instalar un programa denominado 
OpenVPN-GUI, lo podemos descargar desde http://openvpn.se, luego lo instalamos y 
vamos a la carpeta C:/Program Files/openvpn/config.

En esta carpeta copiaremos los archivos:
  • ca
  • cliente1.crt
  • cliente1.csr
  • cliente1.key
Y crearemos el archivo cliente1-udp-1194.ovpn con el siguiente contenido:

client
dev tun
proto tcp
remote ''dominio o ip del servidor vpn" 1194
float
resolv-retry infinite
nobind
persist-key
persist-tunroute 192.168.1.0 255.255.255.0dhcp-option DNS 192.168.1.100
#------ SECCION DE LLAVES --------
ca ca.crt
cert cliente.crt
key cliente.key
ns-cert-type server
#---------------------------------
comp-lzo
verb 3 
 
Ya el significado de cada parametro fue explicado anteriormente al configurar un 
cliente Linux, luego guardamos y podemos ejecutamos el cliente OpenVPN, al 
ejecutarlo se pondra en tray bar, le damos click derecho, y luego a connect.
 
Al conectarse se pondra verde y aparecera una notificacion con la IP virtual, tengan en 
cuenta que los niveles de seguridad de Windows 7 son mayores a los de XP, y esto 
significa que no podremos lograr la conexion VPN si no ejecutamos OpenVPN como 
administrador, dandole click derecho y "Run as administrator" o dirigiendonos a las 
propiedades, pestañá Compatibilidad, y activar la casilla "Run as administrator".
 
Si no hacemos esto, dira que se a conectado bien pero no podremos comunicarnos 
con los equipos remotos ya que se conecta pero no agrega las rutas de comunicación 
(El comando route solo puede ser corrido como administrador), esto solo pasa con 
Windows 7. 

Y Listo, con esto concluyo esta guia para la configuracion de un Servidor VPN, utilize 
como guia de referencia las guías de VPN de alcancelibre, espero que les haya servido, 
dudas o aportes seran bien recibidas.

Hasta la proxima :)

1 comentarios:

hardy said...

Tengo creada una vpn siguiendo todos tus pasos pero no puedo ver los equipos que estan el red lan del servidor vpn,

Post a Comment