前言
去年自己写的一段代码了,那时候想出门在外也能访问到家里的服务器,后来大部分照片、视频都已经搬到云端,也就没怎么维护过了,正常运行了好几个月,应该还是可以的。今天看到论坛里有网友还在想怎么实现外网获取家宽的动态外网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,就可以自己动态解析。
有关python
的SDK
可参考:
https://github.com/aliyun/aliyun-openapi-python-sdk/tree/master/aliyun-python-sdk-alidns
更新域名DNS
记录可参考:
https://help.aliyun.com/document_detail/29774.html?spm=a2c4g.11186623.6.637.30bc30b1zF6V5Z
「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」
(๑>ڡ<)☆谢谢老板~
使用微信扫描二维码完成支付