Creacion masiva de VPN’s

Marron de ultima hora, crear y configurar N VPN’s para dar conectividad a N oficinas de la forma mas barata y mas rapida posible, haciendo enfasis en la palabra BARATA (vamos como siempre, te buscas la vida pero que me cueste lo menos posible).

Esta es la solucion que dimos:
Tuneles a traves de internet (con ADSL’s publicos) con la siguiente configuración:
– Montar un servidor openvpn en cualquier servidor que tenga un poco de sitio (en nuestro caso estabamos hablando de mas de 60 tuneles). Se opto por configurarlo solamente con claves estaticas pre-compartidas (no es lo mas seguro, pero es rapido, fiable y no requiere intervencion por parte del usuario).
La configuración de los tuneles se hace en un momento, utilizando el siguiente script para crearlas.
#!/usr/bin/perl
# Script para crear los ficheros de configuracion
# de openvpn
# Parametros : < fichero.txt # Contenido del fichero nombrevpn puerto ipred # salida en /keys/nombrevpn.key # /conf/nombrevpn.conf # /ovpn/nombrevpn.ovpn $pathc ="/home/dramirez/openvpn/conf"; open(FICH,"$ARGV[0]") || die "No puedo abrir el fichero $ARGV[0]"; while("<"FICH">«) (sin comillas «<"FICH">» )
{
$datos=$_;
@datos=split(/,/,$datos);
system(«/usr/sbin/openvpn –genkey –secret keys/@datos[0].key»);
$fichero=@datos[0].».conf»;
$ipdeaqui=@datos[2];
$ipdealli=@datos[2];
@ipdeaqui=split(/\./,$ipdeaqui);
@ipdealli=split(/\./,$ipdealli);
$ipdeaquivpn=@ipdeaqui[0].».».@ipdeaqui[1].».».@ipdeaqui[2].».».»1″;
$ipdeallivpn=@ipdealli[0].».».@ipdealli[1].».».@ipdealli[2].».».»2″;
$secret=@datos[0].».key»;
open(FICH2,»conf/plantilla.conf») || die «No puedo abrir el fichero plantilla.conf»;
$fichconf = «/>$fichero»;
system(«touch conf/$fichero»);
open(FICH3,»>conf/$fichero») || die «No puedo abrir el fichero $fichero»;
while(«<"FICH2">«) (Sin comillas)
{

$linea = $_;
if ($linea =~/xxxx1/)
{
print FICH3 «ifconfig «.$ipdeaquivpn.» «.$ipdeallivpn;
}
else
{
if ($linea =~/laclave/)
{ print FICH3 «secret «.$secret;}
else
{
if ($linea =~/elpuerto/)
{ print FICH3 «port «.@datos[1];}
else
{ print FICH3 $linea; }
}
}
}
close(FICH2);
close(FICH3);
# Acabamos con el fichero de configuracion (el del servidor)
# Empezamos con el fichero de configuracion del cliente
$ficheroovpn=@datos[0].».ovpn»;
open(FICH2,»ovpn/plantilla.ovpn») || die «No puedo abrir el fichero plantilla.conf»;
system(«touch ovpn/$ficheroovpn»);
open(FICH3,»>ovpn/$ficheroovpn») || die «No puedo abrir el fichero $fichero»;
while(«<"FICH2">«) (Sin comillas)
{

$linea = $_;
if ($linea =~/xxxx1/)
{
print FICH3 «ifconfig «.$ipdeallivpn.» «.$ipdeaquivpn;
}
else
{
if ($linea =~/laclave/)
{ print FICH3 «secret «.$secret;}
else
{
if ($linea =~/elpuerto/)
{ print FICH3 «port «.@datos[1];}
else
{ print FICH3 $linea; }
}
}
}
close(FICH2);
close(FICH3);
}

close(FICH);

El funcionamiento es sencillo, le pasamos en un fichero de texto plano la lista con los siguientes datos:
VPN001,1500,x.x.x.x
VPN002,1501,x.x.x.x
VPN003,1502,x.x.x.x
VPN004,1503,x.x.x.x

Nombre del tunel, puerto por el que vamos a hacerlo y la red que vamos asignar (normalmente la .1 para el servidor y la .2 para el cliente).
Antes de ejecutarlo hay que tocar los ficheros de plantilla, la forma mas rapida es coger los que vienen de ejemplo en openvpn y sustituir los valores por los que busca el script:
Para el fichero ovpn son los siguientes:
remote x.x.x.x (poner la ip del tu servidor de tuneles)
port elpuerto (que luego se sustituye por el correspondiente puerto)
ifconfig xxxx1 xxxx2 (idem)
secret laclave

Para el conf son los siguientes:
ifconfig xxxx1 xxxx2 (notar que esta al reves, este es el fichero que va en la parte servidora)
secret laclave
port elpuerto

Una vez ejecutado el script y creados los ficheros solo tenemos que arrancarlos…
openvpn –config VPN001.conf

Ojo con activar el forward de paquetes…
(echo 1 > /proc/sys/net/ipv4/ip_forward)

Con esto tenemos el servidor arriba y esperando conexiones (suponiendo que has abierto los correspondientes puertos en el firewall, router, o lo que tengas).

La configuración de los clientes puede ser de varios tipos. Nosotros optamos por un PC con dos tarjetas de red para hacer el tunel, este PC hace el tunel a traves de una conexion ADSL normal y corriente. Cuando tienes el tunel arrancado puedes entrar sin problemas, pero antes de eso no hay manera asi que, optamos por comprar unas licencias de logmein para poder entrar a las maquinas sin tener que avisar a los usuarios.
Arrancas el tunel (boton derecho -> start openvpn…) y ya esta…
Ahora solo falta dar salida a los PC’s de dentro, rras configurado para hacer NAT y listo.

El coñazo es que, al no tener arrancado el tunel (que monta un interface virtual) no puedes configurar el rras en la maqueta asi que hubo que hacerlo uno a uno.

Porqué utilizar windows como cliente?, por un tema de hardware y licencias (aunque suene a coña) las maquinas son pc’s de escritorio con una tarjeta de red extra, por lo que luego se reutilizaran para los usuarios.

La solución se monta rapido, pero tiene dos problemas:
1- La velocidad de los ADSL’s es limitada, con un 3Mb normal de telefonica da (con nuestra configuración de red) hasta 4 usuarios.
2.- Problemas con las credenciales de windows, al pasar por una maquina intermedia que hace NAT no guarda bien las credenciales, por lo que, para cada aplicación que abre (en un entorno citrix, solicita la autenticación). Estamos mirando la manera de resolverlo.Si a alguien se le ocurre como hacerlo, cualquier opinión sera bienvenida.