搭建自己的DDNS服务器教程
创作时间:
作者:
@小白创作中心
搭建自己的DDNS服务器教程
引用
1
来源
1.
https://www.cnblogs.com/darkchen/p/18044915
DDNS(动态域名系统)可以解决ADSL拨号和内网服务器无法提供稳定互联网IP的问题,通过域名绑定动态IP地址,实现域名与IP地址的动态解析。
前置条件
- 拥有公网地址:查看路由器WAN口地址是否是公网地址
- 在GoDaddy上注册一个自己的域名
- 一台海外主机
申请GoDaddy的API密钥
访问GoDaddy开发者平台申请API密钥,并复制保存。
GoDaddy API文档
参考GoDaddy API文档。API请求示例如下:
PUT https://api.godaddy.com/v1/domains/yourdomain.com/records/A/yoursubdomain
Content-Type: application/json
Authorization: sso-key yourkey:yoursecret
[
{
"data": "1.1.1.1",
"port": 65535,
"priority": 0,
"protocol": "string",
"service": "string",
"ttl": 600,
"weight": 0
}
]
Python实现方案
设计思路
- 服务端使用海外主机监听客户端发送的数据,并调用GoDaddy API更新域名解析
- 客户端定期连接服务器的socket,发送需要添加解析的域名
- 服务端验证客户端合法性和socket的源IP是否发生变动,变动后调用API更新解析记录
服务端代码
import requests
import socket
import logging
import os
import sys
import json
def logger():
log_name = os.path.join(base_dir, 'ddns.log')
logger = logging.getLogger()
fh = logging.FileHandler(log_name)
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
logger.setLevel(logging.WARNING)
logger.addHandler(fh)
return logger
def sock():
host = '0.0.0.0'
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
address = ('your_server_address', your_port)
s.bind(address)
s.listen(200)
while True:
try:
conn, addr = s.accept()
client_data = conn.recv(1024)
data = json.loads(client_data.decode('utf-8'))
key, domain = data['key'], data['domain']
print(key, domain)
except Exception as e:
log.warning(e)
continue
finally:
conn.close()
if key == 'your_custom_key':
newhost, port = addr
if newhost != host:
host = newhost
ddns(host, domain)
else:
pass
def ddns(host, domain):
try:
url = f'https://api.godaddy.com/v1/domains/yourdomain.com/records/A/{domain}'
headers = {
'accept': 'application/json',
'Content-Type': 'application/json',
'Authorization': 'sso-key yourkey:yoursecret'
}
data = [
{
"data": host,
"port": 65535,
"priority": 0,
"ttl": 600,
"weight": 0
}
]
response = requests.put(url, json=data, headers=headers)
log.warning(response)
except Exception as e:
log.warning(str(e))
if __name__ == '__main__':
base_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
log = logger()
sock()
客户端代码
import socket
import time
import logging
import os
import sys
def logger():
log_name = os.path.join(base_dir, 'ddns.log')
logger = logging.getLogger()
fh = logging.FileHandler(log_name)
formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s")
fh.setFormatter(formatter)
logger.setLevel(logging.WARNING)
logger.addHandler(fh)
return logger
def client(data):
while True:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(3)
s.connect(('your_server_address', your_port))
s.sendall(data.encode())
except Exception as e:
log.warning(str(e))
time.sleep(10)
if __name__ == '__main__':
base_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
data = '{"key":"your_custom_key","domain":"your_subdomain"}'
log = logger()
client(data)
注意事项
- 请将代码中的
yourdomain.com
、your_subdomain
、yourkey
、yoursecret
、your_custom_key
、your_server_address
和your_port
等占位符替换为实际值。 - 确保海外主机能够访问GoDaddy API。
- 客户端需要定期运行,建议使用定时任务(如cron)来实现。
热门推荐
家庭用什么冰箱最实用?家用冰箱怎么选最好?
如何选择高效保鲜的家庭冰箱:容量、技术与环保全面解析
最新研究:代谢组学结合质谱成像揭示黄葵胶囊治疗2型糖尿病肾病的疗效和机制
23省份人口年报:广东广西贵州为生育主力军 东三省十年缩减超千万人
2025重庆主城周边自驾一日游小众景点推荐(附路线)
高邮:“江苏绿心”澎湃绿色发展新动能
手套出口攻略:如何根据材质和用途精准归类?
买菜小技巧,虾选“直的”还是“弯的”,很多人不会选难怪不新鲜
光污染:原因、健康影响和解决方案
吃韭菜的好处与功效
红楼梦中李纨的命运有何变化?贾府抄家后的结局如何?
图书管理员素质项目:从信息素养到终身学习
图书馆管理员坐服务台需要哪些技能
鱼缸过滤方式全解析:原理、使用方法及优缺点
2024服贸会 | 探讨AI大模型在医疗健康及生命科学领域的应用挑战及未来前景
《传说之下》测评:颠覆传统RPG玩法的游戏体验
感冒发烧多喝水,喝的是什么水?
显卡驱动问题解决:实用技巧大全汇总
亿田集成灶拆机清洁方法(轻松学会拆卸和清洁亿田集成灶)
庆历新政:北宋仁宗时期的改革壮举
每天吃这种水果,死亡风险下降43%,冠心病风险下降21%?
泰国试管婴儿与国内技术对比:成功率、费用及政策差异解析
探秘水乡画卷,江苏同里古镇的旅游胜地
做红烧肉时,用冰糖还是白糖?多数人不懂,难怪肉不香不红还发黑
做红烧肉时,用冰糖还是白糖?多数人不懂,难怪肉不香不红还发黑
稳压管在电源电路中的关键作用与设计要点
免疫检查点抑制剂毒性的免疫机制
浓鲜豆腐海鲜汤的美味享受
掌握这4个人际关系原则,让沟通更顺畅!
调侃的艺术:如何在幽默中拉近朋友间的距离