IPV6 阿里DDNS
IPV6 阿里DDNS
因为需要在家搭建一套环境,并且需要公网能访问。国内的ipv4的地址,各大运营商基本都不会分配ipv4地址(电信宽带好像有地方可以,但是听说很贵),而且是动态的,每过段时间就会改变。
发现移动宽带的公网ipv6地址是可以获取到的,但是也会动态刷新。想稳定访问就加上阿里的ddns的域名访问。
有时候电脑的mac地址在路由器注册上,公网会访问不了。我也不知道是什么原因。但是晚上凌晨4点或者5点时候定时重启路由器,基本上就没问题。
1.改光猫信息和设置路由器拨号
因为宽带接入家里基本是都是需要通过光猫拨号后,再接入路由器。这样就拿不到真实的公网ipv6地址,需要先将光猫中的设置改为桥接模式,再让路由器输入宽带账户和密码拨号。
改光猫和路由器这个步骤,确实很多坑,需要看网上的很多教程。光猫的型号和地区不一样,设置的方式也不一样,所以这一步就不详细介绍。
2.准备阿里云域名和获取阿里开发AccessKeyID和AccessKeySecret
2.1 准备域名
注册一个阿里云账号,购买域名,可以买个比较便宜的一级域名。购买完成后
购买以后需要看看dns服务器设置是否成功。阿里免费的ddns解析,修改ip后,大概10分钟左右生效。
然后进入左侧的 “域名解析” 菜单
主机记录是二级域名前缀,@表示是主域名
记录类型 A是ipv4地址 AAAA是ipv6地址
TTL 生效时间
2.2 获取阿里开发AccessKeyID和AccessKeySecret
3.开始脚本项目
3.1 引入阿里的sdk包
引入阿里现成的maven包,里面封装好的接口
<dependencies><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-alidns</artifactId><version>2.0.10</version></dependency><dependency><groupId>com.aliyun</groupId><artifactId>aliyun-java-sdk-core</artifactId><version>4.3.2</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.12</version></dependency></dependencies>
3.2 加载配置信息
域名,AccessKeyID和AccessKeySecret
初始化下配置信息
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;import java.io.*;
import java.nio.charset.StandardCharsets;public class Config {//这读取的是json文件配置,也可以直接输入域名,AccessKeyID,和AccessKeySecretpublic static String host="";public static String AccessKeyID="";public static String AccessKeySecret="";public static void initConfig(){if(StrUtil.isNotBlank(host) && StrUtil.isNotBlank(AccessKeyID) && StrUtil.isNotBlank(AccessKeySecret)){LogUtil.logOut("host:"+host);LogUtil.logOut("AccessKeyID:"+AccessKeyID);LogUtil.logOut("AccessKeySecret:"+AccessKeySecret);return;}String jarPath= System.getProperty("user.dir");System.out.println(jarPath);File file=new File(jarPath+File.separator+"config.json");if(!file.exists()){LogUtil.logOut("initConfig config.json文件不存在");return;}JSONObject json= JSONUtil.readJSONObject(file, StandardCharsets.UTF_8);String host=json.getStr("host");String AccessKeyID=json.getStr("AccessKeyID");String AccessKeySecret=json.getStr("AccessKeySecret");if(StrUtil.isBlank(host) || StrUtil.isBlank(AccessKeyID) || StrUtil.isBlank(AccessKeySecret)){LogUtil.logOut("参数配置出现问题!!!!!!!!");throw new RuntimeException("参数配置出现问题!!!!!!!!");}Config.host=host;Config.AccessKeyID=AccessKeyID;Config.AccessKeySecret=AccessKeySecret;}
}
3.3 获取服务器ipv6地址
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
import java.util.Enumeration;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @author liu* @time 2021/11/1* @description*/
public class IPv6 {public static void main(String[] args) throws IOException {/*获取本机所有ip地址(包括保留地址,ipv4,ipv6 如果安装了虚拟机会更多其他的地址)* try {InetAddress ads = null;Enumeration<NetworkInterface> adds = NetworkInterface.getNetworkInterfaces();while(adds.hasMoreElements()) {Enumeration<InetAddress> inetAds = adds.nextElement().getInetAddresses();while(inetAds.hasMoreElements()) {ads = inetAds.nextElement();LogUtil.logOut(ads.getHostAddress());}}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}*///获取可用ipv6地址
// try {// LogUtil.logOut(getLocalIPv6Address());
// } catch (SocketException e) {// // TODO Auto-generated catch block
// e.printStackTrace();
// }// LogUtil.logOut(l);getLocalIPv6Address();}public static String getLocalIPv6Address() throws SocketException {InetAddress inetAddress =null;Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();outer:while(networkInterfaces.hasMoreElements()) {Enumeration<InetAddress> inetAds = networkInterfaces.nextElement().getInetAddresses();while(inetAds.hasMoreElements()) {inetAddress = inetAds.nextElement();//检查此地址是否是IPv6地址以及是否是保留地址if(inetAddress instanceof Inet6Address&& !isReservedAddr(inetAddress)) {break outer;}}}String ipAddr = inetAddress.getHostAddress();//过滤网卡int index = ipAddr.indexOf('%');if(index>0) {ipAddr = ipAddr.substring(0, index);}return ipAddr;}private static boolean isReservedAddr(InetAddress inetAddr) {if(inetAddr.isAnyLocalAddress()||inetAddr.isLinkLocalAddress()||inetAddr.isLoopbackAddress()){return true;}return false;}public static boolean ping(String ipAddress, int pingTimes) {BufferedReader in = null;// 将要执行的ping命令,此命令是windows格式的命令Runtime r = Runtime.getRuntime();//String pingCommand = "ping " + ipAddress + " -n " + pingTimes + " -w " + timeOut;String pingCommand = "ping6 " + ipAddress +" -c " +pingTimes;try { // 执行命令并获取输出LogUtil.logOut(pingCommand);Process p = r.exec(pingCommand);if (p == null) {return false;}// 逐行检查输出,计算类似出现=23ms TTL=62字样的次数in = new BufferedReader(new InputStreamReader(p.getInputStream()));int connectedCount = 0;String line = null;while ((line = in.readLine()) != null) {connectedCount += getCheckResult(line);} // 如果出现类似=23ms TTL=62这样的字样,出现的次数=测试次数则返回真return connectedCount >= pingTimes;} catch (Exception ex) {ex.printStackTrace(); // 出现异常则返回假return false;} finally {try {in.close();} catch (IOException e) {e.printStackTrace();}}}/*** 若line含有=18ms TTL=16字样,说明已经ping通,返回1,否則返回0.*/private static int getCheckResult(String line) {LogUtil.logOut("控制台输出的结果为:"+line);String[] lines=line.split("=");String lessStr=lines[lines.length-1].split(" ")[0];try {if(line.contains("Unreachable")){return 0;}if(line.contains("unreachable")){return 0;}if(Double.valueOf(lessStr)>0){return 1;}}catch (Exception e){return 0;}return 0;}}
3.4 main启动类
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.alidns.model.v20150109.*;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;import java.io.IOException;
import java.net.SocketException;import java.util.List;public class DDNS {/*** 获取主域名的所有解析记录列表*/private DescribeSubDomainRecordsResponse describeSubDomainRecords(DescribeSubDomainRecordsRequest request, IAcsClient client) {try {// 调用SDK发送请求return client.getAcsResponse(request);} catch (ClientException e) {e.printStackTrace();// 发生调用错误,抛出运行时异常throw new RuntimeException();}}/*** 修改解析记录*/private UpdateDomainRecordResponse updateDomainRecord(UpdateDomainRecordRequest request, IAcsClient client) {try {// 调用SDK发送请求return client.getAcsResponse(request);} catch (ClientException e) {e.printStackTrace();// 发生调用错误,抛出运行时异常throw new RuntimeException();}}/*** 修改解析记录*/private AddDomainRecordResponse addDomainRecord(AddDomainRecordRequest request, IAcsClient client) {try {// 调用SDK发送请求return client.getAcsResponse(request);} catch (ClientException e) {e.printStackTrace();// 发生调用错误,抛出运行时异常throw new RuntimeException();}}public static void main(String[] args) throws InterruptedException, IOException {Config.initConfig();// 设置鉴权参数,初始化客户端DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou",// 地域IDConfig.AccessKeyID,// 您的AccessKey IDConfig.AccessKeySecret);// 您的AccessKey SecretIAcsClient client = new DefaultAcsClient(profile);while (true) {try {ddnsOp(client);} catch (Exception e) {e.printStackTrace();LogUtil.logOut(e);}finally {//这直接sleep 5分钟。这个时间可以调大些。Thread.sleep(1000 * 300);}}}private static void ddnsOp(IAcsClient client) throws SocketException {DDNS ddns = new DDNS();//查询指定二级域名的最新解析记录DescribeSubDomainRecordsRequest describeSubDomainRecordsRequest = new DescribeSubDomainRecordsRequest();describeSubDomainRecordsRequest.setSubDomain(Config.host);DescribeSubDomainRecordsResponse describeSubDomainRecordsResponse = ddns.describeSubDomainRecords(describeSubDomainRecordsRequest, client);LogUtil.log_print("describeSubDomainRecords", describeSubDomainRecordsResponse);List<DescribeSubDomainRecordsResponse.Record> domainRecords = describeSubDomainRecordsResponse.getDomainRecords();//最新的一条解析记录if (domainRecords.size() != 0) {DescribeSubDomainRecordsResponse.Record record = domainRecords.get(0);// 记录IDString recordId = record.getRecordId();// 记录值String recordsValue = record.getValue();// 当前主机公网IPString currentHostIP = IPv6.getLocalIPv6Address();LogUtil.logOut("-------------------------------当前主机公网IP为:" + currentHostIP + "-------------------------------");if (!currentHostIP.equals(recordsValue)) {LogUtil.logOut("与记录不一致,尝试修改地址!");// 修改解析记录UpdateDomainRecordRequest updateDomainRecordRequest = new UpdateDomainRecordRequest();// 主机记录updateDomainRecordRequest.setRR("@");// 记录IDupdateDomainRecordRequest.setRecordId(recordId);// 将主机记录值改为当前主机IPupdateDomainRecordRequest.setValue(currentHostIP);// 解析记录类型updateDomainRecordRequest.setType("AAAA");UpdateDomainRecordResponse updateDomainRecordResponse = ddns.updateDomainRecord(updateDomainRecordRequest, client);LogUtil.log_print("updateDomainRecord", updateDomainRecordResponse);}}else{// 当前主机公网IPString currentHostIP = IPv6.getLocalIPv6Address();LogUtil.logOut("-------------------------------当前主机公网IP为:" + currentHostIP + "-------------------------------");AddDomainRecordRequest addDomainRecordRequest=new AddDomainRecordRequest();addDomainRecordRequest.setDomainName(Config.host);addDomainRecordRequest.setRR("@");// // 修改解析记录
// UpdateDomainRecordRequest updateDomainRecordRequest = new UpdateDomainRecordRequest();
// // 主机记录
// updateDomainRecordRequest.setRR("@");
// // 记录ID
// updateDomainRecordRequest.setRecordId(recordId);// 将主机记录值改为当前主机IPaddDomainRecordRequest.setValue(currentHostIP);// 解析记录类型addDomainRecordRequest.setType("AAAA");AddDomainRecordResponse updateDomainRecordResponse = ddns.addDomainRecord(addDomainRecordRequest, client);LogUtil.log_print("updateDomainRecord", updateDomainRecordResponse);}}
}
3.5 config.json配置文件
***这个配置文件需要和jar包同级目录***
{"host":"ljXXXX.top","AccessKeyID":"LTAI5tPXXXXXXX","AccessKeySecret":"FhkXXXXXX"
}
3.6 日志输出
import com.google.gson.Gson;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;/*** @author fancy*/
public class LogUtil {private static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH时mm分ss秒");public static void logOut(Object info){String threadName=Thread.currentThread().getName();System.out.println(dtf.format(LocalDateTime.now())+"--线程名"+threadName+":::"+info);}public static void log_print(String functionName, Object result) {Gson gson = new Gson();LogUtil.logOut("-------------------------------" + functionName + "-------------------------------");LogUtil.logOut(gson.toJson(result));}
}
3.7 启动脚本和stop脚本
aliDDns.sh 启动
#!/bin/bashjava -cp aliDDns-1.0-SNAPSHOT.jar DDNS start > log.file 2>&1 &echo "开始解析"
stop.sh 停止
PROCESS=`ps -ef|grep aliDDns|grep -v grep|grep -v PPID|awk '{ print $2}'`
for i in $PROCESS
doecho "Kill the $1 process [ $i ]"kill -9 $i
done
总结
如果不是做java研发,这个脚本跑起来有点难。这个是打包好的DDNS ipv6
如果没有积分可留言
代码地址源码
声明:该项目只是做个人学习使用,并未将域名暴露他人。网友其他行为与本人无关!!!
IPV6 阿里DDNS相关推荐
- 华硕路由器、LEDE、梅林,阿里DDNS教程
转自我的博客:sleele.com/2019/04/17/- 教程 华硕路由器官方固件,梅林,LEDE大体一致,下面我以华硕路由器官改固件为例展开教程 首先安装阿里DDNS插件,在阿里注册一个域名,买 ...
- 群晖-第1章-IPV6的DDNS
群晖-第1章-IPV6的DDNS 方案:腾讯云+群晖DS920 本文参考群晖ipv6 DDNS-go教程-牧野狂歌,感谢原作者的分享. 这篇文章只记录了我需要的部分,其他的可以查看原文,原文还记录了更 ...
- linux系统下配置阿里DDNS(IPv6)
现在大环境下,我自己搭建了三根宽带,移动,联通,电信现在室内什么网都有,三家的公网都不能用,然后自己查看三家都开了IPv6,于是乎就在三根线下搭建了三个服务器,结果ipv6地址在每次关机后都会自动更换 ...
- 保姆级教程:群晖nas内网穿透之ipv6/ipv4 ddns+frp双管齐下!
原文地址:https://htm.fun/archives/nas-ipv6-ipv4-ddns-frp.html 前提条件 以下所有内容均在博主家庭实际搭建,所有截图均为博主家庭实际操作,请举一反三 ...
- 群晖经典第三方套件_使用群晖第三方套件进行IPV6的DDNS
本帖最后由 minlang112 于 2020-3-12 22:01 编辑 一.前言 随着IPV6的强(qiang)力(zhi)推广,越来越多的"御三家"(电信.联通.移动)用户可 ...
- 免费好用的IPv6之DDNS服务-Openwrt上dynv6的使用介绍
概述:本文主要介绍了dynv6在OpenWrt上的配置及使用,对于有IPv6地址的用户,可以按照本文自行探索更多玩法 针对近期dynv6网站的更新,本文于2020.2.13更新. 参考dynv6网站推 ...
- OpenWrt 软路由 IPV6 配置 DDNS
一.申请 dynv6 账号 1.去官网注册一个账号,不过人机验证那块需要 "梯子" 才能注册成功 Free dynamic DNS for IPv6 2.注册成功后,创建一个 Do ...
- AC68U梅林固件,从ipv6设置到写脚本手动绑定ddns,通过单ipv6实现公网访问
目录 折腾起源 设置ipv6 DDNS设置部分 打开ssh端口及服务 进入ssh界面 方法一:套用jffs下自带的启动脚本 方法二:在梅林固件默认启动脚本目录下自建脚本 脚本实现部分 DDNS实现 l ...
- 【笔记】openwrt - 【一文解决】ipv6设置、DDNS、端口转发
ipv6测试:https://test-ipv6.com/ 环境:移动运营商.openwrt 探讨家用路由怎么配置ipv6实现外网访问.尽量避开原理. (想了解原理推荐看下面贴出的视频链接) 链接:红 ...
- ipv6使用免费的DDNS(dynv6.com)
参考文献: 1.免费好用的IPv6之DDNS服务-Openwrt上dynv6的使用介绍 2.定时任务初体验 3.crontab执行时间计算 - 在线工具 4.Mac下使用crontab定时任务,示例及 ...
最新文章
- PullToRefreshScrollView下拉刷新开源组件分析
- 河南计算机程序大赛,我院成功举办河南省第十一届ACM大学生程序设计竞赛
- 分享一些有趣的面试智力题
- android byte[] 转string 好多问号_java程序员面试遇到string题如何不凉?
- 新手安装linux的磁盘划分
- 转行人工智能,不得不温习的数学知识点
- 自动化持续集成Jenkins
- bottomnavigationview放大两边没有_有没有什么HAPPYEND的动漫?
- java conditionobject_Java AbstractQueuedSynchronizer源码阅读4-ConditionObject
- 注意!腾讯语音助手也已抵达战场(内部不止这一个)
- libqrencode 3.4.3 发布,二维码的C解析库
- java bigdecima_Java收藏排序BigDecimal
- vue中使用svg矢量图
- 在那海的那边,山的那边,有一条蓝鲸鱼----它的名字叫Docker!!
- android 视频解决方案,短视频SDK升级为短视频解决方案
- 工资高的互联网工作者都在干什么
- windows 10微软拼音输入法变成繁体
- 用PDF格式协议的方式给PDF文档添加透明文字水印
- (更新时间)2021年6月5日 商城高并发秒杀系统(.NET Core版) 36-高并发秒杀项目k8s集群部署
- Qt工具栏中设置小部件间隔的方法