首页 > 爱搞机

利用服务器自建DDNS功能-在家里建个云盘啥的

moxiang 爱搞机 2020-10-08 12:01:09
利用服务器自建DDNS功能-在家里建个云盘啥的

前言

去年自己写的一段代码了,那时候想出门在外也能访问到家里的服务器,后来大部分照片、视频都已经搬到云端,也就没怎么维护过了,正常运行了好几个月,应该还是可以的。今天看到论坛里有网友还在想怎么实现外网获取家宽的动态外网IP,就想着干脆写下来,权当记录了。代码不多,只是用的阿里服务器相关的API去操作域名记录,这块自己去官网上看看吧。

程序就两部分:客户端和服务器端。
准备工具:服务器一台,域名一个,家里随意低功率设备一台(带python)
环境:客户-debian5.0(别问为什么这么旧,老的wd book live),python2.5.2;服务器-CentOS7python2.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

留言与评论(共有 0 条评论)
   
验证码:

潘少俊衡

| 桂ICP备2023010378号-4

Powered By EmpireCMS

爱享小站

中德益农

谷姐神农

环亚肥料

使用手机软件扫描微信二维码

关注我们可获取更多热点资讯

感谢潘少俊衡友情技术支持