#ip-address #dns-records #dns #dns-server #service-provider #update #dynamic

app dyndns

一个简单的 DynDNS 服务器,用于使用您的互联网服务提供商(ISP)分配的动态 IP 地址更新 Hetzner DNS 记录

7 个版本

0.3.3 2024 年 7 月 25 日
0.3.2 2024 年 4 月 2 日
0.3.1 2023 年 12 月 21 日
0.2.0 2023 年 12 月 17 日
0.1.2 2023 年 12 月 16 日

#2169 in 网络编程

Download history 4/week @ 2024-05-17 5/week @ 2024-07-05 70/week @ 2024-07-19 62/week @ 2024-07-26 2/week @ 2024-08-02

134 每月下载量

AGPL-3.0-or-later

49KB
612

DynDNS

这是一个简单的 DynDNS 服务器。如果您运行此服务器,它允许您使用您的互联网服务提供商(ISP)分配的动态 IP 地址更新 DNS 记录。

目前,此服务器仅连接到 Hetzner 的 DNS API。它与 AVM 的 Fritzbox 路由器进行了测试,尽管任何允许使用足够灵活配置格式的 DynDNS 的路由器都应正常工作。

免责声明

这是一个小型项目,起源于我个人的 DynDNS 需要,遗憾的是 Hetzner 并没有原生支持,尽管他们的 API 和文档允许比较容易地解决这个问题。尽管如此,该项目尚未经过彻底审查。我不是 Rust 专家,但当然我尽力了。

目前,此服务器不稳定。几乎所有可能出错的地方都会导致恐慌,因为错误处理相当原始。尽管如此,它至少对我有用,并且我遇到的所有错误可能会很快得到修复,至少如果我有的话。

您可以在 README.md 文件中的 example-config 文件夹内找到所有配置文件。

配置您的 Fritzbox

如果您想启用您的 Fritzbox 使用您的 DynDNS 服务器,请打开您的设置(默认情况下,它们在 http://fritz.boxhttp://192.168.178.1 上可用)并打开 Internet -> Shares -> DynDNS。在勾选复选框并选择 其他提供商 后,您可以输入更新 URL

https://[YOUR SERVER ADDRESS]/update?user=<username>&password=<pass>&host=<domain>&ip=<ipaddr>&ip6=<ip6addr>

,其中您需要将 [YOUR SERVER ADDRESS] 替换为您的服务器将可用的地址。之后,您可以设置用户名、密码以及您想更新的域名。这些条目必须与您的 config.json 中的条目相匹配。

获取您的 Hetzner API 密钥

https://dns.hetzner.com下打开您的DNS控制台。在右上角,您可以找到您的个人信息。点击API令牌并创建一个新的API令牌。您只需将此令牌复制到config.json文件中。在此示例中,假设我们的API令牌是aiodQ83HFSDIj3iAHfOIAIAOWUR

您还必须确保您想要更新的记录已经存在!选择适当的区域,并使用您的当前IPv4地址创建一个A记录,或使用您的当前IPv6地址创建一个AAAA记录。您可以使用域名本身或子域名。

创建您的config.json

config.json包含DynDNS服务器验证请求所需的所有信息。您可以自行设置用户名和密码;这些信息仅用于确保您不接受任何IP地址。在域名部分,您可以配置您想要更新的域名。

使用HetznerProvider,将provider的值设置为"HetznerProvider",然后输入上一步中获得的API令牌作为apitokenhost键包含您想要更新的域名。在区域条目中,您可以输入域名所在区域。如果host是子域名,这将是最顶层的父域名。如果host是域名本身,只需输入域名即可。必须将id设置为区域的ID;遗憾的是,这不会在DNS控制台中显示,但您可以使用API来查找它

curl https://dns.hetzner.com/api/v1/zones -H "Auth-API-Token: aiodQ83HFSDIj3iAHfOIAIAOWUR" | json_pp

下面是一个示例的config.json

{
    "name": "exampleuser",
    "password": "exampleuserpassword",
    "domains": [{
        "provider": "HetznerProvider",
        "apitoken": "aiodQ83HFSDIj3iAHfOIAIAOWUR",
        "host": "test.example.com",
        "zone": {
            "name": "example.com",
            "id": "notused"
        }
    }]
}

构建和启动服务器

构建和启动服务器相当简单,您只需运行cargo run

如果您想要生成一个可以上传到没有Rust工具链的服务器的二进制文件,可以运行cargo build --release。这将生成可执行文件target/release/dyndns。您可以将此二进制文件上传到服务器并运行。

您还可以使用cargo install dyndns安装此服务器。然后,将构建的二进制文件安装到cargo bin文件夹中(默认情况下,这将位于$HOME/.cargo/)。

在反向代理如nginx后面运行

出于安全原因,**不建议**在没有TLS加密/HTTPS的情况下运行此服务器,因为这会以明文形式传输您的登录信息。启用加密的一个简单方法是将此服务器放在反向代理如nginx后面。

为了防止此服务器绑定到所有地址并直接接受外部请求,在服务器目录中创建一个名为Rocket.toml的文件。

[default]
address = "127.0.0.1"
port = 8079
workers = 1

以下是一个示例nginx配置,可能如下所示。请注意,应将条目更改为服务器可用的域名。还要注意,在upstream部分中,端口号应与Rocket.toml文件中的端口号匹配。

upstream dyndns {
    server localhost:8079;
}

server {
    listen 80;
    listen [::]:80;

    server_name <domainname>;

    root /srv/http/<domainname>/;
    index index.xhtml index.html;

    location /.well-known/acme-challenge {}

    location / {
            return 308 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    ssl_certificate         /etc/letsencrypt/live/<domainname>/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/<domainname>/privkey.pem;

    server_name <domainname>;

    root /srv/http/<domainname>/;
    index index.xhtml index.html;

    location / {
            proxy_pass http://dyndns;
    }
}

您可以将此配置放在/etc/nginx/sites-available/中,然后使用以下命令将其链接到/etc/nginx/sites-enabled/

ln -s /etc/nginx/sites-available/nginx-dyndns.conf /etc/nginx/sites-enabled/

。在确认使用nginx -t一切正常后,您可以重新加载nginx:

systemctl reload nginx

请参考nginx文档以及Let's Encrypt获取更多信息;这只是一个提示和起点,但不是完整的解释。

与systemd集成

通常,您会希望将服务器与systemd集成,以便保持其运行并在启动时自动启动。以下是一个示例服务单元,您可以在系统中的/etc/systemd/system/dyndns.service处安装它。

本教程假定您正在运行systemd和journald。对于其他初始化和/或日志服务,您需要查阅它们相应的文档。请查阅systemd文档以及更多信息;这只是一个提示和起点,但不是完整解释。

[Unit]
Description=DynDNS server
After=syslog.target
After=network.target

[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/srv/dyndns
ExecStart=/srv/dyndns/dyndns

[Install]
WantedBy=multi-user.target

安装文件(并确保WorkingDirectoryExecStart指向正确的位置)后,您还需要通过运行以下命令让systemd了解此单元:

systemctl daemon-reload

systemctl start dyndns

然后,您可以使用以下命令启动服务器:

systemctl stop dyndns

systemctl enable dyndns

来停止它。

journalctl -u dyndns

如果您希望在启动时自动启动服务,可以使用以下命令启用它:


如果您需要访问日志,可以使用journald。