使用阿里云服务,打造自己的DDNS,内网服务器

作为一名爱折腾的程序员,家里搭建一台7*24小时的服务器,是很有必要的。它可以用来备份手机资料,工作电脑远程备份到家里来,还可以保存大量的音频、视频,随时在手机和电脑调用,非常方便。搭建这样的服务器,需要2个前提条件:

1、必须有公网IP地址。这个在深圳很简单解决。打电话到10000,和人工客服说需要公网IP,十分钟后附近的师傅就会回复确认,重启光猫后,光猫就变为桥接方式,用自己的路由器拨号上网。路由器就分配得到一个临时的公网IP地址。

2、动态解析域名。由于第一步得到的公网IP地址是临时的,每次拨号后IP会变化,另外IP地址也有续租期限,到期后自动变更。所以,在路由器或者内网,需要有个程序及时监视公网IP的变化,一旦变化,立即提交域名解析,修改域名的A记录解析地址。

解决上面2个条件后,就可以在外网访问这个域名+指定端口,成功连接到内网服务器。一般路由器都自带有DDNS服务器,都是花生壳、3322等指定的域名服务商。如果要使用自己私有的域名做动态解析,则接着看下面内容。

1、查询路由器的公网IP,这个很简单不再赘述,百度一下一大堆此类的服务。

2、把域名指向上面的公网IP,每次公网IP变化,都要重新指向一次。当然是程序自动完成。先在阿里云注册一个域名,比如 xxx.com,然后获取阿里云的 AccessKeyId、AccessKeySecret。

image.jpg

///以下代码运行在内网

public static AlibabaCloud.SDK.Alidns20150109.Client CreateClient()
{
    string accessKeyId = System.Configuration.ConfigurationManager.AppSettings["AccessKeyId"];
    string accessKeySecret = System.Configuration.ConfigurationManager.AppSettings["AccessKeySecret"];

    AlibabaCloud.OpenApiClient.Models.Config config = new AlibabaCloud.OpenApiClient.Models.Config
    {
	AccessKeyId = accessKeyId,
	AccessKeySecret = accessKeySecret,
    };
    // 访问的域名
    config.Endpoint = "alidns.cn-shenzhen.aliyuncs.com";
    return new AlibabaCloud.SDK.Alidns20150109.Client(config);
}

public static string GetPubIp()
{
  //使用第三方服务,获得公网IP
  //return IP;
}


string Ip = GetPubIp();
///查找域名xxx.com的主机名为www的记录
AlibabaCloud.SDK.Alidns20150109.Models.DescribeDomainRecordsRequest describeDomainRecordsRequest = new AlibabaCloud.SDK.Alidns20150109.Models.DescribeDomainRecordsRequest() { DomainName = "xxx.com", RRKeyWord = "www" };
AlibabaCloud.TeaUtil.Models.RuntimeOptions runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
var resp = client.DescribeDomainRecordsWithOptions(describeDomainRecordsRequest, runtime);
var Host = resp.Body.DomainRecords.Record[0];
if (Host != null) //找到记录
{
    if(Host.Value==Ip) return; //公网Ip没有变化,无需继续操作
    var updateDomainRecordRequest = new AlibabaCloud.SDK.Alidns20150109.Models.UpdateDomainRecordRequest();
    updateDomainRecordRequest.RecordId = Host.RecordId;
    updateDomainRecordRequest.RR = "www";
    updateDomainRecordRequest.Type = Host.Type;
    updateDomainRecordRequest.Value = Ip ;
    updateDomainRecordRequest.TTL = 600;
    client.UpdateDomainRecord(updateDomainRecordRequest); //解析www到最新的公网IP
}
else
{   //新增A记录
    var addDomainRecordRequest = new AlibabaCloud.SDK.Alidns20150109.Models.AddDomainRecordRequest();
    addDomainRecordRequest.DomainName = "xxx.com";
    addDomainRecordRequest.RR = "www";
    addDomainRecordRequest.Type = "A";
    addDomainRecordRequest.Value = Ip;
    addDomainRecordRequest.TTL = 600;
    client.AddDomainRecord(addDomainRecordRequest);
}


可以写个控制台程序,添加为系统任务,每5分钟定时运行。一旦路由器的公网IP变化,可以及时修改DNS解析。


另外,如果要把内网服务提供给公网访问,在路由器还需要做端口映射,比如内网的ftp服务器端口是2121,被动模式使用的端口范围是49152-65534。可以在路由器上映射另一个端口到2121,另外一个端口范围到49152-65534,或者不映射新端口,直接暴露也可以,然后指定定义的端口到指定的内网IP。

还有,ucloud.cn 上有免费的一年一签的SSL证书,申请后部署在内网服务器,然后在外网访问时就可以使用https。

2022-11-27 C#

发布评论