公网ip经常变动的解决方法

解决公网ip经常变动

问题

​ 家里申请了电信的公网ip, 但是如果停电或者重新拨号都会导致这个ip变更.很多配置好的应用都需要重新配置ip地址太麻烦了

思考

  • 现成的产品类似花生壳这些内网穿透都要收费或者限速, 我已有公网ip感觉不划算

  • 想到了域名配置dns解析, 应用里面都配置域名代替ip地址.每次ip变了我只需要去改一下域名的dns解析就可以了

    但是还会有问题, 每次都需要手动改一下, 并且还必须得连上家里网才能知道最新的公网ip

  • 查了阿里云/腾讯云/华为云等等dns解析都对外提供了api文档, 思路是写个定时脚本获取到公网ip再与阿里云上的解析记录做比对,

    阿里云解析记录不是当前的公网ip的话, 更新阿里云的解析记录

实现

  • 定时获取当前公网ip去尝试更新

    /**
     * 修改域名定时任务
     *
     * @author wangJiaLun
     * @date 2021-08-11
     **/
    @Slf4j
    @Component
    public class ModifyDomainNameTask {
    
        @Autowired
        private AliDns aliDns;
    
        @Value("${pub-network-address}")
        private String netWorkAddress;
    
        /**
         *  每五分钟获取公网ip去尝试更新域名解析记录
         */
        @Scheduled(cron = "0 0/5 * * * ? ")
        public void checkDomainNameValue(){
            String value = HttpUtil.get(netWorkAddress).replace("\n", "");
            try {
                aliDns.updateDomainRecord(value);
            } catch (Exception e) {
                log.error(e.getMessage());
            }
        }
    }
    
  • 尝试更新阿里云解析记录

    /**
     * 阿里云ddns配置
     *
     * @author wangJiaLun
     * @date 2021-08-11
     **/
    @Slf4j
    @Component
    public class AliDns {
    
        @Value("${aliddns.access-key-id}")
        String ACCESS_KEY_ID ;
        @Value("${aliddns.access-key-secret}")
        String ACCESS_KEY_SECRET;
        @Value("${aliddns.domain-name}")
        String  DOMAIN_NAME;
        @Value("${aliddns.end-point}")
        String END_POINT;
    
        /**
         * 使用AK&SK初始化账号Client
         * @param accessKeyId
         * @param accessKeySecret
         * @return Client
         * @throws Exception
         */
        com.aliyun.alidns20150109.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
            Config config = new Config()
                    .setAccessKeyId(accessKeyId)Secret
                    .setAccessKeySecret(accessKeySecret);
            config.endpoint = END_POINT;
            return new com.aliyun.alidns20150109.Client(config);
        }
    
        /**
         *  更新解析记录
         * @param value 当前公网ip
         */
        public  void updateDomainRecord (String value) throws Exception{
            com.aliyun.alidns20150109.Client client = this.createClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET);
    
            DescribeDomainRecordsRequest domainRecordsRequest = new DescribeDomainRecordsRequest();
            domainRecordsRequest.setDomainName(DOMAIN_NAME);
            // 解析记录列表
            DescribeDomainRecordsResponse domainRecordsResponse = client.describeDomainRecords(domainRecordsRequest);
            for (DescribeDomainRecordsResponseBody.DescribeDomainRecordsResponseBodyDomainRecordsRecord record : domainRecordsResponse.body.domainRecords.record) {
                UpdateDomainRecordRequest updateDomainRecordRequest = new UpdateDomainRecordRequest();
                if (record.value.equals(value)) {
                    break;
                }
                BeanUtils.copyProperties(record, updateDomainRecordRequest);
                updateDomainRecordRequest.setValue(value);
                client.updateDomainRecord(updateDomainRecordRequest);
                log.info("域名{}的主机记录{}更新为记录值: {}",DOMAIN_NAME, record.RR,value);
            }
        }
    }
    

测试

去阿里云平台上面把域名的解析记录随便改了个值, 过几分钟后变成了我当前的公网ip地址

项目地址

https://github.com/wangJiaLun-china/ddns

编译打包后的文件

https://download.csdn.net/download/AL961105114/86923048

  • 10
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值