校园网DDNS

在校园网内实现局域网域名访问

在大学校园里一般在同一网段且能互相访问,基于这个原理,我用阿里云域名和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建立用户

在控制台页面鼠标在头像处悬停有访问控制项,进入
在这里插入图片描述
用户创建用户,之后选中控制台访问编程访问
在这里插入图片描述
登录名称显示名称自定义。会有短信的二级验证。之后会生成AccessKey ID和AccessKey Secret,记得保存,之后会用。

2.2 授权管理。在用户找到你的账户进行权限管理。

在这里插入图片描述

更多授权方式参考api文档-RAM鉴权
本次授权DNS相关操作,权限策略名称AliyunDNSFullAccess添加权限即可,至此RAM鉴权完成。

3.api准备。

在2.1步骤中我们得到了AccessKey ID和AccessKey Secret。然后查询api文档-API 预览。你可以手动添加一个域名之后更新记录只,或者更据api文档通过接口添加域名,显然前者要更简单一点。下面我们来说api接口,在阿里给的调试工具里可以提前实验。

在这里插入图片描述
参数解释都有,自行阅读。下面有实例代码,复制即可。但是RecordId(解析记录的ID)没有给出我们要通过另一个api获取——获取子域名解析记录
在这里插入图片描述
同上即可获取RecordId。

4.SDK准备。

阿里云的SDK市场选择安装所需SDK。详细信息阅读 API文档-SDK
目前我们使用核心库和DNS库。使用 python3 -m pip install aliyun-python-sdk-corepython3 -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可以在浏览器里查看,他不是路由的输入密码,而是路由器根据的登陆密码转换过来的。
在这里插入图片描述
路由器主页打开浏览器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方法,简单易用。
在这里插入图片描述
这里有一个工具——crontab时间计算工具,供大家参考。

8.端口映射。

此时设置的域名是路由器一级或者网关一级的,并不能访问到具体设备,要进行端口映射。在路由器里找到虚拟服务器。
在这里插入图片描述
外部端口自定义,建议选择未被占用的,典型的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.完整代码下载

猜你喜欢

转载自blog.csdn.net/qq_32270147/article/details/107526604