家庭公网IP动态解析之阿里云DNS

此服务使用Java开发,每隔10分钟进行阿里云dns解析。如果解析地址未变更,则不出发修改解析操作。

代码

1. AliClient 代码 获取指定域名的解析记录和修改

/*** 阿里云客户端** @author Created by Harry Ma on 2021-01-26*/
@Component
public class AliClient {private static IAcsClient client;public AliClient() {IClientProfile profile = DefaultProfile.getProfile(Constants.REGION_ID, AliDnsApplication.aliConfig.getAccessKey(), AliDnsApplication.aliConfig.getAccessSecret());// 若报Can not find endpoint to access异常,请添加以下此行代码// DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", "Alidns", "alidns.aliyuncs.com");client = new DefaultAcsClient(profile);}public String getFirstDomain() {DescribeDomainsRequest request = new DescribeDomainsRequest();DescribeDomainsResponse response;try {response = client.getAcsResponse(request);List<DescribeDomainsResponse.Domain> domains = response.getDomains();if (domains.size() > 0) {return domains.get(0).getDomainName();}} catch (ClientException e) {e.printStackTrace();}return "";}/*** 获取指定解析记录** @param domainName 域名* @param filterRR   获取的解析记录* @return 解析记录*/public DescribeDomainRecordsResponse.Record getRecord(String domainName, String filterRR) {DescribeDomainRecordsRequest describeDomainRecordsRequest = new DescribeDomainRecordsRequest();describeDomainRecordsRequest.setDomainName(domainName);DescribeDomainRecordsResponse describeSubDomainRecordsResponse;try {describeSubDomainRecordsResponse = client.getAcsResponse(describeDomainRecordsRequest);for (DescribeDomainRecordsResponse.Record domainRecord : describeSubDomainRecordsResponse.getDomainRecords()) {if (filterRR != null && filterRR.equals(domainRecord.getRR())) {return domainRecord;}}} catch (ClientException e) {e.printStackTrace();}return null;}public void updateRecordIp(String ip, String recordId, String rR) {UpdateDomainRecordRequest request = new UpdateDomainRecordRequest();request.setRR(rR);request.setRecordId(recordId);request.setType(Constants.TYPE);request.setValue(ip);try {HttpResponse response = client.doAction(request);if (response.isSuccess()) {System.out.println("DNS解析成功^_^");return;}if (response.getHttpContentString().contains("The DNS record already exists.")){System.err.println("当前解析记录已存在...");}System.err.println("DNS解析失败,请检查$_$");} catch (ClientException e) {System.err.println(e.getErrMsg());}}
}

2. 定时任务类

/*** 定时修改阿里云动态DNS** @author Created by Harry Ma on 2021-01-26*/
@Component
@EnableScheduling
public class DnsSchedule {@Resourceprivate AliClient aliClient;/*** 每10分钟修改一次云解析记录*/@Scheduled(fixedRate = 1000 * 60 * 10)private void dnsTasks() {String nowIp = getNowIp();if (nowIp == null || nowIp.equals("")) {System.err.println("获取当前IP为空,请检查");return;}String firstDomain = aliClient.getFirstDomain();System.out.printf("获取到的domain为: %s%n", firstDomain);DescribeDomainRecordsResponse.Record record = aliClient.getRecord(firstDomain, AliDnsApplication.aliConfig.getRr());System.out.printf("获取到指定RR(%s)为: %s%n", AliDnsApplication.aliConfig.getRr(), JSONObject.toJSONString(record));if (!nowIp.equals(record.getValue())){aliClient.updateRecordIp(nowIp, record.getRecordId(), AliDnsApplication.aliConfig.getRr());}System.out.println("当前IP与解析IP相同,无需更新...");}private String getNowIp() {HttpGet httpGet = new HttpGet(Constants.REQUEST_IP_URL);httpGet.addHeader(Constants.ACCEPT_STR, Constants.ACCEPT_VALUE);httpGet.addHeader(Constants.CONNECTION_STR, Constants.CONNECTION_VALUE);httpGet.addHeader(Constants.USER_AGENT_STR, Constants.USER_AGENT_VALUE);CloseableHttpClient client = HttpClients.createDefault();try {CloseableHttpResponse response = client.execute(httpGet);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String result = EntityUtils.toString(response.getEntity());return Objects.requireNonNull(JSONObject.parseObject(result)).getString(Constants.IP_STR);}} catch (IOException e) {System.err.println(e.getMessage());}return "";}
}

3. 常量类

/*** @author Created by Harry Ma on 2021-01-26*/
public interface Constants {String TYPE = "A";String REGION_ID = "cn-hangzhou"; //地域ID 默认String IP_STR = "ip";String REQUEST_IP_URL = "https://api.ipify.org/?format=json";String ACCEPT_STR = "Accept";String CONNECTION_STR = "Connection";String USER_AGENT_STR = "User-Agent";String ACCEPT_VALUE = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";String CONNECTION_VALUE = "Keep-Alive";String USER_AGENT_VALUE = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0";String SEPARATOR_STR = ":";String COMMA = ",";String BLANK_STR = "";
}

如有不依赖jdk运行需求,请自行查找解决方法

本代码已上传至gitee和github

家庭公网IP动态解析至阿里云DNS相关推荐

  1. 利用公网IP访问部署在阿里云服务器的spring boot项目(一)

    一路上真的不知道踩了多少个坑!!!差一点就要放弃了,呜呜,所以来总结一下,也许你也在向阿里云服务器部署项目,那就好好看看,因为究竟是踩到了哪一个坑,很不好说,所以下面这些坑简直非常非常详细,也欢迎大噶 ...

  2. Python 实现动态解析阿里云DNS记录

    一.背景 最近有一个需求,公司内网的IP地址会发生变化,导致阿里云域名不能解析到新的IP地址,此时我们需要对阿里云的域名进行更新 二.实现 2.1 获取本地出口的公网IP 2.1.1 通过命令或网页 ...

  3. 使用阿里云 dns sdk 解决电信公网ip自动变化问题;自己动手实现ddns

    首先说下情况,我的树莓派通过电信光猫dmz主机设置全端口映射得到了公网ip,ssh等连接都很迅速,ping值为60ms.上海电信200M宽带,上传25mbps.由于是动态公网ip,电信隔几天就换ip, ...

  4. 阿里云DNS动态解析:解决内网服务外网访问

    阿里云DNS动态解析:解决内网服务外网访问 目录 注册阿里云账号获取AccessKeyId,AccessKeySecret并授权 阿里云关于DNS解析的SDK及API文档 代码实现 目录 注册阿里云账 ...

  5. Python+阿里云DNS 搭建DDNS动态域名解析

    家用的动态公网IP在断电以及一段时间后会变化,现在家宽公网IP开网盘以及代理管得越来越严格,已经有检测到被封的案例 上海检测web封停 这让我这种挂种子的PT党(迫真)感到害怕 以前我把国外的免费域名 ...

  6. 阿里云 DNS 新增云上线路的智能解析功能

    传统解析 VS 智能解析 我们知道,传统DNS解析方式,无需判断访问者来源,会随机选择其中一个IP地址返回给访问者.然而,这样的方式,已经不能满足现今互联网用户的访问需求.因此,DNS智能解析应运而生 ...

  7. 确认个人电脑外网ip,并设置阿里云服务器只允许该ip访问

    担心不小心把阿里云服务器地址.业务服务端口push到github上,所以对阿里云服务器进行设置,只允许本机ip访问.没想到还遇到些坑,本人太菜.记录下来 基础环境 个人电脑一台或若干台,只要是连接到一 ...

  8. JAVA实现对阿里云DNS的解析管理

    1.阿里云DNS的SDK依赖 <dependency> <groupId>com.aliyun</groupId> <artifactId>tea-op ...

  9. 从零开始,打造基于阿里IoT云平台的LoRa解决方案(3)_配置产品功能,将上传数据解析为阿里云平台数据格式

    本篇是 <从零开始,打造基于阿里IoT云平台的LoRa解决方案>系列教程的第3 篇,将为大家讲解:1-如何配置产品功能?2-如何将产品的上传数据解析为阿里云平台数据格式? 查看阿里物联网平 ...

最新文章

  1. AI智能手机会是什么样?至少有这十个功能
  2. UVA 818 Cutting Chains(状压 + 暴搜)题解
  3. VTK修炼之道10:可视化管道的连接与执行
  4. 链表!比数组更适合做增删操作的数据结构
  5. asp mysql 设置编码_ASP对数据库各种操作的代码
  6. 查看端口占用情况lsof,并关闭对应进程kill
  7. php 魔方,PHP解密:魔方二代-免费解密代码详解
  8. Aibaba Dubbo 的前世今生以及黑历史 主程序员梁飞 阿里P9(2016年查看)
  9. 去百度还是去创新工厂? 信开复还是信彦宏?
  10. Eclipse:Build not configured correctly问题
  11. 知乎9.6万赞热帖:“为什么飞机的头等舱一直拉着帘子?”答案细思极恐
  12. 读书笔记——寻找道德
  13. JS——mouseover和mouseenter的区别
  14. 科学计数法在计算机上怎么表示,科学计数法怎么表示
  15. 笔记本酷睿i5 1135g7相当于什么水平?i5 1135g7性能怎么样
  16. 最简便的lightGBM GPU支持的安装、验证方法
  17. 「JavaSE」-面向对象
  18. CSS Overscroll Behavior Module Level 1
  19. 关于保密协议(NDA),你所误解的那些事儿
  20. [转载]Flash场景之间相互跳转的方法

热门文章

  1. JS操作excel文件
  2. SAP PI PO 接口配置主体传播 RSXMB_CONFIG_PP_NEW
  3. 修改web服务器的网站主目录,Tomcat中更改网站根目录和默认页的配置方法
  4. Test multipath feature by openstack lioadm (by quqi99)
  5. UOS如何格式化U盘
  6. linux需要wifi网络认证,无线802.1x认证简介及配置方法
  7. ROSCon会议详细资料
  8. SPOJ694 SPOJ705 ——不同子串的总数
  9. 动态内存的申请和非动态内存的申请_非深户父母买社保就加分!深圳罗湖学位申请规则将调整!快算算你多少分...
  10. 用dom4j解析xml错误-Content is not allowed in prolog前言中不允许有内容