利用服务器自建DDNS功能-在家里建个云盘啥的
前言
去年自己写的一段代码了,那时候想出门在外也能访问到家里的服务器,后来大部分照片、视频都已经搬到云端,也就没怎么维护过了,正常运行了好几个月,应该还是可以的。今天看到论坛里有网友还在想怎么实现外网获取家宽的动态外网IP
,就想着干脆写下来,权当记录了。代码不多,只是用的阿里服务器相关的API
去操作域名记录,这块自己去官网上看看吧。
程序就两部分:客户端和服务器端。
准备工具:服务器一台,域名一个,家里随意低功率设备一台(带python
)
环境:客户-debian5.0
(别问为什么这么旧,老的wd book live
),python2.5.2
;服务器-CentOS7
,python2.7.2
一、客户端
import socket |
|
import time |
|
ip_port = ('39.105.165.117',9988) |
|
sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0) |
|
sk.setblocking(0) |
|
while True: |
|
try: |
|
sk.sendto('u2v.cn',ip_port) |
|
data = sk.recvfrom(1024) |
|
print(data) |
|
except: |
|
print('network error!') |
|
time.sleep(5) |
|
sk.close() |
对,客户端就这么简单,只是每隔5
秒和服务器端IP:port
联系一下,让服务器端知道自己的外网IP
就完事了;当然时间间隔可以自己调整。找个家里的低功率设备部署上去就可以了,可以是群晖、路由、树莓派等等。
二、服务器端
import socket |
|
from aliyunsdkcore.client import AcsClient |
|
from aliyunsdkcore.request import CommonRequest |
|
from aliyunsdkcore.acs_exception.exceptions import ClientException |
|
from aliyunsdkcore.acs_exception.exceptions import ServerException |
|
class server: |
|
def __init__(self): |
|
self.ip_port = ('0.0.0.0',9988) |
|
self.sk = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0) |
|
self.sk.bind(self.ip_port) |
|
self.main() |
|
def main(self): |
|
host_old = '42.238.221.80' |
|
a=0 |
|
b=0 |
|
while True: |
|
data,(host,port) = self.sk.recvfrom(1024) |
|
print(data,host,port,host_old) |
|
self.sk.sendto('ok', (host,port)) |
|
if host != host_old: |
|
print('update DNS start ...') |
|
a=self.updateDNS('3985**********1456','www','A',host) |
|
b=self.updateDNS('3985**********2832','@','A',host) |
|
print('update DNS end ...') |
|
if a==0 and b==0: |
|
host_old = host |
|
def updateDNS(self,RecordId,RR,Type,Value): |
|
client = AcsClient('LT*******tKX', 'Jmdpz*****************vg1Eag', 'cn-hangzhou') |
|
request = CommonRequest() |
|
request.set_accept_format('json') |
|
request.set_domain('alidns.aliyuncs.com') |
|
request.set_method('POST') |
|
request.set_version('2015-01-09') |
|
request.set_action_name('UpdateDomainRecord') |
|
request.add_query_param('RecordId', RecordId) |
|
request.add_query_param('RR', RR) |
|
request.add_query_param('Type', Type) |
|
request.add_query_param('Value', Value) |
|
request.add_query_param('TTL', '600') |
|
try: |
|
response = client.do_action_with_exception(request) |
|
print(response) |
|
except ServerException as e: |
|
print e |
|
return -1 |
|
except ClientException as e: |
|
print e |
|
return -1 |
|
return 0 |
|
# python3: print(str(response, encoding = 'utf-8')) |
|
if __name__ == '__main__': |
|
server() |
服务器并没有实现太多功能,我这只是根据IP
变化更新一下阿里云两条DNS
记录的值。这里需要自己获取DNS
记录的id
填写上去。
其他家的域名解析也是同样的道理,只要提供的解析API,就可以自己动态解析。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
本文地址:/aigaoji/1275.html