Configurar VPN sin perder Internet (Parte 2)

¿otra vez vas a hablar de lo mismo?

Sip… devuelta a lo mismo. Si leyeron hace algunos días la “solución” que propuse para conectarnos a una vpn sin perder la salida a internet, quizas no lo notaron, pero esa solucion puede ser un tanto tediosa si hay que utilizarla tras cada reinicio, tras cada reconexion (sobre todo con DHCP).

Despues de dos semanas utilizando el sistema ya descripto, tuve la necesidad de automatizar el proceso, de modo que escribi un script en bash (al que llame vpn.sh) que detecta cuando estamos conectados, y cuando, estando conectados, no tenemos acceso a la VPN y a internet al mismo tiempo, y ejecuta el comando route para permitirnos navegar libremente mientras estamos dentro de la vpn.

#!/bin/bash

log=’/home/usuario/logVPN.txt’
VPNACTIVA=`route | grep -c ppp0`
HORA=`date`

if [ $VPNACTIVA = “0” ]; then
    echo ‘no hay vpn’ > $log
    echo ‘IP = 011.110.110.110’ >> $log
    echo ‘Ultima Ejecucion: ‘ $HORA >> $log    
    exit
else
IPACTIVA=`ifconfig ppp0 | grep 192.168.0. | cut -c14-26`
IP=`cat $log |grep IP | cut -c6-20`
fi

if [[ $IPACTIVA != $IP ]]; then
    IP=`ifconfig ppp0 | grep 192.168.0. | cut -c14-26`
    route add -net 192.168.0.0 netmask 255.255.255.0 gw $IP dev ppp0
    echo ‘IP =’ $IP > $log
    echo ‘Ultima Ejecucion ‘$HORA >> $log    
    exit
else
    echo ‘comprobado: ‘$HORA >> $log
    exit    
fi

Pero aún teniendo este script seria tedioso ejecutarlo cada vez que necesitmos ver si la conexión esta correctamente configurada, de modo que decidi agregarla al crontab de root para que corra automaticamente cada 3 minutos. De esta manera, cuando haya alguna interrupción de la conexión con la vpn, cuando el script se vuelva a ejecutar, estaremos correctamente conectados nuevamente.

Para agregar el script a crontab nos logeamos como root y ejecutamos:

crontab -e

Eso nos va a abrir el archivo crontab para que lo editemos, o en caso de que no lo tengamos, creara uno nuevo. Dentro del archivo crontab escribimos lo siguiente:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
*/3 * * * * sh /home/usuario/vpn.sh

Bien, hasta ahi una explicación corta de como automatizar el proceso, ahora hago una explicación mas “detallada” para quienes quieran entender un poco mejor lo que hice.

Yapa

Explicación del script

Comienzo estableciendo 3 variables:

#!/bin/bash
log=’/home/usuario/logVPN.txt’
VPNACTIVA=`route | grep -c ppp0`
HORA=`date`

log=’/home/usuario/logVPN.txt’: Indico el archivo donde voy a ir guardando los Log de las distintas corridas del script.

VPNACTIVA=`route | grep -c ppp0`: El valor de VPNACTIVA sera 0 solo si no existe interface ppp0, osea, cuando no estemos conectados a la VPN. Si no recuerdan por que es ppp0 visiten el anterior post y sabran ver que interface les corresponde ingresar a ustedes en su lugar.

HORA=`date`: Guardo la hora actual del sistema para saber cual fue la ultima corrida del script.

if [ $VPNACTIVA = “0” ]; then
    echo ‘no hay vpn’ > $log
    echo ‘IP = 011.110.110.110’ >> $log
    echo ‘Ultima Ejecucion: ‘ $HORA >> $log    
    exit
else
IPACTIVA=`ifconfig ppp0 | grep 192.168.0. | cut -c14-26`
IP=`cat $log |grep IP | cut -c6-20`
fi

Luego comparo el valor de VPNACTIVA, si es 0, significa que no tenemos conexión a la VPN, reemplazo el archivos de log introduciendo una IP falsa que luego voy a usar para otras comparaciones.

Si VPNACTIVA es distinto de 0, significa que tenemos conexión a la VPN, le damos a la variable IPACTIVA el valor de la IP que nos dío la VPN y a IP el valor de IP que tengamos en nuestro archivo de log.

if [[ $IPACTIVA != $IP ]]; then
    IP=`ifconfig ppp0 | grep 192.168.0. | cut -c14-26`
    route add -net 192.168.0.0 netmask 255.255.255.0 gw $IP dev ppp0
    echo ‘IP =’ $IP > $log
    echo ‘Ultima Ejecucion ‘$HORA >> $log    
    exit
else
    echo ‘comprobado: ‘$HORA >> $log
    exit    
fi

En el siguiente paso comparamos la IPACTIVA con la IP. Si son distintas corre el comando route con la IP que tenemos en ese momento y la guarda en el archivo de log.

Esto es asi por que si IPACTIVA y IP son distintas puede significar dos cosas:

1) Que en la corrida anterior la VPN este desactivada y la ip que figura en el log sea la ip falsa que forzamos.

2) Que haya habido una reconexión a la VPN y el servidor nos haya cambiado nuestra IP, siendo necesario actualizar esta información en el route.

Si por el contrario las dos ip son iguales, simplemente agrega la hora de comprobación en el archivo de log.

crontab

Del crontab solo dire lo siguiente: cuando ejecuten crontab -e se abrira el editor predetarminado, generalmente es vi y para los queno estan acostumbrados es un tanto complicado. Para todos ellos recomiendo definir como editor a nano de la siguiente manera:

EDITOR=nano

export EDITOR

No entrare mas en detalle con respecto a este tema por que les recomiendo que le den una leidita a la wiki de cron

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s