起因
(此處廢話,建議直接跳下一主題)
家里買了一臺(tái)NAS之后一直想通過公網(wǎng)訪問自己的內(nèi)網(wǎng)浆熔。本辐。。但是医增。慎皱。。
自從報(bào)裝了聯(lián)通寬帶就因?yàn)闊o法得到公網(wǎng)IP而一直和聯(lián)通客戶周旋叶骨,打了好多客服電話茫多,又遷了線路。忽刽。天揖。最后終于也只是爭取到一條 IP一直在公網(wǎng)與內(nèi)網(wǎng)波動(dòng)的動(dòng)態(tài)IP線路」虻郏客服曰:公網(wǎng)IP不夠今膊,根據(jù)總公司規(guī)定能否獲得公網(wǎng)IP只能是靠程(運(yùn))序(氣)自動(dòng)分配。
雖然萬般無奈伞剑,可是雖讓我已經(jīng)交錢了而且也心力交瘁不想再和客服周旋了斑唬。所以只能勉強(qiáng)接受這個(gè)折中的方案。
然而問題來了黎泣,運(yùn)氣好獲得公網(wǎng)IP的話我自然能夠通過DDNS來在外網(wǎng)訪問我的內(nèi)網(wǎng)恕刘。但是如果我運(yùn)氣不好得到內(nèi)網(wǎng)IP呢?
既然問題來了抒倚,那就解決問題褐着,總共有以下這么多問題需要解決:
- 了解聯(lián)通寬帶獲取IP的情況是怎樣的?如何可以獲取公網(wǎng)IP托呕?
- 如何一直獲取公網(wǎng)IP含蓉?
通過不斷的折騰我的路由器終于發(fā)現(xiàn)了洋访,聯(lián)通獲取IP的機(jī)制就是每次路由器重啟或者端口重啟都會(huì)隨機(jī)獲取一個(gè)公網(wǎng)或者內(nèi)網(wǎng)IP。而是否公網(wǎng)全靠運(yùn)氣谴餐,而且獲得內(nèi)網(wǎng)IP的情況遠(yuǎn)多于獲取公網(wǎng)IP的情況姻政。
然而最要命的事你獲得一個(gè)公網(wǎng)IP之后并不是一直就能持有該IP,而已會(huì)每個(gè)一段時(shí)間刷新IP岂嗓,間隔大概是一天汁展。
那現(xiàn)在知道了寬帶獲取IP的機(jī)制了,那么如何保證路由器一直獲取公網(wǎng)IP呢厌殉?
最笨的方法就是一直重啟路由器或者端口知道你獲得一個(gè)公網(wǎng)IP食绿。
或者寫個(gè)腳本自動(dòng)判斷IP并獲取公網(wǎng)IP。
作為能躺著絕對(duì)不會(huì)坐著的IT工(死)程(肥)師(宅)當(dāng)然是選擇讓程序自己來做這個(gè)粗活啦公罕。器紧。。
說干就干楼眷。铲汪。。
處理思路
讀取端口IP → 讀取本地寬帶公網(wǎng)IP → 端口IP≠公網(wǎng)IP 則重啟端口罐柳,直到端口IP=公網(wǎng)IP
讀取端口IP
因?yàn)槲业穆酚善魇莖penwrt系統(tǒng)的掌腰,所以可以通過命令ifstatus wan來查看我設(shè)備端口IP。
查看IP信息
ifstatus wan
root@NETGEAR:/mnt# ifstatus wan
{
"up": true,
"pending": false,
"available": true,
"autostart": true,
"dynamic": false,
"uptime": 21255,
"l3_device": "pppoe-wan",
"proto": "pppoe",
"device": "eth0.2",
"updated": [
"addresses",
"routes"
],
"metric": 0,
"dns_metric": 0,
"delegation": true,
"ipv4-address": [
{
"address": "120.85.165.134",
"mask": 32,
"ptpaddress": "120.85.164.1"
}
],
(张吉。齿梁。。中間去掉好多無用文本肮蛹。勺择。。)
}
}
提取IP所在的行
因?yàn)镮P的字符串在第20行
ifstatus wan | awk '{if (NR==20) print}'
root@NETGEAR:/mnt# ifstatus wan | awk '{if (NR==20) print}'
"address": "120.85.165.134",
去掉多余字符
因?yàn)槲抑挥袉为?dú)的IP字段伦忠,雙引號(hào)也不要省核。所以我們可以用雙引號(hào)來分割字符,分割之后讀取第4端字符串缓苛。
ifstatus wan | awk -F '"' '{if (NR==20) print $4}'
root@NETGEAR:/mnt# ifstatus wan | awk -F '"' '{if (NR==20) print $4}'
120.85.165.134
讀取公網(wǎng)IP
網(wǎng)上可以收到很多查詢本地公網(wǎng)IP的URL芳撒,我網(wǎng)上查到了好幾個(gè)
獲取外網(wǎng)ip信息的:
curl icanhazip.com
curl trackip.net/ip
curl iiip.co
curl ifconfig.me
最后發(fā)現(xiàn)在我的環(huán)境ifconfig.me這個(gè)網(wǎng)址最快邓深,所以就使用他了未桥。
curl ifconfig.me
開關(guān)端口IP
打開WAN端口
ifup wan
關(guān)閉WAM端口
ifdown wan
腳本源碼
#!/bin/bash
#Restart the interface wan until get the global address
#by Huangxiaosong
while true
do
globalAdd=$(curl icanhazip.com) #讀取公網(wǎng)IP,賦值給變量globalAdd
echo "globalAdd:" $globalAdd
wanAdd=$(ifstatus wan | awk -F '"' '{if (NR==19) print $4}') #讀取端口IP芥备,賦值給變量wanAdd
if [ -z "$wanAdd" ] #判斷 $wanAdd 是否為空冬耿,因?yàn)樽x取IP的時(shí)候有時(shí)候讀出來的文本,IP在19行萌壳,有時(shí)候在20行亦镶,因此這里做一個(gè)判斷日月,如果19行讀不到IP就讀20行。
then
wanAdd=$(ifstatus wan | awk -F '"' '{if (NR==20) print $4}')
echo $wanAdd
fi
echo "wanAdd:" $wanAdd
if [ $globalAdd != $wanAdd ] #如果查詢到的公網(wǎng)IP不等于WAN口IP缤骨,說明路由器獲取的IP是聯(lián)通內(nèi)網(wǎng)IP爱咬。那么就重啟WAN口。
then
ifdown wan
echo "ifdown wan"
sleep 1
ifup wan
echo "ifup wan ..."
sleep 7
else
echo "Well done! you get the global address!"
echo "wait 15 min !"
sleep 900 #這里等等15分鐘后繼續(xù)循環(huán)執(zhí)行程序绊起。
fi
done
后記
開源路由器的確不錯(cuò)精拟,本身具備了和linux一樣的腳本控制能力。所以可以方便的實(shí)現(xiàn)路由器的控制虱歪,包括腳本自動(dòng)化蜂绎。如果是一般的家用路由器的話。那么估計(jì)就要費(fèi)一番心思去讓python來去web端操作了笋鄙。那不知道要復(fù)雜多少倍师枣。