需要有java、maven、springboot、阿里雲域名使用經驗、以及擁有一個域名
pom文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.binz</groupId> <artifactId>update-domain-ip</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>update-domain-ip</name> <description>動態綁定ip到域名</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-alidns</artifactId> <version>2.0.7</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.1.1</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-http</artifactId> <version>5.3.5</version> </dependency> </dependencies> <build> <finalName>update-domain-ip</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
java代碼:UpdateDoaminIpStarted
package com.binz; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.alidns.model.v20150109.DescribeSubDomainRecordsRequest; import com.aliyuncs.alidns.model.v20150109.DescribeSubDomainRecordsResponse; import com.aliyuncs.alidns.model.v20150109.DescribeSubDomainRecordsResponse.Record; import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordRequest; import com.aliyuncs.alidns.model.v20150109.UpdateDomainRecordResponse; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import cn.hutool.http.HttpUtil; @EnableScheduling @SpringBootApplication public class UpdateDoaminIpStarted { public static final String ACCESS_KEY_ID = "";//需要去阿里控制台 》 AccessKey管理 獲取 public static final String ACCESS_KEY_SECRET = "";//需要去阿里控制台 》 AccessKey管理 獲取 public static final String REGION_ID = "cn-hanghou"; public static final String DOMIAN = "baidu.com";//域名 改成你的域名 public static final Map<String,String> UPDATE_DOMIANS; private static String CURRENT_IP = null; private static IAcsClient client = null; static { UPDATE_DOMIANS = new HashMap<>(); UPDATE_DOMIANS.put("baidu.com", null);//改成你的二級域名 UPDATE_DOMIANS.put("mobile.baidu.com", null);//改成你的二級域名 UPDATE_DOMIANS.put("www.baidu.com", null);//改成你的二級域名 try { DefaultProfile.addEndpoint(REGION_ID,REGION_ID, "Alidns","alidns.aliyuncs.com"); } catch (ClientException e) { e.printStackTrace(); } IClientProfile profile = DefaultProfile.getProfile(REGION_ID, ACCESS_KEY_ID, ACCESS_KEY_SECRET); client = new DefaultAcsClient(profile); } public static Record getSubDomainRecord(String subDomain) { DescribeSubDomainRecordsRequest request = new DescribeSubDomainRecordsRequest(); DescribeSubDomainRecordsResponse response; request.setSubDomain(subDomain); try { response = client.getAcsResponse(request); List<Record> domainRecords = response.getDomainRecords(); // {RR=mobile, recordId=4031722341639808, line=default, domainName=baidu.com, return domainRecords.get(0); } catch (Exception e) { e.printStackTrace(); } return null; } private static String pingAndGetIp() { try { Set<String> keySet = UPDATE_DOMIANS.keySet(); Process process = Runtime.getRuntime().exec("ping "+ keySet.toArray()[0]); InputStream inputStream = process.getInputStream(); InputStreamReader reader=new InputStreamReader(inputStream,"gbk"); BufferedReader reader2=new BufferedReader(reader); String readLine =null; int i=0; while((readLine= reader2.readLine())!=null && i== 0) { if(readLine.indexOf("(") != -1){ readLine =readLine.substring(readLine.indexOf("(")+1, readLine.indexOf(")")); break; } } process.destroyForcibly(); return readLine; } catch (IOException e) { e.printStackTrace(); } return null; } public static void updateDomainIp() { String ip = getIp(); if(CURRENT_IP == null) { CURRENT_IP = pingAndGetIp(); } System.out.println("oldIp:"+CURRENT_IP+",newIp:"+ip); if(!ip.equals(CURRENT_IP)) { UpdateDomainRecordRequest request; UpdateDomainRecordResponse response; String aa = ""; for (String updateDomian : UPDATE_DOMIANS.keySet()) { if(UPDATE_DOMIANS.get(updateDomian) == null) { UPDATE_DOMIANS.put(updateDomian, getSubDomainRecord(updateDomian).getRecordId()); } aa = updateDomian.replaceAll(DOMIAN, "").equals("") ? "@" : updateDomian.replaceAll("."+DOMIAN, ""); request = new UpdateDomainRecordRequest(); request.setRecordId(UPDATE_DOMIANS.get(updateDomian)); request.setRR(aa); request.setType("A"); request.setValue(ip); try { response = client.getAcsResponse(request); System.out.println("成功把"+updateDomian+"的域名的ip解析成"+ip+",歷史ip為:"+CURRENT_IP); System.out.println(response.getRequestId()); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } } } public static String getIp() { String ip = HttpUtil.get("http://ip.3322.net"); return ip; } /** * 3分鍾一次 */ @Scheduled(cron = "0 */3 * * * *") public void scheduled() { UpdateDoaminIpStarted.updateDomainIp(); } public static void main(String[] args) { // updateDomainIp();//直接執行 SpringApplication.run(UpdateDoaminIpStarted.class, args); //boot運行方式 } }
maven 打成包過后,直接在內網 java -jar update-domain-ip.jar 即可,只要外網ip變動了就會改變,這個3分鍾就掃描一次,對於及時性要高一些的,可以提高掃描的頻率
外網都需要通過域名訪問,ip變了也無所謂,反正你只關心域名就行了