經過 DDNS 解決寬帶撥號 ip 變化問題

前面你的文章我已經寫了 寫了 DMZ 內網映射的 方式。 這樣內網主機已經暴露在外網中了。 可是 撥號上網咱們的ip是 會變化的。大概規律就是 每次撥號都會變化。若是不撥號,每 24 小時 ip也會自動變化一次。php

怎麼解決呢? 那就是使用域名。 咱們經過域名 來訪問 這臺機子。而且在 ip 變化的時候 ,讓 讓域名對應的ip 也跟着變化。 這個過程叫作 DDNS 。就是動態域名解析。html

 

DDNS 不少地方都有提供 。阿里有。騰訊雲也有。我目前有的域名是騰訊的。因此就用騰訊 實現好了。首先找到騰訊 yun api。java

 

這個接口就是給咱們 修改 域名和ip對應關係的。 全部咱們只須要獲取到本地的外網ip而後調用這個接口 就能夠了。 node

 

個人實現方式 是經過 java 程序 。每隔一段時間取獲取本地ip,和上一次的ip作比較,若是不同,就 調用騰訊雲的接口。而且把這個程序加入到開機啓動。apache

 

代碼實現:api

package com.sbl.pay.subaccount;

public class DDNSParam {
    
    
    public String Action = "RecordModify";
    public Long Nonce = (long) (Math.random()*10000);
    //public String Region = "ap-chengdu";
    public Long Timestamp = System.currentTimeMillis()/1000;
    public String SecretId = "填你本身的id";
    public String SignatureMethod = "HmacSHA1";
    public String Signature = "";
    
    
    
    
    
    
    public String domain = "zhangyukun.club";
    public int recordId  = 380731049;
    public String subDomain = "home";
    public String recordType = "A";
    public String recordLine = "默認";
    public String value = "112.193.146.167";
    
    
    
    
    public String getDomain() {
        return domain;
    }
    public void setDomain(String domain) {
        this.domain = domain;
    }
    public String getRecordLine() {
        return recordLine;
    }
    public void setRecordLine(String recordLine) {
        this.recordLine = recordLine;
    }
    public String getRecordType() {
        return recordType;
    }
    public void setRecordType(String recordType) {
        this.recordType = recordType;
    }
    public String getSubDomain() {
        return subDomain;
    }
    public void setSubDomain(String subDomain) {
        this.subDomain = subDomain;
    }
    public String getValue() {
        return value;
    }
    public void setValue(String value) {
        this.value = value;
    }
    public String getAction() {
        return Action;
    }
    public void setAction(String action) {
        Action = action;
    }
    public Long getNonce() {
        return Nonce;
    }
    public void setNonce(Long nonce) {
        Nonce = nonce;
    }
    public Long getTimestamp() {
        return Timestamp;
    }
    public int getRecordId() {
        return recordId;
    }
    public void setRecordId(int recordId) {
        this.recordId = recordId;
    }
    public void setTimestamp(Long timestamp) {
        Timestamp = timestamp;
    }
    public String getSecretId() {
        return SecretId;
    }
    public void setSecretId(String secretId) {
        SecretId = secretId;
    }
    public String getSignatureMethod() {
        return SignatureMethod;
    }
    public void setSignatureMethod(String signatureMethod) {
        SignatureMethod = signatureMethod;
    }
    public String getSignature() {
        return Signature;
    }
    public void setSignature(String signature) {
        Signature = signature;

    }

}

 

package com.sbl.pay.subaccount;

import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import com.sbl.pay.subaccount.util.BeanUtils;
import com.sbl.pay.subaccount.util.Core;
import com.sbl.pay.subaccount.util.HttpUtils;

public class Main {

	public static void main(String[] args) {
		
		String url = "https://cns.api.qcloud.com/v2/index.php";

		Map<String, String> params = new HashMap<String, String>();

		DDNSParam param = new DDNSParam();
		
		String urlStr = Core.createLinkString(   BeanUtils.objectToMap( param ) );
		urlStr = "GETcns.api.qcloud.com/v2/index.php?" + urlStr;
		
		String signature = hmacSha1(urlStr, "你的密鑰" );
		param.setSignature( signature  );
		params = BeanUtils.objectToStringMap(param);

		String s = HttpUtils.get(url, params);
		System.out.println(s);
		
	}

	public static String hmacSha1(String src, String key) {
        try {
            SecretKeySpec signingKey = new SecretKeySpec(key.getBytes("utf-8"), "HmacSHA1");
            Mac mac = Mac.getInstance("HmacSHA1");
            mac.init(signingKey);
            byte[] rawHmac = mac.doFinal(src.getBytes("utf-8"));
            return Base64.getEncoder().encodeToString( rawHmac );
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}

  

結果 : {"code":0,"message":"","codeDesc":"Success","data":[]}dom

 

 

下面就是 獲取公網ip:  中秋 有空 ,因此搞了一下獲取公網IP。百度搜索IP。頁面會顯示你的公網IP 。因此把這個拔下來就能夠了。 若是 你以爲百度 公網Ip 不正確 。那麼你能夠拔大家家路由器管理界面的。

this

package com.sbl.pay.subaccount;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;

import org.apache.commons.io.IOUtils;
import org.htmlparser.Parser;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

public class IPGet {

	public static void main(String[] args) throws Exception {
		System.out.println( getPublicNetworkIP() );
	}

	/**
	 * 獲得公網IP
	 * @return
	 * @throws FileNotFoundException
	 * @throws IOException
	 * @throws ParserException
	 */
	public static String getPublicNetworkIP() throws FileNotFoundException, IOException, ParserException {
		Parser parser = new Parser( new URL("https://www.baidu.com/s?ie=UTF-8&wd=ip").openConnection() );

		String a = IOUtils.toString(new FileInputStream(new File("C:\\Users\\ZHANGYUKUN\\Desktop\\aaa.html")));

		parser.setInputHTML(a);

		AndFilter filter = new AndFilter(new TagNameFilter("span"), new HasAttributeFilter("class", "c-gap-right"));

		NodeList nodeList = parser.parse(filter);

		String ipStr = nodeList.elementAt(0).getChildren().elementAt(0).getText() ;
		ipStr = ipStr.replaceAll("本機IP: ", "");
		return ipStr;
	}

}

  

結果以下:url

獲取公網IP和 修改IP的接口都搞定了。那麼後面就是 吧 這個程序結合起來作成開機啓動就能夠了spa

 參考一篇別人的文章。吧jar 作成啓動服務。https://blog.csdn.net/razeSpirit/article/details/78046475

 

 

 

上面的都是 實現原理。如今說一個簡單的方式。檢查一下你的路由器裏面有沒有關於ddns 的設置。

我用的小米路由器。正好有這個設置。

 

 

 

 

 

 

 

 

說明一下 。若是使用花生殼的話,那麼這裏只能使用花生殼的 殼域名。親測個人騰訊域名不能用。估計只能域名提供商才能向 dns 服務商修改域名和ip的對應關係吧。

相關文章
相關標籤/搜索