windows环境下定时进行阿里云DDNS解析-程序员宅基地

技术标签: c#  阿里云  .net  服务器  windows  日常  

前言

        在国内想要申请公网的IPV4,机会渺茫,不过还好,现在三大运营商基本上都已经提供了IPV6了,等于给我们留了另外一条路,这次在做映射时,从网上找了些资料,发现几乎都没有公开源码,我对安全隐私方面还是比较讲究的,所以只能自己动手写一个了,希望可以帮助到相应的人。相应的源码请查看连接:(29条消息) AliDDNS.rar-网络基础文档类资源-CSDN文库icon-default.png?t=LA92https://download.csdn.net/download/rongrongZHR/41218114

        我这次使用的是阿里云的DDNS,阿里云官方已经提供了相应的SDK给我们使用,所以程序写起来还是比较简单的,本次使用到的阿里云SDK如下:aliyun-net-sdk-alidns.2.6.32、aliyun-net-sdk-core.1.5.10。

一、申请域名

        域名申请这种事情网上已经有很详细的教程,这里推荐直接参考阿里云的教程就可以了:注册通用域名 (aliyun.com)icon-default.png?t=LA92https://help.aliyun.com/document_detail/54068.html

二、添加解析

        1、选择对应的记录类型,AAAA表示IPV6的解析

        2、主机记录自己定义

        3、记录值可以先随便填一个,例如:2400::1,只要符合IPV6的格式就可以了

三、获取密钥

        如下图所示,记住自己的accessKeyId以及secret,等一下要用到。

 

四、使用程序

        在下载下来的源码中,进入AliDDNS\aliyunddns\bin\Debug,修改配置文件Config.json里面的内容,如下图所示:

        1、SubDomain:填写需要解析的域名

        2、填入从阿里云获取的accessKeyId以及secret

        3、填入电脑中对应网卡的MAC地址

        修改完毕之后,执行AliDDNS\aliyunddns\bin\Debug\aliyunddns.exe,执行完毕之后,查看logs文件中的信息,如果有报错,则根据报错提示进行相应的修改。

        如果没有报错,说明前面的配置都是OK的,此时已经可以使用域名进行操作了,例如想要访问电脑上部署的网站,可以在另外一台有IPV6的电脑上直接访问:域名:端口

五、定时执行

        因为IPV6的地址也不会固定的,隔一段时间会发生变更,如果不嫌麻烦,每隔一段时间就手动执行一下软件,到第四步基本上已经可以结束了,不过人总是会变懒的嘛,所以就在电脑上做一个定时任务就可以了。步骤如下:

        1、打开“任务计划管理器”

 

        2、创建任务

        3、设置常规项:“无论是否登录都执行”。

        3、设置触发器

        4、设置需要操作的程序

        5、 其他设置,根据自己的需要进行设置即可

        设置成功后,可以立即执行一次,查看logs文件中是否有报错。

 

 六、源码说明

        1、程序结构

        2、配置文件内容

        3、实体类不用自己编写,这里推荐一个网站:在线JSON转C#实体类,JSON转Java实体类 (sojson.com)icon-default.png?t=LA92https://www.sojson.com/json2entity.html

         4、Nlog配置文件,这个插件写日志特别好用,但是一直不会高级用法,现在都是使用配置文件中的默认方法,希望有高手可以指点一下。

         5、主函数

using System;
using System.Text;
using Aliyun.Acs.Alidns.Model.V20150109;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Newtonsoft.Json;
using System.Text.RegularExpressions;

namespace aliyunddns
{
    class Program
    {
        static void Main(string[] args)
        {    
            try
            {
                //获取Config文件并解析
                string configJson = Tool.GetConfig();
                ConfigJson json = JsonConvert.DeserializeObject<ConfigJson>(configJson);
                string SubDomain = json.SubDomain;
                string accessKeyId = json.accessKeyId;
                string secret = json.secret;
                string mac = Regex.Replace(json.mac, "-", "");

                //获取本地IPV6地址
                string localipv6str = Tool.GetAddr(mac);

                //调用阿里云查询接口获取域名的解析记录
                DescribeSubDomainRecordsRequest describeSubDomainRecordsRequest = new DescribeSubDomainRecordsRequest{SubDomain = SubDomain};
                IClientProfile profile = DefaultProfile.GetProfile("cn-hangzhou", accessKeyId, secret);
                DefaultAcsClient client = new DefaultAcsClient(profile);
                DescribeSubDomainRecordsResponse _get = client.GetAcsResponse(describeSubDomainRecordsRequest); //获取解析数据
                string getHttpResponse = Encoding.Default.GetString(_get.HttpResponse.Content);                 //获取解析数据的字符内容
                AliyunResponse aliyunResponse = JsonConvert.DeserializeObject<AliyunResponse>(getHttpResponse); //将字符内容转为实体类

                //如果远程记录的IP地址与本地记录的不一致,则进行修改
                if (localipv6str != aliyunResponse.DomainRecords.Record[0].Value)
                {
                    //定义修改远程解析所需要的信息
                    UpdateDomainRecordRequest updateDomainRecordRequest = new UpdateDomainRecordRequest
                    {
                        RR = aliyunResponse.DomainRecords.Record[0].RR,                     //子域名
                        Type = aliyunResponse.DomainRecords.Record[0].Type,                 //记录类型
                        _Value = localipv6str,                                              //需要修改的IP
                        RecordId = aliyunResponse.DomainRecords.Record[0].RecordId          //记录ID
                    };

                    var response = client.GetAcsResponse(updateDomainRecordRequest);        //调用接口进行修改
                    Tool.MessageManager("远程IP地址已修改为:" + localipv6str, MsgTypeEnum.info);
                }
                else
                {
                    Tool.MessageManager("远程记录IP地址与本地一致,不需修改,IP地址为:" + localipv6str, MsgTypeEnum.info);
                }

            }
            catch (Exception e)
            {
                Tool.MessageManager("故障:" + e.Message, MsgTypeEnum.error);
            }
        }
    }
}

        6、一些辅助函数,主要包括:读取配置文件、写log、获取本机有效IPV6

using NLog;
using System;
using System.IO;
using System.Net.NetworkInformation;
using System.Text;

namespace aliyunddns
{
    /// <summary>
    /// 消息类型枚举
    /// </summary>
    public enum MsgTypeEnum
    {
        /// <summary>
        /// 软件Bug
        /// </summary>
        error,

        /// <summary>
        /// 正常消息显示
        /// </summary>
        info,

        /// <summary>
        /// 运行Bug
        /// </summary>
        debug
    };

    public class Tool
    {
        static readonly private Logger logger = LogManager.GetCurrentClassLogger();

        public static void MessageManager(string msg, MsgTypeEnum type)
        {
            switch (type.ToString())
            {
                case "error": logger.Error(msg); break;         //软件级BUG
                case "info": logger.Info(msg); break;           //运行BUG
                case "debug": logger.Debug(msg); break;         //正常消息展示
                default: break;
            }
        }

        /// <summary>
        /// 读取文件函数
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public static string GetConfig()
        {
            string configPath = AppDomain.CurrentDomain.BaseDirectory + "Config.json";         //配置文件路径

            try
            {
                FileStream fileStream = new FileStream(configPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                int seekLength = (int)(fileStream.Length);
                byte[] buffer = new byte[seekLength];
                fileStream.Read(buffer, 0, seekLength);
                fileStream.Close();                                 //读取文本数据之后马上释放资源
                return Encoding.Default.GetString(buffer);
            }
            catch (Exception ex)
            {
                throw new Exception("读取【" + configPath + "】失败,失败原因:" + ex.Message);
            }
        }

        /// <summary>
        /// 获取IPV6
        /// </summary>
        /// <returns>有效IPV6地址</returns>
        public static string GetAddr(string mac)
        {
            try
            {
                if (!string.IsNullOrEmpty(mac))
                {
                    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();
                    foreach (NetworkInterface adapter in nics)
                    {
                        PhysicalAddress _mac = adapter.GetPhysicalAddress();                                             //网卡Mac地址
                        if (_mac.ToString() == mac)
                        {
                            IPInterfaceProperties ip = adapter.GetIPProperties();                                       //获取以太网卡网络接口信息                     
                            UnicastIPAddressInformationCollection ipCollection = ip.UnicastAddresses;                   //获取单播地址集
                            foreach (UnicastIPAddressInformation ipadd in ipCollection)
                            {
                                if (ipadd.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)     //只获取IPV6
                                {
                                    if (!ipadd.Address.ToString().ToLower().Contains("fe80"))                           //fe80开头的IP为无效IP
                                    {
                                        return ipadd.Address.ToString();
                                    }
                                }
                            }
                        }
                    }
                    throw new Exception("本机不存在mac地址为:" + mac + "的网卡,请检查配置文件");
                }
                else
                    throw new Exception("配置文件中mac为空,请检查配置文件");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    }
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/rongrongZHR/article/details/121302814

智能推荐

En-Tan-Mo(ETM)项目周报(6月14日~6月20日)-程序员宅基地

文章浏览阅读163次。亲爱的ETM小伙伴:近日,Facebook发布数字货币Libra,是伟大征途还是飞蛾扑火?区块链革命还是全球骗局?Anyway,ETM首席科学家Dr.Aaron Yuan是这样看的:不可否认,这对于整个区块链行业而言,是里程碑事件,因为Facebook做了BAT一直想做但没能做的事。但行业预期也不要过高,还要考虑到实际金融政策、技术落地等现实条件。严格意义上来说,...

NLP 自然语言初体验_~3abb31fzgf~-程序员宅基地

文章浏览阅读10w+次,点赞3次,收藏15次。本资料整理自 Kaggle上的Spooky NLP and Topic Modelling tutorialimport base64import numpy as npimport pandas as pd#Plotly imports 一种可视化工具import plotly.offline as pypy.init_notebook_mode(connected=True)..._~3abb31fzgf~

GUI编程Pyqt5之窗口部件_pyqt提升窗口部件-程序员宅基地

文章浏览阅读814次。Pyqt5之窗口部件简介一、基础窗口部件 QWidget1.1 窗口与窗口部件1.2 窗口几何布局二、其他窗口部件2.1 QFrame 类族2.2 按钮部件2.3 行编辑器2.4 数值设定框2.5 滑块部件简介QtDesigner提供的默认基类只有 QMainWindow、QWidget 和 QDialog 这3种。QMainWindow 是带有菜单栏和工具栏的主窗口类,QDialog 是各种对话框的基类,而它们全部继承自 QWidget。不仅如此,其实所有的窗口部件都继承自 QWidget,如下图所_pyqt提升窗口部件

山东创睦网络科技:Go爬虫框架-程序员宅基地

文章浏览阅读203次。本项目基于golang开发,是一个开放的垂直领域的爬虫框架,框架中将各个功能模块区分开,方便使用者重新实现子模块,进而构建自己垂直方方向的爬虫。本项目将爬虫的各个功能流程区分成Spider模块(主控),Downloader模块(下载器),PageProcesser模块(页面分析),Scheduler模块(任务队列),Pipeline模块(结果输出);执行过程简述:Spider模块从Scheduler模块中获取包含待抓取url的Request对象,启动一个协程,一个协程执行一次爬取过程,此处我们把协程也_go爬虫框架

Swift之函数的语法分析和使用示例_swift 函数参数-程序员宅基地

文章浏览阅读3.7w次,点赞5次,收藏6次。一、函数简介Swift 函数用来完成特定任务的独立的代码块。Swift 使用一个统一的语法来表示简单的 C 语言风格的函数到复杂的 Objective-C 语言风格的方法:函数声明:告诉编译器函数的名字,返回类型及参数。函数定义:提供了函数的实体。Swift 函数包含了参数类型及返回值类型。二、函数定义Swift 定义函数使用关键字 func,定义函数的时候,可以指定一个或多个输入参数和一个返回值类型。每个函数都有一个函数名来描述它的功能,通过函数名以及对应类型的参数值_swift 函数参数

在git commit -m 的注释中加入特殊符号,包括单引号和双引号的方法_git commit 时验证单双引号-程序员宅基地

文章浏览阅读3.2k次。方法1: Use double quotes to add single quote in the message:git commit -m "cracked enigma's code"方法2:When you have some special characters to add in the commit message, edit the message in a edit..._git commit 时验证单双引号

随便推点

前端代码部署到docker_使用s3将具有sagemaker的自定义docker模型部署到无服务器前端...-程序员宅基地

文章浏览阅读632次。前端代码部署到docker 介绍 (Introduction)Deploying a model with AWS SageMaker is a great way to allow users or customers to interact with it. While you can use the many algorithms and models that come with Sag..._boto3.client( 'runtime.sagemaker' )

html瀑布流布局是什么,瀑布流布局图片与css多种实现思路剖析-程序员宅基地

文章浏览阅读4.1k次。一、什么是瀑布流布局瀑布流布局在当下前端网页设计中越来越流行,主要表现形式为上下高度参差不齐的多行布局,往往图片各异大小不等却能够自动适应排成一排按行进行展示,滚动条下拉还不会不断地自动适应加载数据一直加载到网站最底部,布局方式见下图:瀑布流布局的方式多用在较新颖的图片站点,为了提高用户访问的视觉体验而推出的具有高效吸引力的布局方式,只需要手指滑动一下鼠标滑轮,错落有致的唯美布局便随着滚动的滑轮慢..._html瀑布流布局

信号完整性之串扰仿真(一)-程序员宅基地

文章浏览阅读7.2k次,点赞14次,收藏77次。一、串扰仿真以下Ansys SIwave 和Cadence Sigrity的串扰仿真操作流程,Cadence Sigrity 用到的组件是Power SI 和SPEED2000。可以在时域和频域两个角度来查看串扰的数据,话不多说,上图:1.Ansys SIwave 串扰的时域和频域仿真(一)Ansys SIwave 串扰的时域仿真下面我们按照SIwave提供的流程指导进行仿真设置:1.首先通过ANSYS Electronics Desktop软件来把brd文件导入SIwave中。2.根据向导_串扰仿真

Windows下Golang开发环境搭建以及遇到的sdk问题和调试问题-程序员宅基地

文章浏览阅读587次。GoLand无法导入SDK问题目前go的版本为1.17.2但是,在我的多次尝试下安装之后,在使用各种集成环境去开发go程序时会遇到无法配置go的sdk的问题。(The selected directory is not valid home for SDK.)解决在新建go项目的时候会让选择SDK,分为local和download,当时自己下载的是1.17.2的最新..._go sdk in wsl cannot be used for the windows project

电气控制电路图——(2)分析_分析控制电路通常采用-程序员宅基地

文章浏览阅读5.9k次,点赞7次,收藏33次。本文主要总结了在学会识电气控制电路图后怎么对电气控制电路图进行分析。详细写了电气原理图阅读分析的方法和步骤,电力拖动特点及控制要求、主电路以及控制电路的分析,具体以C650车床为例来进行介绍。_分析控制电路通常采用

在vue中引用iconfont中的图标完整教程(两种方式):直接引用和在data中存放_vue 向data.icon中加图标-程序员宅基地

文章浏览阅读513次。1.打开iconfont官网 https://www.iconfont.cn/ ,搜索图标,例如这里搜索csdn图标:2.选择你喜欢的图标,添加入库:3.点击购物车,添加至项目4.可以选择已存在的项目,或者新建项目5.选择Unicode格式下载至本地6.下载完成后解压,只保留图片中的5个文件,其余的删除7.将这5个文件复制到vue项目中的assets目录下,比如我的路..._vue 向data.icon中加图标

推荐文章

热门文章

相关标签