原文地址:http://www.yxxrui.cn/article/179.shtml

未经许可请勿转载,如有疑问,请联系作者:yxxrui@163.com

我遇到的问题:公司的网络没有固定的公网IP地址,但是需要能够保证的是,每次动态分配的IP地址均为独立的公网IP,只是每次分配后会在1-2天后更换,或者重启路由器后更换,为了能够把这个公网IP利用起来,大家常用的是使用花生壳之类的软件来操作,我使用过花生壳的多款产品,挺好的,就是有一下几个缺点:

1、需要使用花生壳上购买的域名才行,或者使用免费的壳域名,其丑无比

2、不稳定,也很慢

3、限制流量,超流量需要收费

4、限制端口,特定端口需要收费

5、需要在电脑上运行一个花生壳的软件

解决方案:但是为了解决问题,我开始摸索自己搞定它,公司域名从阿里云上购买,阿里云提供云解析技术免费版,提供通过api来管理域名的功能,当我看到该文档的时候直接就看到了希望,解决起来绝对没问题了。首先需要确认一下,有两种情况:

1、公司服务器直接接入网线,这个时候服务器的IP就是公网IP

2、公司服务器链接公司路由器,路由器链接网线,这个时候路由器上是公网IP,而服务器上是局域网IP

第一种情况最简单了,不需要设置什么了,第二种情况需要到路由器设置界面设置端口转发或者直接将全部端口映射到内网的服务器IP上,这样的话,访问公网IP的某个端口时相当于访问内网IP的映射端口,比如路由器IP为125.120.83.30,内网IP为192.168.168.168。可以将路由器中80端口映射到192.168.168.168的80端口上。

到阿里云控制台申请accessKeyIdaccessKeySecret,用来调用API的,为了简单起见,先给域名添加一条解析记录,这样就不需要在程序里判断该域名是否已创建,然后可以直接修改解析记录了。比如我的域名为yxxrui.cn,记录值为blog,也就是要把子域名blog.yxxrui.cn指向我自己电脑125.120.83.30上。

下边直接贴出代码:

using System;
using System.Configuration;
using System.Net;
using System.Text;
using Aliyun.Acs.Alidns.Model.V20150109;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile; namespace AliyunDomain
{
class Program
{
private static readonly string RegionId=GetConfig("regionId");
private static readonly string AccessKeyId=GetConfig("accessKeyId");
private static readonly string AccessKeySecret=GetConfig("accessKeySecret");
private static string _recordId = GetConfig("recordId");
private static readonly string Domain = GetConfig("domain");
private static readonly string Rr = GetConfig("rr");
private static readonly IClientProfile ClientProfile =
DefaultProfile.GetProfile(RegionId, AccessKeyId,AccessKeySecret);
private static readonly IAcsClient Client = new DefaultAcsClient(ClientProfile); static void Main(string[] args)
{
if (string.IsNullOrWhiteSpace(_recordId))
{
//如果没有获取过,那么获取一下,然后保存起来
_recordId = GetRecordId(Domain, Rr);
SaveConfig("recordId",_recordId);
}
if (_recordId == "") return;
//获取成功,并且有变化时
string lastIp = GetConfig("lastIP");
string curIp = GetIp();
if (!curIp.Equals("") && !lastIp.Equals(curIp))
{
var request = new UpdateDomainRecordRequest
{
RecordId = _recordId,
RR = Rr,
Type = "A",
Value = curIp,
TTL = 600,
Priority = 10
};
Client.DoAction(request);
SaveConfig("lastIP", curIp);
}
} #region 保存配置信息
/// <summary>
/// 保存配置信息
/// </summary>
/// <param name="name"></param>
/// <param name="value"></param>
private static void SaveConfig(string name,string value)
{
var cfa = ReadAppConfig();
cfa.AppSettings.Settings[name].Value = value;
cfa.Save();
}
#endregion #region 获取配置项
/// <summary>
/// 获取配置项
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
private static string GetConfig(string name)
{
var cfa = ReadAppConfig();
return cfa.AppSettings.Settings[name].Value;
}
#endregion #region 调用阿里云接口获取域名的唯一记录ID
/// <summary>
/// 调用阿里云接口获取域名的唯一记录ID
/// </summary>
/// <param name="domain">域名</param>
/// <param name="rr">子域名</param>
/// <returns></returns>
private static string GetRecordId(string domain,string rr)
{
DescribeDomainRecordsRequest reqq = new DescribeDomainRecordsRequest
{
DomainName = domain,
RRKeyWord = rr
};
var rss = Client.GetAcsResponse(reqq);
foreach (var record in rss.DomainRecords)
{
if (record.DomainName.Equals(domain) && record.RR.Equals(rr))
{
return record.RecordId;
}
}
return "";
}
#endregion #region 获取公网IP
/// <summary>
/// 获取当前电脑的真实外网IP地址,可以自行修改成稳定的
/// </summary>
/// <returns></returns>
private static string GetIp()
{
string ip = "";
try
{
//获取或设置用于向Internet资源的请求进行身份验证的网络凭据
WebClient myWebClient = new WebClient {
Credentials = CredentialCache.DefaultCredentials };
//从指定网站下载数据
Byte[] pageData = myWebClient.DownloadData(
"http://www.yxxrui.cn/yxxrui_cabangs_api/myip.ashx");
//如果获取网站页面采用的是GB2312,则使用这句
string pageHtml = Encoding.Default.GetString(pageData);
//如果获取网站页面采用的是UTF-8,则使用这句
//string pageHtml = Encoding.UTF8.GetString(pageData);
return pageHtml;
}
catch (WebException webEx)
{
}
return ip;
}
#endregion #region 获取配置文件
private static Configuration _config;
private static Configuration ReadAppConfig()
{
if (_config == null)
{
string configPath = @"app.config";
_config = ConfigurationManager.OpenMappedExeConfiguration(
new ExeConfigurationFileMap()
{
ExeConfigFilename = configPath
}, ConfigurationUserLevel.None);
}
//MessageBox.Show(config.AppSettings.Settings["serverIp"].Value);
return _config;
}
#endregion
}
}

app.config文件内容如下:

本代码为C#代码,建议将项目设置为winform程序,不要设置为控制台程序,否则每次执行时会弹出黑色的控制台,很恶心人的。该代码未实现自动检测和执行(如需程序创建计划任务,可联系我),只是做了以下工作:

1、获取当前电脑真实公网IP

2、查看当前IP是否有变化

3、若无变化直接退出,若有变化则修改域名解析设置

这些并不能达到实时解析。但可以通过使用window 操作系统中的任务计划程序,制定计划,每(1)分钟执行该软件一次即可。

代码与源码压缩包下载地址:http://www.yxxrui.cn/article/179.shtml

【升级版】如何使用阿里云云解析API实现动态域名解析,搭建私有服务器【含可执行文件和源码】的更多相关文章

  1. 【终极版】利用阿里云云解析API实现动态域名解析(ddns),搭建私有服务器【含可执行文件和源码】

    前言:懒人可以直接往下看,有代码和全部资源可以下载.此文章是先前文章的定时版,主要是添加了定时执行的功能,并且将代码中的配置项放置到了app.config文件中,方便不懂开发的朋友修改使用.未经许可请 ...

  2. 如何使用阿里云云解析API实现动态域名解析,搭建私有服务器

    原文地址:http://www.yxxrui.cn/article/116.shtml 未经许可请勿转载,如有疑问,请联系作者:yxxrui@163.com 公司的网络没有固定的公网IP地址,但是能够 ...

  3. 采用阿里的API进行动态域名解析

    #!/usr/bin/env python # -*- coding:utf-8 -*- import os from aliyunsdkcore import client from aliyuns ...

  4. python 调用阿里云云解析api添加记录

    首先安装阿里云SDK pip install aliyun-python-sdk-core pip install aliyun-python-sdk-alidns 可以配合jenkins传递参数 # ...

  5. 阿里云Linux(Centos7)下搭建SVN服务器

    1,使用yum安装SVN yum -y install subversion 安装完成之后,验证安装结果 svn help 2,新建仓库目录 在/usr/soft目录下面创建一个svn目录,用来作为s ...

  6. nodejs版 阿里云开放api签名算法

    阿里云 API 签名 github:https://github.com/liuyinglong/aliyun; npm :https://www.npmjs.com/package/aliyun-a ...

  7. 利用Python+阿里云实现DDNS(动态域名解析)

    引子我想大家应该都很熟悉DNS了,这回在DNS前面加了一个D又变成了什么呢?这个D就是Dynamic(动态),也就是说,按照传统,一个域名所对应的IP地址应该是定死的,而使用了DDNS后,域名所对应的 ...

  8. [源码解析] NVIDIA HugeCTR,GPU 版本参数服务器 --(1)

    [源码解析] NVIDIA HugeCTR,GPU版本参数服务器 --(1) 目录 [源码解析] NVIDIA HugeCTR,GPU版本参数服务器 --(1) 0x00 摘要 0x01 背景 1.1 ...

  9. [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (2)

    [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (2) 目录 [源码解析] NVIDIA HugeCTR,GPU版本参数服务器--- (2) 0x00 摘要 0x01 总体流程 ...

随机推荐

  1. docker提示容器已存在

    docker ps -a docker rm 容器id 重启启动

  2. 40 张图带你搞懂 TCP 和 UDP

    前言 欢迎阅读「程序员cxuan」 的文章,从今往后,你就是我的读者了. 我的 github bestJavaer 已经收录此文章,目录在 https://github.com/crisxuan/be ...

  3. [题解] 洛谷 P3393 逃离僵尸岛

    题目TP门 很明显是一个最短路,但是如何建图才是关键. 对于每一个不可遍历到的点,可以向外扩散,找到危险城市. 若是对于每一个这样的城市进行搜索,时间复杂度就为\(O(n^2)\),显然过不了.不妨把 ...

  4. C和指针课后练习题3

    1.在你的机器上,字符的范围有多大?有那些不同的整数类型以及他们的范围? C语言中数据输入输出格式: %d 有符号10进制整数%i 有符号10进制整数%o 无符号8进制整数%u 无符号10进制整数%x ...

  5. Bootstrap(修改中)

    表格 斑马表格 <table class="table-striped"> </table> 鼠标经过表格的hover效果 <table class= ...

  6. 如何破解QQ闪照

    1.如何下载 通过公主公众号 "全是软件" 然后输入 294 即可获得下载链接 https://qsrj.lanzous.com/iU4Hddnnmne 目前的闪照破解工具只能破解 ...

  7. Java多线程中的虚假唤醒和如何避免

    先来看一个例子 一个卖面的面馆,有一个做面的厨师和一个吃面的食客,需要保证,厨师做一碗面,食客吃一碗面,不能一次性多做几碗面,更不能没有面的时候吃面:按照上述操作,进行十轮做面吃面的操作. 用代码说话 ...

  8. 微软最强 Python 自动化工具开源了!不用写一行代码!

    1. 前言 最近,微软开源了一款非常强大的 Python 自动化依赖库:playwright-python 它支持主流的浏览器,包含:Chrome.Firefox.Safari.Microsoft E ...

  9. Spring Boot 中使用 Spring Security, OAuth2 跨域问题 (自己挖的坑)

    使用 Spring Boot 开发 API 使用 Spring Security + OAuth2 + JWT 鉴权,已经在 Controller 配置允许跨域: @RestController @C ...

  10. 部署完的Django项目升级为HTTPS

    1.阿里云上申请免费ssl证书--->提交各种资料--->等待审核--->下载证书. 2.远程连接阿里云服务器,将下载下来的证书内容复制到Nginx安装目录下的cert目录(需要新建 ...