在大学校园里一般在同一网段且能互相访问,基于这个原理,我用阿里云域名和DNS+ tp路由器实现使用域名访问
注意全程要实名认证的前提下
所谓RAM鉴权就是给api接口访问的权限,这是阿里的一种安全措施。
在控制台页面鼠标在头像处悬停有访问控制项,进入
在用户中创建用户,之后选中控制台访问和编程访问
登录名称和显示名称自定义。会有短信的二级验证。之后会生成AccessKey ID和AccessKey Secret,记得保存,之后会用。
更多授权方式参考api文档-RAM鉴权
本次授权DNS相关操作,权限策略名称为 AliyunDNSFullAccess添加权限即可,至此RAM鉴权完成。
在2.1步骤中我们得到了AccessKey ID和AccessKey Secret。然后查询api文档-API 预览。你可以手动添加一个域名之后更新记录只,或者更据api文档通过接口添加域名,显然前者要更简单一点。下面我们来说api接口,在阿里给的调试工具里可以提前实验。
参数解释都有,自行阅读。下面有实例代码,复制即可。但是RecordId(解析记录的ID)没有给出我们要通过另一个api获取——获取子域名解析记录。
同上即可获取RecordId。
在阿里云的SDK市场选择安装所需SDK。详细信息阅读 API文档-SDK。
目前我们使用核心库和DNS库。使用 python3 -m pip install aliyun-python-sdk-core
和python3 -m pip install aliyun-python-sdk-alidns
安装,注意是python3。至此SDK安装完成。
我使用了tp模拟登录方式,大家可以使用其他的。
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不变。
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地址。
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
这段代码是阿里云给的实例代码。
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
。所以有必要写写如果没有变化不提交的步骤。
我使用了crontab方法,简单易用。
这里有一个工具——crontab时间计算工具,供大家参考。
此时设置的域名是路由器一级或者网关一级的,并不能访问到具体设备,要进行端口映射。在路由器里找到虚拟服务器。
外部端口自定义,建议选择未被占用的,典型的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.完整代码下载