|

楼主 |
发表于 2016-1-29 13:36
|
显示全部楼层
http://www.nqhua.com/2012/09/16/279.html
LINUX下vpn断线自动重连bash脚本
在linux下不会自动拨号,我现在在用的拨号脚本如下:
#!/bin/sh
VPN=`ifconfig | grep ppp0`
echo $VPN
if [ -z "$VPN" ]
then
pon myvpn
while [ 1 ]
do
Route=`route | grep 路由地址`
if [ -n "$Route" ]
then
route add -net 172.16.0.0 netmask 255.255.0.0 gw 网关地址
break
fi
done
else
echo $VPN >/dev/null
fi
第一种方法:在crontab -uroot -e中加入
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
* * * * * /bin/vpn.sh
第二种方法:vim /etc/crontab 中加入
* * * * * root run-parts /etc/cron.minutely
将脚本放到/etc/cron.minutely(cron.minutely需要新建,且有执行权限)
上面是那个链接的内容,我自己设置的是这样的
由于我不需要使用vpn作为默认的网关
我只需要检测ppp0是否存在,存在就不管,不存在就pon VPN_NAME
脚本很简单
while(true)
do
VPN=`ifconfig | grep ppp0`
if [ -z "$VPN" ]
then
echo VPN不存在,为了防止bug,先poff
poff vpn
sleep 5
echo 正在连接pon
pon vpn
sleep 10
fi
VPN_ip=`ifconfig | grep 172`
if [ -z "$VPN_ip" ]
then
echo VPN没有连接
else
echo VPN已经连接
echo
fi
sleep 1
done
然后开启一个窗口运行这个脚本
这个脚本的意思就是间隔1秒检测一次 如果没有vpn连接,则自动连接,连接以后需要10秒钟的时间来让连接建立
如果遇到路由器重启,客户端原来的连接断开了,然后客户端又建立了一个连接,IP还是172.16.36.2,但是服务器里面的连接还没有断开,就会导致服务器里面有两个连接都是客户端建立的,并且这个时候客户端是ping不通服务端的,这个时候需要在服务端手动断开已经连接的VPN
在服务端也开一个窗口执行下面的这个脚本
这个脚本写的比较粗糙,水平有限,原理非常简单,就是间隔45秒(一般我的路由器重启时间不超过45秒)ping客户端的IP3次,如果3次都没有ping通,说明客户端不在线了,就开始断开所有的VPN连接(也不是所有,0-10,我自己的VPN只有我自己用,绝对足够了)
while(true)
do
result=`ping 172.16.36.2 -c 3 | grep ttl`
if [ -z "$result" ]
then
echo VPN不存在,开始断开所有连接
/home/testvpn/kickuser.sh ppp0
/home/testvpn/kickuser.sh ppp1
/home/testvpn/kickuser.sh ppp2
/home/testvpn/kickuser.sh ppp3
/home/testvpn/kickuser.sh ppp4
/home/testvpn/kickuser.sh ppp5
/home/testvpn/kickuser.sh ppp6
/home/testvpn/kickuser.sh ppp7
/home/testvpn/kickuser.sh ppp8
/home/testvpn/kickuser.sh ppp9
/home/testvpn/kickuser.sh ppp10
else
echo 连接正常
fi
sleep 45
done
下面还有一种方法,我不确定是否可以用
http://bbs.chinaunix.net/thread-3626794-1-1.html
一直认为PPP在掉线后不能重拨。
近来为帮朋友做一个路由器,因为是农村,线路质量不好,最需要解决的就是断线重拨,在通读了一遍PPP的man后,发现是可以重拨的,最重要的是下面几个参数:
1、用ddial模式,这个网上都有,不再啰嗦。
2、set redial 0 0
这一个是重拨时的参数,是拨号失败后的行为,而不是网上流传的控制断线重拨。第一个参数是等待多长时间再重拨;第二个参数是重拨多少次就放弃,永不再拨,设置为0则是一直重试。
3、set reconnect 10 0
同上,这一个才是控制断线后重拨的,是检测到掉线后干什么,注意和上面参数的区别。
4、set echoperiod 15
这一个是LCP的链路查询包,默认是30秒发一次,收到回应则表明ppp连接有效,收不到回应说明可能断线,再重试。
以前认为不能重拨的原因就在这儿:PPP规定,要重试5次,如果5次都没有回应,则表明线路断开,执行重拨。而默认每次间隔30秒,最高6次就是3分钟,一般的测试等不及这么久的,所以还是改为15秒查询一次,一共1分半钟,基本上还可以忍受了。也可以改得更小,但是频繁的查询,会浪费一定的资源,我个人认为15秒就够了。
5、set lqrperiod 15
同上,PPP的连接状态查询有两种方式,手册上说正常情况下会优先用LQR,而不是ECHO,虽然我测试都是用的ECHO,就是上面所说的那个,但是不保证其他地方用echo,所以两个都设上安全一些。
仅仅是个人理解,欢迎多多交流。
|
|