通过 DDNS 解决宽带拨号 ip 变化问题
前面你的文章我已经写了 写了 DMZ 内网映射的 方式。 这样内网主机已经暴露在外网中了。 但是 拨号上网我们的ip是 会变化的。大概规律就是 每次拨号都会变化。如果不拨号,每 24 小时 ip也会自动变化一次。
怎么解决呢? 那就是使用域名。 我们通过域名 来访问 这台机子。并且在 ip 变化的时候 ,让 让域名对应的ip 也跟着变化。 这个过程叫做 DDNS 。就是动态域名解析。
DDNS 很多地方都有提供 。阿里有。腾讯云也有。我目前有的域名是腾讯的。所以就用腾讯 实现好了。首先找到腾讯 yun api。
这个接口就是给我们 修改 域名和ip对应关系的。 所有我们只需要获取到本地的外网ip然后调用这个接口 就可以了。
我的实现方式 是通过 java 程序 。每隔一段时间取获取本地ip,和上一次的ip做比较,如果不一样,就 调用腾讯云的接口。并且把这个程序加入到开机启动。
代码实现:
- 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":[]}
下面就是 获取公网ip: 中秋 有空 ,所以搞了一下获取公网IP。百度搜索IP。页面会显示你的公网IP 。所以把这个拔下来就可以了。 如果 你觉得百度 公网Ip 不正确 。那么你可以拔你们家路由器管理界面的。
- 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;
- }
- }
结果如下:
获取公网IP和 修改IP的接口都搞定了。那么后面就是 吧 这个程序结合起来做成开机启动就可以了
参考一篇别人的文章。吧jar 做成启动服务。https://blog.csdn.net/razeSpirit/article/details/78046475
上面的都是 实现原理。现在说一个简单的方式。检查一下你的路由器里面有没有关于ddns 的设置。
我用的小米路由器。正好有这个设置。
说明一下 。如果使用花生壳的话,那么这里只能使用花生壳的 壳域名。亲测我的腾讯域名不能用。估计只能域名提供商才能向 dns 服务商修改域名和ip的对应关系吧。
通过 DDNS 解决宽带拨号 ip 变化问题的更多相关文章
- 集群搭建:主机宽带拨号上网,虚拟机使用桥接模式,该如何ping通外网
首先介绍一下看这篇文章需要的基础.需要了解虚拟机的 虚拟机的三种网络模式,有Linux基础知识,这些都是前提.首先介绍一下我的环境:主机:win7虚拟机:VMware Workstation 10虚拟 ...
- 利用端口映射解决:拥有公网IP有限,内网需要访问因特网
动态端口映射: 内网中的一台电脑要访问新浪网,会向NAT网关发送数据包,包头中包括对方(就是新浪网)IP.端口和本机IP.端口,NAT网关会把本机IP.端口替换成自己的公网IP.一个未使用的端口, ...
- 采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET
采集爬虫中,解决网站限制IP的问题? - wendi_0506的专栏 - 博客频道 - CSDN.NET undefined
- Python 基于python实现ADSL宽带帐号,密码的获取及宽带拨号
基于python实现ADSL宽带帐号的获取及宽带拨号 基本思想: 1.研究上网方式(实验环境为电信网线接入式ADSL,拨号方式PPPOE) 2.研究宽带帐号和密码生成规律(实验环境,宽带帐号为 ...
- 解决:Tomcat 局域网IP地址 访问不了
解决:Tomcat 局域网IP地址 访问不了 2014年10月17日 ⁄ 综合 ⁄ 共 1000字 ⁄ 字号 小 中 大 ⁄ 评论关闭 如果连最基本的localhost:8080都失败的话. 原因就一 ...
- Ubuntu pppoe宽带拨号相关问题
因为可视化界面没有相关设置,因此采用终端命令的方法. 测试环境:Ubuntu 18.0.4 pppoe的配置:$ sudo pppoeconf 然后进入此界面进行一系列宽带拨号的设置. 联网:$ su ...
- 动态DNS——本质上是IP变化,将任意变换的IP地址绑定给一个固定的二级域名。不管这个线路的IP地址怎样变化,因特网用户还是可以使用这个固定的域名 这样看的话,p2p可以用哇
动态域名是因应网络远程访问的需要而产生的一项应用技术.因为没有固定IP,只能运用二级域名来应对经常变化的IP,动态域名的由来因此而产生. 它当前主要应用在:路由器.网络摄像机.带网络监控的硬盘录像机. ...
- 为什么家里的宽带的IP显示的是外地?
作者:NightCoffee链接:https://www.zhihu.com/question/22547945/answer/21734955来源:知乎著作权归作者所有.商业转载请联系作者获得授权, ...
- 解决sqlserver使用IP无法连接的问题,用localhost或者‘“.”可以连接
今天装了一个mssql发现用ip无法连接但是用localhost和“.”却可以连接,纠结了一天终于找到了问题的解决办法: 打开mssql配置管理器(我点电脑---->右键选择管理--->服 ...
随机推荐
- 实力封装:Unity打包AssetBundle(一)
说明:这是一系列循序渐进的教程,今天先介绍最简单的AssetBundle打包方式. 这是一个由在Unity中需要加载模型而引发出来的一系列坑,为了填坑花了不少时间,如果有需要在Unity中自定义菜单, ...
- leetcode第四题:两个有序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...
- ubuntu下pyspark的安装
1.安装jkd1.8(这里不再描述) 2.直接在终端输入pip install pyspark(官网提供的最简单的一种安装方式) 过程如下: Collecting pyspark Downloadin ...
- 关于索引的相关 day45
mysql数据库索引相关 一 介绍 什么是索引? 索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能 ...
- mysqli扩展库的预处理
预处理的特点:1.效率高,执行速度快 2.安全性高,可以防止sql注入 $mysqli 中的函数 $stmt=$mysqli->prepare($sql); 预备一条s ...
- flex 布局 出滚动条的操作
flex布局也是可以初横向滚动条的哦, 设置 flex-wrap:nowrap ,然后横向的固定宽度超过100% 则出滚动条
- HDU 6103 17多校6 Kirinriki(双指针维护)
Problem Description We define the distance of two strings A and B with same length n isdisA,B=∑i=0n− ...
- linux管道命令之head与tail
常常会遇到这样的情况: 1.我训练一个模型需要用到很多图片,这些图片都在一个文件夹下面,但是我想仅仅拷贝个一两张看一下图片的质量怎么样? 2.文件夹下有各种各样的数据,数目非常庞大,我想看一下文件夹下 ...
- shell常用函数封装-main.sh
#!/bin/bash #sunlight sp monitor system #created on 2018/01/07#by chao.dong#used by sp servers consi ...
- innerHTML与innerText功能的强大
例: <div id="study"> <span style="color:red">学习</span>study < ...