校园网&openwrt记(七)断网重连,crontab,静态路由

  学校的pppoe服务器似乎不希望我们pppoe拨号一直在线,所以有时候会自己断线,或许一天,或许两天,有时候十几天才会断。但是断线后,需要重新发送获取权限的udp包并重新拨号才可以上网,所以为了让路由器全部自己处理好,省得我们重新启动路由器,我们可以简单地写一个脚本不断的检测上网状态,断网了,就自动重连。之前说了可以在启动脚本加上一个循环检测的脚本,让它在路由器启动后,自动在后台不断地运行,这是一种方法。但是,我在这里,使用的是系统的crontab,crontab文件包含送交cron守护进程的一系列作业和指令。cron进程会获取这些指令和用户定义的对这个指令要执行的周期,在时间到来时cron进程会运行它们。
  crontab文件的语法如下:

#六列,每行代表一个周期作业
#分 时 日 月 周 |<==============命令串========================>|

代表意义 分钟 小时 日期 月份 周    命令 
数字范围 0-59 0-23 1-31 1-12 0-7   要运行的指令 

有几个特殊的符号
*(星号) 任何数值。如果每月1号的每一分钟都要运行该命令,则:
* * 1 * * cmd
,(逗号) 代表分隔时段。如果要运行的命令是整整9点或21点,那么: 
0 9,21 * * * cmd
-(减号) 代表一段时间范围内,若9点到21点之间的每小时的30分都运行一条命令,那么: 
30 9-21 * * * cmd
/n(斜线) n代表数字,是“每隔n个单位间隔”的意思,例如每五分钟运行一次,则:
*/5 * * * * cmd 

  所以,假设我的断网重连的脚本的名称为cronconnect的话,其所在目录假设为/root/pppoe,那么我可以在openwrt的/etc/crontab/root文件中添加如下任务:

* * * * * /root/pppoe/cronconnect

  即每分钟检测一次上网状态,确保断网重连,虽然检测密度不如循环,但是也足以接受了。
  那么,应该如何检测上网状态呢?这里我只是简单使用ping命令来ping几个固定的常用的国内DNS,ping成功的结果超过半数即视为联网状态正常。
  shell中可以这样写

cnt=0  # ping成功的DNS个数
ping -c 2 114.114.114.119 -W 3
[ $? -eq 0 ] && cnt=$(($cnt + 1))
...

  这里需要注意的是,根据过程,假设需要接收我们所发送的udp包的服务器ip地址为192.168.66.123,而校园网的网关为192.168.66.254,那么我们wan口通过dhcp获取得到一个为192.168.66.66的校园网ip后,路由表的默认路由将会为校园网的网关,但是当我们pppoe拨号成功后获取得到了isp分配给我们的ip(假设为10.66.66.166),isp的pppoe服务器为10.66.66.1,那么我们的默认网关将会变成10.66.66.1,所以此时我们就不能够上我们学校内的内部网站了,上不了图书馆网站,就连服务器192.168.66.123也连接不到了。所以此时如果我们的pppoe断开了,那么由于我们不能够连接192.168.66.123,自然发送不了udp包给该服务器,就不能够重新拨号了。
  这时,可以有两种处理方法,一种是重启wan口,这将会使wan口重新dhcp获取ip,并添加默认路由为校园网的网关,这时就可以连接服务器192.168.66.123,自然可以重新获取权限并重新拨号上网了。还有一种方法就是添加一条静态路由,指定某些ip走哪一个网关,这里,由于我们的wan接口是物理接口,得到的是校园网ip,而pppoe连接是建立在wan接口之上的,我们需要连接服务器192.168.66.123,那么就可以像下面这样添加一条静态路由,使得访问192.168.66.123时从校园网网关走,从而正常访问:

ip route add 192.168.66.123 via 192.168.66.254

  当然如果知道校园网内网网站站点的ip范围,也可以指定一段:

ip route add 192.168.66.0/24 via 192.168.66.254

  这样就可以在可以访问外网的情况下同时访问学校内部站点。而且此时即使pppoe接口断开之后没有了默认路由,只要我们dhcp获取得到的校园网ip没有过期,就可以直接重新发送udp包到服务器192.168.66.123并重新拨号,当然,最好还是多写几条语句,判断如若不能连接服务器192.168.66.123,说明我们的ip过期了,需要重新获取ip,这时就要重新启动wan口,再发送udp包。
  所以最终crontab方法检测断网重连的步骤是:
  1. ping几个DNS,得到成功ping通的个数,如果过半则退出,否则进入步骤2
  2. 判断是否能够连接服务器192.168.66.123,是则直接发送udp,重启pppoe接口并退出,否则进入步骤3
  3. 重新启动wan口,等待几秒,获取得到校园网ip再发送udp重启pppoe接口并退出。
  至此,任务已经基本完成,应用已经达到目标了。记得当时,我将程序放在自己的路由和那位大神的路由上,发现都能成功,并且断线后还能自动重连,心里那个高兴呀~虽然花了不少时间折腾,但是所带来的收获却是很大的!

你可能感兴趣的:(openwrt)