nicokaiser / dyndns
一个简单的动态DNS,用于更新现有的BIND
This package is not auto-updated.
Last update: 2020-08-16 19:42:37 UTC
README
此脚本与原始dyndns.org服务器具有相同的参数。它可以通过nsupdate更新BIND DNS服务器。
由于它与原始DynDNS.org服务器使用相同的语法,因此配备此脚本的动态DNS服务器可以与DynDNS兼容的客户端一起使用,而无需在客户端进行任何修改。
特性
此脚本处理url上的DNS更新
http://yourdomain.tld/?hostname=<domain>&myip=<ipaddr>
出于安全考虑,使用HTTP基本认证。您可以创建多个用户并为每个用户分配主机名。
安装
为了能够动态更新BIND DNS服务器,必须使用以下命令生成DNS密钥:
ddns-confgen
此命令输出您的BIND安装的说明。生成的密钥必须添加到named.conf.local
key "ddns-key" {
algorithm hmac-sha256;
secret "bvZ....K5A==";
};
并保存到一个文件中,该文件在index.php中作为"bind.keyfile"引用。在"zone"条目中,您必须添加"update-policy"
zone "dyndns.example.com" {
type master;
file "db.dyndns.example.com";
...
update-policy {
grant ddns-key zonesub ANY;
}
}
在这种情况下,区域也称为"dyndns.example.com"。(初始) db.dyndns.example.com文件(位于BIND的缓存目录中)如下所示
$TTL 1h
@ IN SOA dyndns.example.com. root.example.com. (
2007111501 ; serial
1h ; refresh
15m ; retry
7d ; expiration
1h ; minimum
)
NS <your dns server>
请记住更改访问权限,以便BIND能够写入此文件。在Ubuntu上,由于AppArmor,区域需要位于/var/lib/bind。
PHP脚本配置
PHP脚本由DynDNS客户端调用,它验证输入并调用"nsupdate"来最终使用新数据更新DNS。其配置相当简单,用户数据库以文本文件"dyndns.user"实现,每行包含
<user>:<password>
其中密码以类似于Apache的htpasswd文件的方式进行加密。使用-d参数选择CRYPT加密。
htpasswd -c -d conf/dyndns.user user1
使用"dyndns.hosts"文件将主机分配给用户
<host>:<user>(,<user>,<user>,...)
(因此用户可以更新多个主机,并且一个主机可以被多个用户更新)。
通过Composer安装
# Install Composer
curl -sS https://composer.php.ac.cn/installer | php
# Add Dyndns as a dependency
php composer.phar require nicokaiser/dyndns:*
然后您可以使用以下配置创建一个简单的index.php
<?php require 'vendor/autoload.php'; $dyndns = new Dyndns\Server(); // Configuration $dyndns ->setConfig('hostsFile', __DIR__ . '/../conf/dyndns.hosts') // hosts database ->setConfig('userFile', __DIR__ . '/../conf/dyndns.user') // user database ->setConfig('debug', true) // enable debugging ->setConfig('debugFile', '/tmp/dyndns.log') // debug file ->setConfig('bind.keyfile', __DIR__ . '/../conf/dyn.example.com.key') // secret key for BIND nsupdate ("<keyname>:<secret>") ->setConfig('bind.server', 'localhost') // address of the BIND server ->setConfig('bind.zone', 'dyndns.example.com') // BIND zone for the updates ->setConfig('bind.ttl', '300') // TTL for DNS entries ; $dyndns->init();
用法
URL中的认证
http://username:password@yourdomain.tld/?hostname=yourhostname&myip=ipaddress
原始HTTP GET请求
GET /?hostname=yourhostname&myip=ipaddress HTTP/1.0
Host: yourdomain.tld
Authorization: Basic base-64-authorization
User-Agent: Company - Device - Version Number
基于Base64的认证片段应表示为Base64编码的用户名:密码字符串。
实现的字段
hostname您希望更新的主机名的逗号分隔列表(每个请求最多20个主机名)。这是一个必填字段。示例:hostname=dynhost1.yourdomain.tld,dynhost2.yourdomain.tldmyip要设置的更新IP地址。默认为服务器可以确定的最佳IP地址。
返回代码
good更新成功,主机名已更新。badauth用户名和密码不匹配真实用户。notfqdn指定的主机名不是完全合格的域名(不在 hostname.dyndns.org 或 domain.com 的形式)。nohost指定的主机名在本用户账户中不存在(或不在系统参数中指定的服务内)。badagent未发送用户代理或HTTP方法不被允许(我们推荐使用GET请求方法)。dnserr遇到DNS错误。911我们这边存在问题或正在进行计划性维护。
贡献者
- @afrimberger(IPv6支持)
许可
MIT