1. 程式人生 > >校園網&openwrt記(七)斷網重連,crontab,靜態路由

校園網&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介面並退出。
  至此,任務已經基本完成,應用已經達到目標了。記得當時,我將程式放在自己的路由和那位大神的路由上,發現都能成功,並且斷線後還能自動重連,心裡那個高興呀~雖然花了不少時間折騰,但是所帶來的收穫卻是很大的!