天天看點

校園網DDNS在校園網内實作區域網路域名通路

目錄

  • 在校園網内實作區域網路域名通路
    • 一、準備
        • 域名
        • 擷取ip位址
        • 定時解析
    • 二、 域名解析
          • 1.購買域名[阿裡雲](https://wanwang.aliyun.com/domain/1yuan/)
          • 2.RAM鑒權
            • 2.1建立使用者
            • 2.2 授權管理。在使用者找到你的賬戶進行權限管理。
          • 3.api準備。
          • 4.SDK準備。
          • 5.需要解析的IP準備。
            • 5.1 stok擷取
            • 5.2擷取ip
          • 6.更新記錄值。
            • 6.1RecordId擷取。
            • 6.1 設定記錄值。
          • 7.定時運作。
          • 8.端口映射。
    • 完成
    • 其他

在校園網内實作區域網路域名通路

在大學校園裡一般在同一網段且能互相通路,基于這個原理,我用阿裡雲域名和DNS+ tp路由器實作使用域名通路

一、準備

域名

  • 我适用了阿裡雲的域名 。理由便宜(新使用者首年1元起),api友善
  • 大家也可用其他的。據我了解cloudflare也比較好用但是api沒寫過

擷取ip位址

  • 我本人用的是TP的路由器,使用python爬蟲的方式爬取路由器的ip
  • 如果大家使用其他的路由器大同小異都可爬取IP位址
  • 如果是直接接入校園網更簡單,随便一搜就是方法。(注意不是192.168.x.x網段的)

定時解析

  • 使用域名提供商的api+python+linux 的定時運作任務實作定時解析
  • 關于伺服器裝置選擇,都可以通用各種平台。有資本可以跑一個PC機,低成本實作就在樹莓派上跑。
  • linux的定時任務 使用crontab,友善簡單

二、 域名解析

1.購買域名阿裡雲

注意全程要實名認證的前提下

2.RAM鑒權

所謂RAM鑒權就是給api接口通路的權限,這是阿裡的一種安全措施。

2.1建立使用者

在控制台頁面滑鼠在頭像處懸停有通路控制項,進入

校園網DDNS在校園網内實作區域網路域名通路

在使用者中建立使用者,之後選中控制台通路和程式設計通路

校園網DDNS在校園網内實作區域網路域名通路

登入名稱和顯示名稱自定義。會有短信的二級驗證。之後會生成AccessKey ID和AccessKey Secret,記得儲存,之後會用。

2.2 授權管理。在使用者找到你的賬戶進行權限管理。

校園網DDNS在校園網内實作區域網路域名通路

更多授權方式參考api文檔-RAM鑒權

本次授權DNS相關操作,權限政策名稱為 AliyunDNSFullAccess添權重限即可,至此RAM鑒權完成。

3.api準備。

在2.1步驟中我們得到了AccessKey ID和AccessKey Secret。然後查詢api文檔-API 預覽。你可以手動添加一個域名之後更新記錄隻,或者更據api文檔通過接口添加域名,顯然前者要更簡單一點。下面我們來說api接口,在阿裡給的調試工具裡可以提前實驗。

校園網DDNS在校園網内實作區域網路域名通路

參數解釋都有,自行閱讀。下面有執行個體代碼,複制即可。但是RecordId(解析記錄的ID)沒有給出我們要通過另一個api擷取——擷取子域名解析記錄。

校園網DDNS在校園網内實作區域網路域名通路

同上即可擷取RecordId。

4.SDK準備。

在阿裡雲的SDK市場選擇安裝所需SDK。詳細資訊閱讀 API文檔-SDK。

目前我們使用核心庫和DNS庫。使用

python3 -m pip install aliyun-python-sdk-core

python3 -m pip install aliyun-python-sdk-alidns

安裝,注意是python3。至此SDK安裝完成。

5.需要解析的IP準備。

我使用了tp模拟登入方式,大家可以使用其他的。

5.1 stok擷取

def loginInRouter():
    """ 登陸路由器或者對應的stok
    Args:
         None
    Returns:
        toke:路由器傳回的stok
            -1:為擷取失敗
    """   
    url = "http://192.168.1.1/"
    request_body = '{"method":"do","login":{"password":"********"}}'
    header = {"Content-Type": "application/json"}
    res = requests.post(url, data=request_body, headers=header)
    res = res.json()
    code, stok = int(res["error_code"]), res["stok"]
    if(code == 0):
        info("get stok and stok:{}".format(stok))
        return stok
    else:
        error("擷取stok失敗")
        return -1
           

對于password可以在浏覽器裡檢視,他不是路由的輸入密碼,而是路由器根據的登陸密碼轉換過來的。

校園網DDNS在校園網内實作區域網路域名通路

路由器首頁打開浏覽器network。192.168.1.1的POST請求的傳回時有password。

此時stok擷取了,在根據stok擷取IP位址,注意每次登入的stok不相同是以要每次都要擷取一邊stok,但是password不變。

5.2擷取ip

def getRouterIp(stok):
    """ 擷取路由器目前的擷取的内網ip
    Args:
        stok:登陸時擷取到的stok
    Returns:
        None
    """  
    if(stok != -1):
        url = "http://192.168.1.1/stok={}/ds".format(stok)
        request_body = '''
            {
            "network": {
                "name": "wan_status"
            },
            "cloud_config": {
                "name": [
                    "new_firmware",
                    "device_status",
                    "bind"
                ]
            },
            "wireless": {
                "name": [
                    "wlan_wds_2g",
                    "wlan_wds_5g"
                ]
            },
            "method": "get"
            }            
        '''
        header = {"Content-Type": "application/json"}
        res = requests.post(url, data=request_body, headers=header)
        res = res.json()    
        return res['network']['wan_status']['ipaddr']
    else:
        error("擷取ip失敗")
        return -1
           

此時傳回的值便是ip位址。

6.更新記錄值。

6.1RecordId擷取。

def GetRecordId():
    accessKeyId='your  accessKeyId'
    accessSecret='your accessSecret '
    client = AcsClient(accessKeyId, accessSecret, 'cn-hangzhou')
    request = DescribeSubDomainRecordsRequest()
    request.set_accept_format('json')
    request.set_SubDomain("your domain")
    response = client.do_action_with_exception(request)
    RecordId=json.loads(str(response, encoding='utf-8'))['DomainRecords']['Record'][0]['RecordId']
    # print(RecordId)
    return RecordId
           

這段代碼是阿裡雲給的執行個體代碼。

6.1 設定記錄值。

def setDns(ip="8.8.8.8",RecordId='4512578625647894589'):

    accessKeyId='your  accessKeyId'
    accessSecret='your accessSecret '
    client = AcsClient(accessKeyId,accessSecret, 'cn-hangzhou')
    request = UpdateDomainRecordRequest()
    request.set_accept_format('json')
    print(RecordId)
    request.set_RecordId(RecordId)
    request.set_RR("RR")
    request.set_Type("A")
    # print(ip)
    request.set_Value(ip)

    response = client.do_action_with_exception(request)

    # print(response)
    return True
           

此時就算基本完成。然後處理一下代碼之間的邏輯關系,有興趣可以寫寫log友善調試。值得注意的是,如果更新記錄值沒有改變,會傳回400的錯誤

HTTP Status: 400 Error:DomainRecordDuplicate The DNS record already exists. RequestID: 1E20C9A1-BFDF-4E22-ACC4-2CA5CC690CE2

。是以有必要寫寫如果沒有變化不送出的步驟。

7.定時運作。

我使用了crontab方法,簡單易用。

校園網DDNS在校園網内實作區域網路域名通路

這裡有一個工具——crontab時間計算工具,供大家參考。

8.端口映射。

此時設定的域名是路由器一級或者網關一級的,并不能通路到具體裝置,要進行端口映射。在路由器裡找到虛拟伺服器。

校園網DDNS在校園網内實作區域網路域名通路

外部端口自定義,建議選擇未被占用的,典型的80 443 1080 3389 22 23 8080就不要用了。

常見端口 功能
80 http服務
443 https服務
22 SSH
1080 SOCK5
3389 windows遠端桌面
21 FTP
110 POP3 Post Office Protocol(E-mail)

端口映射前要綁定IP和MAC位址,以防DHCP變化裝置IP造成無法通路。

完成

到這裡你可以在校園網内自由通路,最爽的是windows的Remote Desktop各平台都有軟體,想想能在pad或者手機幾乎零延時遠端控制。或者任意地方通路SSH不爽嗎???

其他

1.西安電子科技大學不做修改可直接應用

2.歡迎大家通路我的部落格

3.完整代碼下載下傳