viernes, 3 de agosto de 2012

Pfsense 2: OpenVPN a FreeBSD/Linux via Shared Key

Buenos dias.

Me llego la inquietud de una persona, que me preguntaba como podria conectar una VPN via OpenVPN de Pfsense a Linux?

Me puse a pensar un poco y me dije si ya hemos levantado tipo Site2Site entre Pfsense, RoadWarrior con clientes Windows, que diferencia hay con clientes tipo Linux/FreeBSD.

Tengo mi dominio y ahi tengo una VPN, no tipo shared por que se me hacen muy fragiles, pero al final de cuenta la puedo usar para llevar a cabo esta pequeña tarea.

Haya tengo FreeBSD 8.x con openvpn 2.2.2, ahora pfsense 2.0.1 tiene la version 2.2.0 entonces no hay tanta diferencia de versiones debe funcionar.

La configuracion de este tipo "Shared Key" es de las mas sencilla, ya que solo hay una llave compartida por todas las partes y esto la hace realmente simple, si alguien tiene esa llave puede entablar comunicacion sin problemas.

Para generar la llave se puede hacer desde Pfsense o atraves de Linux/FreeBSD, desde este ultimo puede ser algo tan sencillo como ejecutar:

openvpn --genkey --secret shared.key

Pero podemos ponerle algunos parametros hacer la llave de encriptacion mas grande que es lo mas recomendable 2048, 4096, etc.

Recordar que al aumentar el tamaño tanto la encriptada como desencriptada y la compresion le lleva mas tiempo a el CPU entonces nuestro equipo de computo va a ser masacrado, por ello es conveniente al estar configurando estos parametros hacer pruebas, ya que le podemos poner una llave de 8192 bits y los equipos encargados de la VPN son pc's PIII 500Mhz 512RAM disco IDE 5400RPM, estos sin van resentir nuestra avaricia de seguridad y mas si vamos a entablar comunicacion con varios puntos.

Volviendo a el caso, ya tenemos nuestra llave(shared.key) creada la cual yo la hice en mi caja FreeBSD y la almacene en:

/usr/local/etc/openvpn/keys

Es momento de configurar ese lado de la conexión, mi archivo de configuración quedaria asi:


local W.X.Y.Z
port 1194
proto udp
dev tun
secret /usr/local/etc/openvpn/keys/shared.key
ifconfig 10.8.0.1 10.8.0.2
push "route 192.168.40.0 255.255.255.0"
route 192.168.50.0 255.255.255.0
keepalive 10 120
cipher AES-192-CBC   # AES
comp-lzo
persist-key
persist-tun
status openvpn-status.log
log         /var/log/openvpn.log
verb 0
daemon

NOTA: verb 0 para no arroje tanto log, pueden subirlo a mas cuando esten empezando por si hay errores poder leer los logs para ver si damos con el problema, una vez entablada y probada la conexion lo bajan a 0 para que no haya nada y salvar accesos a el disco y CPU, si hay problema lo vuelven a subir y de nuevo repiten el ciclo.

Recordar que siempre debemos mandar la red que estamos protegiendo, este FreeBSD es mi firewall para la red:

192.168.40.0/24

Por ello el parametro:

push "route 192.168.40.0 255.255.255.0"

Y mi otro punto que seria el Pfsense que protege la red:

192.168.50.0/24

route 192.168.50.0 255.255.255.0

Estos parametros al momento de entablar la comunicacion el 1ro envia esas ruta a el cliente remoto y el 2do agrega la ruta a el mismo, de lo contrario va a ver enlace pero de ahi no vamos a pasar.

Una vez hecho esto de lado de FreeBSD ya ven que estos sistemas controlan muchos demonios atraves del archivo /etc/rc.conf, ahi voy a poner que siempre que arranque el sistema cargue OpenVPN:


openvpn_enable="YES"
openvpn_if="tap"


Ya con esto listo, arrancamos ese punto:

/usr/local/etc/rc.d/openvpn start

Observemos las rutas que aparecen:

Figura 1: Ruta hacie el otro punto.
Como podran observar en la figura 1, aparece la ruta que dice que toda comunicacion hacia la red
192.168.50./24 se va ir por el gw 10.8.0.2 que es la conexion virtual que se crea con el otro punto una vez entablada la comunicacion.

Ahora vamos del lado de Pfsense, haya es atraves del GUI mas sencillo aun, y tenemos esta configuracion:

Figura 2: Configuracion de Pfsense Shared-Key.
Figura 3: Configuracion terminada.
Figura 4: Nuestro dashboard con la conexion establecida.
Figura 5: Ruta creada para el otro punto.
Reglas del Firewall.

Ya solo es cuestion de abrir sus reglas si es que son paranoicos y solo estan dejando salir/entrar lo que necesitan, entonces en su LAN deben crear lo necesario, alias de los servidores remotos, servicios, yo creo alias a los servidores/servicios remotos y solo dejo pasar lo que necesito no mas.

Del otro lado tambien, por ejemplo en FreeBSD solo tengo 2 reglas que voy a permitir:


pass in quick on $ovpn_if proto tcp from $SiteA to $web port http label "VPN Web Server Access"
pass in quick on $ovpn_if proto tcp from $SiteA to $spam port 3306 label "VPN MySQL Server Access"

$SiteA = Red remota que tiene Pfsense detras.

Es todo lo que voy a permitir, entonces esas mismas reglas debe haber algo que permita llegar a estos equipos y servicios y viceversa.

Como ultimo comentario, si tenemos un puño de servidores remotos a los cuales nos vamos a conectar atraves de Pfsense solo recordar que por cada uno debemos llevar a cabo la configuracion, entonces si tenemos 5 remotos, vamos a tener que crear 5 configuraciones, no necesitamos tener una NIC por cada tunel requerido, recordar que lo que manda es el par: IP-remoto:puerto, entoces nuestro pfsense va a tener 5 conexiones en el puerto 1194 por asi decirlo pero a distinto IP.

Bien es todo por hoy, espero les sirva este pequeño doc sobre pfsense y OpenVPN.

2 comentarios:

Admin dijo...

Como te va Pedro, he seguido las instrucciones, pero no consigo establecer las VPN's, la verdad que se me acabaron las ideas, no se que más probar. De todos modos gracias por la ayuda, si pudieras dejarme un mail y podemos conversar por chat seria genial.

Pedro Moreno dijo...

Hola.

Mi correo, a lo mejor podemos usar gtalk "pheriko punto support arroba gmail punto com", animo.

Saludos!!!