樹(shù)莓派-家庭NAS(1) http://www.reibang.com/p/9be7ada37863
樹(shù)莓派-家庭NAS(2) http://www.reibang.com/p/91405ca824b8
樹(shù)莓派-家庭NAS(3) http://www.reibang.com/p/80777ed85246
內(nèi)網(wǎng)穿透選型
上一篇文章中介紹了葛假,家用NAS樹(shù)莓派的整體方案。在整體解決方案中說(shuō)明的搭建整體方案的第一步是解決訪問(wèn)問(wèn)題祟霍。本文將主要介紹訪問(wèn)解決方法安寺。
內(nèi)部網(wǎng)絡(luò)穿透技術(shù)可以分為NAT、DDNS溉旋、反向代理和VPN脾拆。這里就不介紹這些方式夜惭,可以查看參考中的內(nèi)容進(jìn)行了解苦银。這里說(shuō)明他們的大概工作原理用于選型工作啸胧。
-
NAT技術(shù):
內(nèi)網(wǎng)中的機(jī)器怎樣訪問(wèn)公網(wǎng)上的網(wǎng)站??jī)?nèi)網(wǎng)機(jī)器發(fā)送的數(shù)據(jù)可以經(jīng)過(guò)Router轉(zhuǎn)發(fā)的公網(wǎng)上幔虏,那公網(wǎng)上返回的數(shù)據(jù)怎么到達(dá)內(nèi)網(wǎng)的機(jī)器內(nèi)纺念,這個(gè)過(guò)程就是NAT技術(shù)。主要技術(shù)是通過(guò)動(dòng)態(tài)端口映射技術(shù)完成想括。
NAT技術(shù) -
DDNS技術(shù):
DDNS即動(dòng)態(tài)域名解析陷谱,是將用戶的動(dòng)態(tài)IP地址映射到一個(gè)固定的域名解析服務(wù)上,用戶每次連接網(wǎng)絡(luò)的時(shí)候瑟蜈,客戶端程序就會(huì)通過(guò)信息傳遞把該主機(jī)的動(dòng)態(tài)IP地址傳送給位于服務(wù)商主機(jī)上的服務(wù)器程序烟逊,服務(wù)程序負(fù)責(zé)提供DNS服務(wù)并實(shí)現(xiàn)動(dòng)態(tài)域名解析。就是說(shuō)DDNS捕獲用戶每次變化的IP地址铺根,然后將其與域名相對(duì)應(yīng)宪躯,這樣域名就可以始終解析到非固定IP的服務(wù)器上,互聯(lián)網(wǎng)用戶通過(guò)本地的域名服務(wù)器獲得網(wǎng)站域名的IP地址夷都,從而可以訪問(wèn)網(wǎng)站的服務(wù)眷唉。
DDNS技術(shù) -
反向代理:
反向代理就是經(jīng)常說(shuō)的,有一臺(tái)公網(wǎng)服務(wù)器和私網(wǎng)服務(wù)器在一個(gè)網(wǎng)絡(luò)內(nèi)囤官。公網(wǎng)服務(wù)器上構(gòu)建一個(gè)服務(wù),把用戶請(qǐng)求轉(zhuǎn)發(fā)到死亡服務(wù)器上就可以了蛤虐。
反向代理技術(shù) -
VPN技術(shù):
VPN技術(shù)就是將兩個(gè)私網(wǎng)通過(guò)隧道技術(shù)組合成一個(gè)子網(wǎng)党饮。
VPN技術(shù)
方案選擇
本次我們的方向是家用NAS,所以驳庭,網(wǎng)絡(luò)環(huán)境也是家庭環(huán)境刑顺。所以氯窍,可能需要組合各種內(nèi)網(wǎng)穿越技術(shù)才可以滿足整體要求。所以蹲堂,現(xiàn)在開(kāi)始組織方案狼讨。
在本方案中家用網(wǎng)絡(luò)使用的是電信網(wǎng),電信網(wǎng)是有公網(wǎng)IP的柒竞。在沒(méi)有公網(wǎng)IP的通信服務(wù)商政供,請(qǐng)自行選擇其他方案。然后朽基,再使用NAT技術(shù)的端口靜態(tài)映射布隔,將樹(shù)莓派上的服務(wù)發(fā)布出去。使用DDNS技術(shù)的域名動(dòng)態(tài)解析將路由器域名發(fā)布到域名上稼虎。
實(shí)現(xiàn)
- 先把樹(shù)莓派的內(nèi)網(wǎng)IP設(shè)置為靜態(tài)IP衅檀。
- 實(shí)現(xiàn)上圖中的第七步,在路由器上設(shè)置端口映射霎俩。因?yàn)樽约沂褂玫穆酚善鞑灰粯影Ь揖筒唤貓D了。幾乎所有的家用路由器都是支持端口映射的打却。
- 在樹(shù)莓派上編寫代碼排苍,實(shí)現(xiàn)上圖中1,2,3步。我使用的是NETGEAR R6200V2学密,所以根據(jù)路由器的特點(diǎn)進(jìn)行了公網(wǎng)IP的獲取工作淘衙。
- 配置定時(shí)執(zhí)行過(guò)程。
定時(shí)執(zhí)行(cron)代碼:
*/2 * * * * root /home/pi/update_public_ip.py > /dev/null 2>&1 &
更新域名IP代碼(python):
#!/usr/bin/python2.7
#-*-coding:utf-8-*-
import os
import sys
import httplib
import urllib2
import urllib
import base64
import cookielib
# 獲取網(wǎng)管地址腻暮,即路由器地址
def getGateway():
return "172.25.1.1"
# 獲取路由器上的公網(wǎng)IP彤守。因?yàn)閷?shí)在路由器上撥號(hào)上網(wǎng)的,所以從路由器上獲取公網(wǎng)IP
def getPublicIP(ip, user, password):
base64string = base64.b64encode('%s:%s' % (user, password))
headers = {"Host": ip,
"User-Agent": "Mozilla/5.0 (Windows NT 5.1; rv:52.0) Gecko/20100101 Firefox/52.0",
"Accept": "*/*",
"Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
"Accept-Encoding": "gzip, deflate",
"Referer": "https://172.25.1.1/RST_st_poe.htm",
"Connection": "keep-alive",
"Authorization":"Basic %s" % base64string}
# 登錄服務(wù)器哭靖,獲取Cookie
conn = httplib.HTTPConnection(ip, 80)
conn.request("GET", "", None, headers)
response = conn.getresponse()
cookie = response.getheader("set-cookie")
headers["Cookie"] = cookie
conn.close()
# 獲取公網(wǎng)IP地址所在頁(yè)面
conn = httplib.HTTPConnection(ip, 80)
conn.request("GET", "RST_st_poe.htm", None, headers)
response = conn.getresponse()
result = response.read()
# 解析頁(yè)面中內(nèi)容具垫,分解出IP地址
start_index = result.find("IP地址</B></td>")
start_index = result.find("<TD NOWRAP>", start_index)
end_index = result.find("</td>", start_index)
result = result[start_index:end_index]
result = result[len("<TD NOWRAP>"):]
conn.close()
# 登出路由器
conn = httplib.HTTPConnection(ip, 80)
conn.request("GET", "LGO_logout.htm", None, headers)
response = conn.getresponse()
conn.close()
# 返回IP地址
return result
# 更新二級(jí)域名的IP
def updateDomain(ip):
os.system("curl \"http://update.dnsexit.com/RemoteUpdate.sv?login=XXXXXX&password=XXXXXX&host=XX.XXX.X&myip=%s\"" % ip)
# 更新二級(jí)域名的主流程
if __name__ == "__main__":
public_ip = getPublicIP(getGateway(), "XXXXX", "XXXXX")
print "public ip : %s" % public_ip
updateDomain(public_ip)