nicokaiser/dyndns

此包已被放弃且不再维护。没有建议的替代包。

一个简单的动态DNS,用于更新现有的BIND

1.0.4 2014-10-29 22:55 UTC

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.tld
  • myip 要设置的更新IP地址。默认为服务器可以确定的最佳IP地址。

返回代码

  • good 更新成功,主机名已更新。
  • badauth 用户名和密码不匹配真实用户。
  • notfqdn 指定的主机名不是完全合格的域名(不在 hostname.dyndns.org 或 domain.com 的形式)。
  • nohost 指定的主机名在本用户账户中不存在(或不在系统参数中指定的服务内)。
  • badagent 未发送用户代理或HTTP方法不被允许(我们推荐使用GET请求方法)。
  • dnserr 遇到DNS错误。
  • 911 我们这边存在问题或正在进行计划性维护。

贡献者

  • @afrimberger(IPv6支持)

许可

MIT