merlin-梅林路由器自動切換網(wǎng)關(guān)
時(shí)間:2023-06-02 01:42:01 | 來源:網(wǎng)站運(yùn)營
時(shí)間:2023-06-02 01:42:01 來源:網(wǎng)站運(yùn)營
merlin-梅林路由器自動切換網(wǎng)關(guān):
緣由
目前家里是使用AC86U+N1搭建上網(wǎng)環(huán)境,N1用來做輔助網(wǎng)關(guān)。如果手動設(shè)置的話,如果N1掛掉了,或者無法上網(wǎng),就導(dǎo)致AC86U手動設(shè)置的N1網(wǎng)關(guān)無效,從而導(dǎo)致AC86U無法上網(wǎng)了。
目的:如果家人取下N1的lan,就自動切換為AC86U為網(wǎng)關(guān),那么就能保證N1出問題的時(shí)候,家人拔下N1就可以恢復(fù)上網(wǎng)了。
我家用的網(wǎng)絡(luò)拓?fù)鋱D如下:
于是尋找一些論壇,如恩山,koolshare,都沒有自動切換網(wǎng)關(guān)的腳本,所以就自己寫了一下,我也大概看了一下asuswrt-merlin.ng里面的Service是有哪些命令,并且發(fā)現(xiàn)路由是通過nvram命令進(jìn)行數(shù)據(jù)儲存的用戶的路由存儲配置。 腳本已經(jīng)使用幾個(gè)月了,功能比較穩(wěn),可以滿足需求
腳本文件
現(xiàn)在先給出腳本實(shí)現(xiàn)和配置
auto_switch_gateway.sh,可以根據(jù)自己的情況修改ip參數(shù),up_gateway是標(biāo)記AC86U的WAN是否連上了,如果是沒有跟我一樣的網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),而是路由器撥號上網(wǎng)的,可以把up_gateway修改成公共DNS網(wǎng)關(guān)。如,223.5.5.5或者114.114.114.114
#!/bin/bashdefault_gateway='192.168.50.1'auxiliary_gateway='192.168.50.2'up_gateway='192.168.1.1'check_ip_available(){ ping -c 3 $1 | grep packets | awk '{print $4}'}# If the gateway of the up close, the network is completely unusableres=`check_ip_available $up_gateway`echo $resif [ $((res)) -eq 0 ]; then echo "up_gateway unusable" exit 1ficur_gateway=`/bin/nvram get dhcp_gateway_x` # get current gatewayif [ "$cur_gateway" = "$default_gateway" ]; then echo "cur is default_gateway" res=`check_ip_available $auxiliary_gateway` if [ $(($res)) -eq 0 ]; then echo "d-exit" exit 1 fi echo "switch to auxiliary" # to switch /bin/nvram set dhcp_gateway_x=$auxiliary_gateway /bin/nvram set dhcp_dns1_x=$auxiliary_gateway /bin/nvram set dhcp_dns2_x="" /bin/nvram commit /sbin/rc rc_service restart_net_and_phy exit 0fiif [ "$cur_gateway" = "$auxiliary_gateway" ]; then echo "cur is auxiliary_gateway" res=`check_ip_available $auxiliary_gateway` if [ $(($res)) -gt 0 ]; then echo "a-exit" exit 1 fi echo "switch to default" # to switch /bin/nvram set dhcp_gateway_x=$default_gateway /bin/nvram set dhcp_dns1_x=119.29.29.29 /bin/nvram set dhcp_dns2_x=223.5.5.5 /bin/nvram commit /sbin/rc rc_service restart_net_and_phy exit 0fiecho "nothing change"
/sbin/rc rc_service restart_net_and_phy,這句命令,其實(shí)就是路由器修改本地網(wǎng)關(guān)后,會觸發(fā)的命令。所以這個(gè)命令,和網(wǎng)頁手動觸發(fā)效果是一樣的LAN代碼。這樣不用調(diào)用reboot命令重啟路由器
可是我后面發(fā)現(xiàn)了一個(gè)問題,上面僅僅是通過終端運(yùn)行腳本,使用ping命令來判斷網(wǎng)絡(luò)的情況和網(wǎng)關(guān)的情況,并且優(yōu)先切換到切換到輔助網(wǎng)關(guān)上。這腳本僅僅是自己手動運(yùn)行執(zhí)行來檢測網(wǎng)絡(luò)情況的,所以我需要一個(gè)自動運(yùn)行這個(gè)檢測腳本的腳本
梅林init-start路由啟動鉤子
如果你直接在路由添加crontab定時(shí)任務(wù),重啟就會被清空,而/jffs/scripts/init-start會在路由器開機(jī)時(shí)執(zhí)行
所以我們就可以通過在init-start 添加任務(wù)到crontab,進(jìn)行定時(shí)觸發(fā)我們的網(wǎng)絡(luò)情況監(jiān)測
我做了個(gè)延遲添加網(wǎng)絡(luò)監(jiān)聽任務(wù)到crontab任務(wù)腳本
create_crontab_auto_switch_gateway.sh,
意思是init-start觸發(fā)
create_crontab_auto_switch_gateway.sh,然后
create_crontab_auto_switch_gateway.sh每秒判斷AC86U的WAN外網(wǎng)是否可以ping通,如果可以ping通就添加上面的
auto_switch_gateway.sh到crontab中。
為什么要這樣處理呢?因?yàn)閕nit-start的執(zhí)行時(shí)間不確定,而且是比較早的。所以我需要等待到網(wǎng)絡(luò)好了,再添加網(wǎng)絡(luò)監(jiān)測,想要達(dá)到類似Systemd 的Service 的 After=network.target的作用
下面代碼需要需改 /var/spool/cron/crontabs/xxx成 對應(yīng)的參數(shù),下面示例,xxx是我的AC86U路由器登陸賬號,192.168.1.1是我AC86U的WAN連接的廣電盒子,如果跟我的網(wǎng)絡(luò)拓?fù)鋱D不一樣,是路由器直接撥號上網(wǎng),可以修改成114.114.114.114
create_crontab_auto_switch_gateway.sh代碼如下,需要簡單修改一下
#!/bin/bashwhile truedosleep 1;ping -c 1 192.168.1.1 > /dev/null #判斷路由器的WAN是否連接上了if [ $? -ne 0 ]; then continuefiecho "* * * * * /bin/bash /jffs/scripts/auto_switch_gateway.sh" >> /var/spool/cron/crontabs/xxx# 這里需要把XXX改成你的路由賬號名breakdone
把上面兩個(gè)腳本都放在/jffs/scripts/目錄下,然后我們看下init-start配置
#!/bin/sh/bin/bash /jffs/scripts/create_crontab_auto_switch_gateway.sh
如上,就配置好了網(wǎng)關(guān)定時(shí)任務(wù)切換
其它優(yōu)化
如果你遇到梅林路由AC86U網(wǎng)頁后臺管理打不開,但是路由還能上網(wǎng),可以添加這個(gè)定時(shí)任務(wù)到init-start,每天4點(diǎn)重啟http進(jìn)程,如下:
echo '0 4 * * * service restart_httpd' >> /var/spool/cron/crontabs/xxx
如果你和我一樣,是用廣電盒子,廣電盒子上網(wǎng)重啟后比較坑,需要開廣電的U點(diǎn)盒子開電視后,才能上網(wǎng)的。
一開始我就嘗試抓包摸索,到底是什么東西觸發(fā)讓U點(diǎn)盒子可以激活廣電盒子上網(wǎng)的,后來發(fā)現(xiàn),只要直接訪問廣電盒子的網(wǎng)關(guān)服務(wù)器管理頁面,就可以不需要開啟廣電U點(diǎn)盒子來讓廣電盒子上網(wǎng)了,所以我就添加了個(gè)啟動路由器的時(shí)候定時(shí)發(fā)出個(gè)curl。
echo '* * * * * /usr/sbin/curl http://192.168.1.1/cgi-bin/luci' >> /var/spool/cron/crontabs/xxx
所以,我的init-start是這樣的
#!/bin/sh/bin/bash /jffs/scripts/create_crontab_auto_switch_gateway.shecho '0 4 * * * service restart_httpd' >> /var/spool/cron/crontabs/xxxecho '* * * * * /usr/sbin/curl http://192.168.1.1/cgi-bin/luci' >> /var/spool/cron/crontabs/xxx
總結(jié)
auto_switch_gateway.sh 是用來每分鐘檢測網(wǎng)絡(luò)狀況,并且進(jìn)行網(wǎng)關(guān)切換的(而網(wǎng)關(guān)切換一般需要35-40秒,就像你在路由管頁修改網(wǎng)關(guān)時(shí),點(diǎn)擊提交那樣需要的時(shí)間,所以需要設(shè)置為每分鐘檢測,這樣保守點(diǎn))
create_crontab_auto_switch_gateway.sh是init-start中調(diào)用的。init-start是執(zhí)行時(shí)間比較早,比路由器的網(wǎng)絡(luò)模塊還要早。所以
create_crontab_auto_switch_gateway.sh需要ping網(wǎng)絡(luò)地址來確定WLAN192.168.1.1網(wǎng)絡(luò)是否正常。網(wǎng)絡(luò)正常后,就運(yùn)行
auto_switch_gateway.sh來監(jiān)聽輔助網(wǎng)關(guān)192.168.50.2的狀態(tài)來執(zhí)行切換邏輯。另外一個(gè)點(diǎn)就是重啟路由后,定時(shí)任務(wù)都會被清空,必須要在init-start中添加定時(shí)任務(wù)。
有可能你會疑惑service和rc_service。一開始我發(fā)現(xiàn)service.c有些命令好像不能執(zhí)行,但是現(xiàn)在測試又可以了,/sbin/rc rc_service反而可以運(yùn)行想要的命令,也可以找到很多命令。我沒有深入了解它們的真實(shí)區(qū)別。而且可以看到rc執(zhí)行main是往某個(gè)進(jìn)程發(fā)送命令的 ,這里可以找到其它命令administration.c、service.c和rc.c
論壇推薦
有些資料也是從論壇搜來的,感謝互聯(lián)網(wǎng)
Snbforums
恩山
Koolshare