为家庭公网IP配置DDNS域名

news2024/12/27 12:49:16

文章目录

    • 域名配置
    • 域名更新
    • frp配置修改

在成功完成frp改造Windows笔记本实现家庭版免费内网穿透之后,某天我突然发现内网穿透失效了,一番排查之后原来是路由器对应的公网IP更换了。果然我分到的并不是固定的公网IP,而是会定期变化的。为了免受定期在配置文件中更换IP之苦,我决定将变化的IP与固定的域名绑定,过上懒人该过的快乐躺平生活。

DDNS(Dynamic DNS,动态DNS)是一种网络服务,它允许您将静态域名(如example.com)绑定到动态IP地址。动态IP地址通常是指从互联网服务提供商(ISP)获得的IP地址,这些地址可能会在用户每次连接到互联网时发生变化。
DDNS服务的核心功能是跟踪用户IP地址的变化,并在IP地址发生变化时自动更新域名解析记录,确保域名始终指向当前的IP地址。这样,即使用户的IP地址发生变化,其他网络用户仍然可以通过静态域名访问到用户的服务或设备。

域名配置

进入阿里云一元域名购买页,搜索合适的域名并斥巨资一元购买,接下来一年你就拥有了一个可用的IP。
然后准备好身份证,按照指引完成实名认证。
进入解析设置页,将域名与当前的IP绑定,虽然生效时间写着十分钟,不过实测是立即生效的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

域名更新

首先在Windows下的Python3环境中装这几个包:

pip3 install aliyun-python-sdk-core-v3 --user
pip3 install aliyun-python-sdk-domain --user
pip3 install aliyun-python-sdk-alidns --user

根据创建AccessKey教程,按如下步骤创建RAM用户的AccessKey:
在这里插入图片描述
添加权限:
在这里插入图片描述

复制AccessKey ID和AccessKey Secret或直接导出CSV文件
在这里插入图片描述
查看API使用文档:
在这里插入图片描述
编写如下代码更新dns:

import warnings
warnings.filterwarnings('ignore')
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from aliyunsdkcore.auth.credentials import AccessKeyCredential
import json
from urllib.request import urlopen
 
class DnsUpdater:
    def __init__(self):
        accessKeyId = "***"
        accessSecret = "***"
        credentials = AccessKeyCredential(access_key_id=accessKeyId, access_key_secret=accessSecret)
        self.client = AcsClient(region_id='cn-hangzhou', credential=credentials)
        self.domain = "***"
        self.myip = self.get_ip()

        def get_ip(self):
        ip = urlopen('https://api-ipv4.ip.sb/ip').read()  
        ipv4 = str(ip, encoding='utf-8').strip()
        print("\n本机当前IP为:", ipv4)
        return ipv4

    def DescribeDomainRecords(self):
       request = CommonRequest()
       request.set_accept_format('json')
       request.set_domain('alidns.cn-hangzhou.aliyuncs.com')
       request.set_method('POST')
       request.set_protocol_type('https')
       request.set_version('2015-01-09')
       request.set_action_name('DescribeDomainRecords')
       request.add_query_param('DomainName', self.domain)
       response = self.client.do_action(request)
       data = json.loads(response.decode('utf-8'))
       order = 1
       for item in data["DomainRecords"]["Record"]:
           print("域名"+str(order)+":", item["DomainName"])
           print("IP"+str(order)+":", item["Value"])
           order += 1
           if item["DomainName"] == self.domain:
               self.RecordId = item["RecordId"]
               self.RR = item["RR"]
               self.Type = item["Type"]
               self.RecordIp = item["Value"]

    def UpdateDomainRecord(self):
       request = CommonRequest()
       request.set_accept_format('json')
       request.set_domain('alidns.cn-hangzhou.aliyuncs.com')
       request.set_method('POST')
       request.set_protocol_type('https')
       request.set_version('2015-01-09')
       request.set_action_name('UpdateDomainRecord')
       request.add_query_param('RecordId', self.RecordId)
       request.add_query_param('RR', self.RR)
       request.add_query_param('Type', self.Type)
       request.add_query_param('Value', self.myip)
       response = self.client.do_action(request)
       print(str(response, encoding = 'utf-8'))

    def QueryDSRecord(self):
       request = CommonRequest()
       request.set_accept_format('json')
       request.set_domain('domain.aliyuncs.com')
       request.set_method('POST')
       request.set_protocol_type('https')
       request.set_version('2018-01-29')
       request.set_action_name('QueryDSRecord')
       request.add_query_param('DomainName', self.domain)
       response = self.client.do_action(request)
       print(str(response, encoding = 'utf-8'))


if __name__ == '__main__':
    dnsupdater = DnsUpdater()
    dnsupdater.DescribeDomainRecords()
    if dnsupdater.myip != dnsupdater.RecordIp:
        print("主机IP与公网IP不一致,进入更新模式")
        print(dnsupdater.myip)
        print(dnsupdater.RecordIp)
        dnsupdater.UpdateDomainRecord()

frp配置修改

将服务器端的start.bat修改如下

@echo off
:home
python3 updateDNS.py
frps -c frps.toml
goto home

最后将客户端的toml中文件的IP地址设置为域名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1638647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中间件之异步通讯组件RabbitMQ入门

一、概述 微服务一旦拆分,必然涉及到服务之间的相互调用,目前我们服务之间调用采用的都是基于OpenFeign的调用。这种调用中,调用者发起请求后需要等待服务提供者执行业务返回结果后,才能继续执行后面的业务。也就是说调用者在调用…

解决IDEA下springboot项目打包没有主清单属性

1.问题出现在SpringBoot学习中 , 运行maven打包后无法运行 报错为spring_boot01_Demo-0.0.1-SNAPSHOT.jar中没有主清单属性 SpringBoot版本为 2.6.13 Java 版本用的8 解决方法 1.执行clean 删除之前的打包 2.进行打包规范设置 2.1 3.进行问题解决 (借鉴了阿里开发社区) 使用…

OpenCV(二)—— 车牌定位

从本篇文章开始我们进入 OpenCV 的 Demo 实战。首先,我们会用接下来的三篇文章介绍车牌识别 Demo。 1、概述 识别图片中的车牌号码需要经过三步: 车牌定位:从整张图片中识别出牌照,主要操作包括对原图进行预处理、把车牌从整图…

碳纤维复合材料的纳米纤维膜

碳纤维复合材料的纳米纤维膜是一种具有良好性能和应用前景的新材料。以下是关于这种材料的详细介绍: 制备方法:碳纤维复合材料的纳米纤维膜可以通过多种方法制备,包括化学气相沉积法、固相合成法、模板法等。其中,化学气相沉积法是…

Docker——部署LNMP架构

目录 一、LNMP架构概述 1.项目环境 2.服务器环境 3.需求 二、搭建Linux系统基础镜像 三、部署Nginx 1.建立工作目录 2.编写Dockerfile脚本 3.准备Nginx.conf配置文件 4.生成镜像 5.创建自定义网络 6.启动镜像容器 7.验证Nginx 三、部署Mysql 1.建立工作目录 2.编…

MathType打开的窗口太多 MathType说打开窗口太多无法复制怎么解决

在数学文档编辑中,MathType作为一款常用的数学公式编辑工具,使用过程中,我们常常会遇到一些问题,比如MathType打开的窗口过多导致软件运行缓慢甚至崩溃,以及在复制过程中出现“打开窗口太多,无法复制”的提…

2024年教你怎么将学浪视频保存到本地

你是否曾为无法将学浪视频保存到本地而烦恼?现在,我们将在2024年教给你如何解决这个问题!只需简单几步操作,即可轻松将学浪视频保存到您的本地设备,随时随地想看就看! 我已经将下载学浪的工具打包好了&…

使用FPGA实现并行乘法器

介绍 并行乘法器,那么它的输入输出就都是并行的数据了,相对来说,内部的结构就更复杂了,占用的资源就更多了。以后有需要完成这部分操作的话都可以调用IP核。 乘法器模块 这是一个纯组合逻辑电路,我们也知道&#xff0…

C++--const成员及const取地址操作符重载

前言 今天我们来了解一下const成员的基本使用,以及const取地址重载的运用 来开始今天的学习 const成员 1.基本定义, 将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数 隐含的*this指针,表明在该成员函…

队列以及信号量

什么是队列 队列又称消息队列,是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任 务间传递信息。 为什么不使用全局变量? 如果使用全局变量,兔子(任务1)修改了变量 a ,等待树…

LeetCode LCR 179. 和为s的两个数字

原题链接:LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode) 题目的意思:通过给定的数组,找出两个值,相加并等于目标值。 第一种思路,暴力枚举,伪代码如下: for (…

【Linux】详解信号的保存信号屏蔽字的设置

一、信号处理的一些常见概念 实际执行信号的处理动作称为信号递达(Delivery)。信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞 (block )某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。注意:阻…

传感器测试脉冲电源 —测试传感器性能的电源设备

传感器测试脉冲电源是一种专门用于测试传感器性能的电源设备。传感器测试脉冲电源可以输出不同幅值、频率和形状的脉冲信号,以模拟传感器在实际应用中可能遇到的各种电压和电流波形。通过这种电源,可以对传感器进行全面的性能测试,包括动态响…

信号,信号列表,信号产生方式,信号处理方式

什么是信号 信号在我们的生活中非常常见;如红绿灯,下课铃,游戏团战信号,这些都是信号;信号用来提示接收信号者行动,但接收信号的人接收到信号会进行一系列的行为,完成某个动作;这就…

qt学习篇---界面按键关联(信号和槽)

目录 1.qt基础 2.做一个界面 创建project UI界面设计 信号和槽 1.控件改名字 2.什么是信号和槽 3.怎么关联信号和槽 自动关联 手动关联 1.qt基础 qt可移植性强,不久会用到MCU。很有意义学习 2.做一个界面 创建project 不要中文路径 选择QWidget .pro文件…

字符串函数与字符函数运用(1)

字符串与字符函数介绍1 前言一、字符分类函数字符函数练习 二、字符函数转换1.引入库2.代码改进 字符串函数strlen函数strcpy 结尾 前言 字符串函数大概有以下这几种 strcpy、strcat 、strcmp、strncpy、strncat、strncmp、strstr、strtok、strerror 这些函数可以很好的解决你…

数据结构的队列(c语言版)

一.队列的概念 1.队列的定义 队列是一种常见的数据结构,它遵循先进先出的原则。类似于现实生活中排队的场景,最先进入队列的元素首先被处理,而最后进入队列的元素则要等到前面的元素都被处理完后才能被处理。 在队列中,元素只能…

什么,你的EasyExcel导出一万条数据就OOM了?

前言 前段时间在做一个导出的功能,本以为是平平无奇的一个功能。就用公司内部的一个导出工具类三下五除二就写完了,做法是直接查全量数据,然后直接往Excel里写。一开始没多少数据也没什么问题,但是当数据量逐渐多了起来后&#x…

【OpenCV • c++】图像平滑处理(2) —— 方框滤波 | 盒滤波 | 源码分析

文章目录 前言一、方框滤波代码演示 二、源码分析 前言 前文我们了解了什么是图像平滑处理、图像滤波、邻域算子与线性邻域滤波、以及如何使用方框滤波,本文我们来分析一下方框滤波的源码。 一、方框滤波 void boxFilter(InputArray src, OutputArray dst, int ddep…

面试常见 | 项目上没有亮点,如何包装?

很多技术人在公司用的老技术,而且很多都是搬业务代码且做枯燥乏味的CRUD,在面试提交简历或做自我介绍的时候并不突出,这种情况,如何破局? 首先不管你做的啥项目,全世界不可能只有你自己在做,比…