DDNS是将用户的动态IP地址映射到一个固定的域名解析服务上,用户每次连接网络的时候客户端程序就会通过信息传递把该主机的动态IP地址传送给位于服务商主机上的服务器程序,服务器程序负责提供DNS服务并实现动态域名解析。
目前国内支持DDNS解析的商家也比较多,比如花生壳等。如果你想自己不想使用第三方厂家提供的DDNS服务,完全可以自己折腾,比如使用CloudXNS API实现DDNS。
一、开始准备
- 需求:家里有一台占美小主机24小时运行,需要连接公网实现一些服务,不过运营商的IP是动态的,随时都在发生变化,于是需要用到DDNS
- 系统:CentOS 6 X64
- 环境:PHP 5.6
- 域名一个,并且已经使用CloudXNS DNS
二、安装CloudXNS API PHP SDK
由于小z会一点PHP,因此选择CloudXNS API PHP SDK,所以你要提前把PHP环境搭建好咯,进入站点根目录依次执行下面的命令:
### 下载CloudXNS API PHP SDK
wget https://github.com/CloudXNS/CloudXNS-API-SDK-PHP/archive/master.zip
### 解压
unzip master.zip
### 移动
mv CloudXNS-API-SDK-PHP-master/* ./
三、安装SDK
CloudXNS-API-SDK-PHP需要用到Composer,如果您还没有安装Composer,请参考:CentOS安装Composer,接着在站点根目录执行composer install
即可完成SDK安装。吐槽:SDK在国外,安装速度太慢了。
四、添加执行脚本
CloudXNS API PHP SDK里面有完整的DEMO,需要的可以参考。将下面的代码另存为ddns.php,setApiKey和setSecretKey请注意修改为自己在CloudXNS后台获取的。其中test.hixz.org请修改为您在CloudXNS需要更新的解析记录。
<?php
//获取公网IP
$ip = file_get_contents("https://blog.xiaoz.org/ip/userip.php");
require_once './vendor/autoload.php';
$api = new \CloudXNS\Api();
$api->setApiKey('xxxxxxxx');
$api->setSecretKey('xxxxxxxx');
$api->setProtocol(true);
/**
* DDNS快速修改解析记录
* @param string $domain 包含主机记录的域名
* @param string $ip IP值 多个以|分割如1.1.1.1|2.2.2.2 可为空
* @param integer $line_id 线路id 默认为1,可为空
*/
echo $api->ddns->ddns('test.hixz.org.',$ip,1);
echo $ip;
?>
五、定时任务
我们可以用Linux的crontab定时任务每小时运行一次脚本,及时更新公网IP,如下:
### 添加定时任务
crontab -e
### 加入计划任务,没小时执行一次脚本
10 * * * * cd /data/wwwroot/test.xiaoz.top/ && /usr/local/php/bin/php ddns.php >> /home/ddns.log 2>&1
### 重载crontab
service crond reload
10
指每小时的10分,/data/wwwroot/test.xiaoz.top/
为网站根目录,/usr/local/php/bin/php
是PHP所在的安装路径。
六、测试
脚本执行成功后,由于DNS缓存原因,一般10分钟左右生效,我们可以用ping命令测试是否和自己的公网IP一致,如果一致,说明DDNS解析成功,如下截图。
此文参考了:CloudXNS API PHP SDK,原创文章,转载请注明。
额,如果运营商分配内网IP的话该咋办
一般可以让运营商改成公网IP,参考:电信光猫(TEWA-500E)NAT端口映射方法
Composer 是有国内镜像的哦http://pkg.phpcomposer.com/
原来是我的姿势不对,我说怎么速度那么慢。
已经有人用shell脚本写出来了,你这个相对更麻烦和占用资源,你可以在GitHub上搜索一下。cloudxns是很不错,被腾讯收购的DNSpod愈发的讨厌
谢谢,有空我去看下shell脚本的实现方式,应该比我这个更好。
进来看看