java 设置dns_Java动态修改dns(DDNS基于DNSPot和IPv6)

废话不多说,直接上源码:

@Autowired

private RestTemplate restTemplate;

private String ipv6;

private static final String RECORD_LIST = "https://dnsapi.cn/Record.List";

private static final String RECORD_DDNS = "https://dnsapi.cn/Record.Ddns";

private static final String RECORD_MODIFY = "https://dnsapi.cn/Record.Modify";

private static final String TOKEN = "你的token";

private static final String DOMAIN = "你的域名";

private static final String SUB_DOMAIN = "你要修改的子域名";

private static final String RECORD_ID = "记录id";

@PostConstruct

public void init() {

ipv6 = getLocalIPv6Address();

log.info("- local ipv6 = {}", ipv6);

}

@Scheduled(fixedRate = 5000)

public void checkIP() {

String currentIPv6 = getLocalIPv6Address();

if (ipv6.equals(currentIPv6)) {

return;

}

modifyDns();

}

public String getRecordList() {

MultiValueMap params= new LinkedMultiValueMap<>();

return postForm(RECORD_LIST, params);

}

public String modifyDns() {

MultiValueMap params= new LinkedMultiValueMap<>();

params.add("record_id", RECORD_ID);

params.add("sub_domain", SUB_DOMAIN);

params.add("record_type", "AAAA");

params.add("record_line_id", "0");

params.add("ttl", "600");

params.add("value", getLocalIPv6Address());

return postForm(RECORD_MODIFY, params);

}

private String postForm(String url, MultiValueMap params) {

HttpHeaders headers = new HttpHeaders();

headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

params.add("login_token", TOKEN);

params.add("format", "json");

params.add("domain", DOMAIN);

HttpEntity> requestEntity = new HttpEntity<>(params, headers);

ResponseEntity response = restTemplate.postForEntity(url, requestEntity, String.class);

return response.getBody();

}

public String getLocalIPv6Address() {

InetAddress inetAddress = null;

Enumeration networkInterfaces = null;

try {

networkInterfaces = NetworkInterface.getNetworkInterfaces();

} catch (SocketException e) {

e.printStackTrace();

}

outer:

while(networkInterfaces.hasMoreElements()) {

Enumeration addressEnumeration = networkInterfaces.nextElement().getInetAddresses();

while(addressEnumeration.hasMoreElements()) {

inetAddress = addressEnumeration.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 boolean isReservedAddr(InetAddress inetAddr) {

return inetAddr.isAnyLocalAddress()

|| inetAddr.isLinkLocalAddress()

|| inetAddr.isLoopbackAddress();

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PVE(Proxmox Virtual Environment)是一款基于KVM(Kernel-based Virtual Machine)和LXC(Linux Containers)的开源虚拟化管理平台。DDNS(Dynamic Domain Name System)是一种动态域名解析系统,用于将动态变化的IP地址映射到固定的域名上。IPv6(Internet Protocol version 6)是互联网协议的新版本,用于代替IPv4。 在PVE中设置IPv6的DDNS非常简单。首先,我们需要一个支持IPv6的域名注册商或DNS提供商。我们可以选择一家提供IPv6支持的DNS供应商,并注册一个域名。 接下来,在PVE的控制台中进入网络界面,找到你的虚拟机,并为其启用IPv6。在IPv6配置中,选择动态分配,启用SLAAC(Stateless Address Autoconfiguration)。 然后,我们需要安装一个支持DDNS的工具,比如ddclient或inadyn。这些工具可以自动更新我们的IPv6地址到DDNS服务器上。 配置DDNS客户端,我们需要提供DDNS服务器的域名、用户名和密码。如果需要,我们还可以设置一些其他参数,比如更新频率等。 最后,我们启动DDNS客户端并测试连接。当我们的IPv6地址发生变化时,DDNS客户端将自动更新我们的域名解析记录,以保持我们的域名与最新的IPv6地址对应。 通过以上步骤,我们可以在PVE中设置IPv6的DDNS。这样,无论我们的IPv6地址如何改变,我们的域名将始终与最新的IPv6地址保持同步。这对于需要远程访问PVE虚拟机或将其作为服务器运行的用户来说非常有用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值