现在大多数家庭宽带已支持公网ipv6, 但是是动态的, 而且不好记忆, 本文分享如何使用域名和实现动态域名解析DDNS
先分享个ipv6的使用方式:
假如你的ip是 fe80::f66d:2fff:feaa:28ff
如果想要浏览器访问, 和ipv4相比在ip首尾多了[] . 而且需要浏览器支持, 目前大多数浏览器已支持
输入: http://[fe80::f66d:2fff:feaa:28ff]:80
如果要smb访问, 和ipv4相比结尾多了".ipv6-literal.net" , 而且需要把所有的":"转换成"-"
输入: \\fe80--f66d-2fff-feaa-28ff.ipv6-literal.net\share
1. 域名的注册和使用
以阿里云为例, 先注册个阿里云账号, 然后花1大洋(新用户才有)购买个域名. 地址: https://wanwang.aliyun.com/domain/1yuan
选择域名
创建模板
勾选模板并购买
然后在这里就可以看到自己购买的域名了
https://dns.console.aliyun.com/#/dns/domainList
需要实名后才能正常使用,但是可以提前配置, 实名过程跳过
在这里可以看到自己未实名域名数量并点击数字进入实名
https://dc.console.aliyun.com/next/index#/overview
点击 "解析设置"进行域名的配置
添加记录
配置完以后等模板实名了就可以通过域名查找的自己配的ip了, 即可以通过域名访问自己的ip了
比如我配置了test
2. DDNS
有了域名后我们就可以很方便的通过域名访问我们的ipv6地址了, 但是存在一个问题, 我们的ip是动态的, 每次变化后需要手动去控制台修改配置, 这时DDNS就排上用场了.在本地循环获取设备ip, 当ip变化后通过代码修改配置
修改方式: https://api.aliyun.com/api-tools/sdk/Alidns?version=2015-01-09&language=java-tea
主要用到了3个接口:
查询: client.describeDomainRecords
更新: client.updateDomainRecord
添加: client.addDomainRecord
示例代码:
implementation "com.aliyun:alidns20150109:3.0.8"
package com.yzh.ddns;
import com.aliyun.alidns20150109.Client;
import com.aliyun.alidns20150109.models.*;
import com.aliyun.teaopenapi.models.Config;
/**
* 作者:yzh
* <p>
* 创建时间:2023/11/15 00:08
* <p>
* 描述:
* <p>
* 修订历史:
*/
public class DDNSMain {
public static void main(String[] args) throws Exception {
System.out.println("=======================sssssssssssssssssssssssssstart=================");
Config config = new Config();
// 您的AccessKey ID
config.accessKeyId = "***************";
// 您的AccessKey Secret
config.accessKeySecret = "***************";
// 您的可用区ID
// config.regionId = "cn-hangzhou";
// Endpoint 请参考 https://api.aliyun.com/product/Alidns
config.endpoint = "alidns.cn-hangzhou.aliyuncs.com";
Client client = new Client(config);
String domainName = "yzhtest.com";
String RR = "www";
String recordType = "AAAA";
String newHostIP = "fe80::f66d:2fff:feaa:28ff";
checkAndAdd(client, domainName, RR, recordType, newHostIP);
System.out.println("=======================eeeeeeeeeeeeeeeeeeeeeeeeeeeend=================");
}
private static void checkAndAdd(Client client, String domainName, String RR, String recordType, String newHostIP) throws Exception {
System.out.println("-------------checkAndAdd:");
DescribeDomainRecordsRequest describeRequest = new DescribeDomainRecordsRequest();
// 主域名
describeRequest.domainName = domainName;
// 主机记录
describeRequest.RRKeyWord = RR;
// 解析记录类型
describeRequest.type = recordType;
DescribeDomainRecordsResponse describeResponse = client.describeDomainRecords(describeRequest);
if (describeResponse.statusCode != 200) {
System.out.println("error describeResponse.statusCode: " + describeResponse.statusCode);
return;
}
System.out.println("describeResponse.body.totalCount: " + describeResponse.body.totalCount);
if (describeResponse.body.totalCount > 0) {
for (DescribeDomainRecordsResponseBody.DescribeDomainRecordsResponseBodyDomainRecordsRecord record : describeResponse.body.domainRecords.record) {
System.out.println("-------------change?-------------");
System.out.println("record = recordId: " + record.recordId
+ " status: " + record.status
+ " locked: " + record.locked
+ " weight: " + record.weight
+ " line: " + record.line
+ " remark: " + record.remark
+ "\nRR: " + record.RR
+ " domainName: " + record.domainName
+ " type: " + record.type
+ " value: " + record.value);
System.out.println();
if (!newHostIP.equals(record.value)) {
System.out.println("change newIp: " + newHostIP);
// 修改解析记录
UpdateDomainRecordRequest updateRequest = new UpdateDomainRecordRequest();
// 主机记录
updateRequest.RR = RR;
// 记录ID
updateRequest.recordId = record.recordId;
// 将主机记录值改为当前主机IP
updateRequest.value = newHostIP;
// 解析记录类型
updateRequest.type = recordType;
UpdateDomainRecordResponse updateResponse = client.updateDomainRecord(updateRequest);
System.out.println("updateResponse.statusCode: " + updateResponse.statusCode);
}
}
} else {
System.out.println("-------------add-------------");
System.out.println("add newIp: " + newHostIP);
AddDomainRecordRequest addRequest = new AddDomainRecordRequest();
// 主域名
addRequest.domainName = domainName;
// 主机记录
addRequest.RR = RR;
// 将主机记录值改为当前主机IP
addRequest.value = newHostIP;
// 解析记录类型
addRequest.type = recordType;
AddDomainRecordResponse addResponse = client.addDomainRecord(addRequest);
System.out.println("addResponse.statusCode: " + addResponse.statusCode);
}
}
}
AccessKey ID和AccessKey Secret获取方式