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 网络编程
134 每月下载量
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.box 或 http://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令牌作为apitoken。host键包含您想要更新的域名。在区域条目中,您可以输入域名所在区域。如果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
安装文件(并确保WorkingDirectory和ExecStart指向正确的位置)后,您还需要通过运行以下命令让systemd了解此单元:
systemctl daemon-reload
。
systemctl start dyndns
然后,您可以使用以下命令启动服务器:
systemctl stop dyndns
。
systemctl enable dyndns
来停止它。
journalctl -u dyndns
如果您希望在启动时自动启动服务,可以使用以下命令启用它:
。
如果您需要访问日志,可以使用journald。