#ip-address #ip #dns #tool #ddns #dynamic-dns

app d5

一个简单的、遵循Unix哲学的工具,用于远程检索您家庭网络的IP地址

1 个不稳定版本

0.4.2 2019年10月15日

#2184 in 开发工具

GPL-3.0-or-later

30KB
73

d5— DIY动态DNS

一个简单的、遵循Unix哲学的工具,用于远程检索您家庭网络的IP地址

如果您想了解您正在使用的计算机的IP地址,有大量的工具可供选择,例如ifconfig.ioifconfig.meifconfig.meifconfig等。

然而,如果您想了解其他计算机的IP地址——比如,您在旅行时想了解您家庭计算机的IP地址——您的选择就非常有限。这就是d5的作用所在。使用d5,您可以在您的家庭计算机上设置一个简单的脚本,更新与用户名-密码对关联的IP地址。一旦完成,您就可以从世界任何地方使用相同的用户名-密码对来访问该IP地址的当前值。

这是一个简单的问题:您想了解一个IP地址。这样的简单问题应该有一个简单的解决方案。d5就是这样的简单解决方案。

示例用法

如果您想使用我托管的我公开的d5服务器,您可以在您的家庭计算机上运行一个cron作业来向d5发送POST命令。例如,在您的家庭计算机上使用以下cron作业(当然,用您的实际值替换USERPASSWORD

*/5 * * * * curl -u USERNAME:PASSWORD https://d5.codesections.com -X POST

您可以用任何其他定时方法(systemd定时器、emacs定时器、runwhen脚本等)替换。唯一重要的是要定期运行该命令:curl -u USERNAME:PASSWORD https://d5.codesections.com -X POST

完成这些后,您可以使用以下curl命令访问最近更新的IP地址

curl -u USERNAME:PASSWORD https://d5.codesections.com`

如果您想使用shell脚本/别名来自动化使用d5的过程,这样做很简单。例如,我使用以下Bash别名

alias ssh-home='ssh $(curl $USER https://d5.codesections.com) -p $SSH_PUBLIC_PORT

从别名中省略:PASSWORD部分会导致每次使用curl时都提示我输入密码。如果您不想因为提示密码而烦恼,可以将密码以明文形式存储或使用您首选的凭证存储方法。

如果您想删除之前存储的IP地址,可以通过向d5发送DELETE命令来实现。

curl -u USERNAME:PASSWORD https://d5.codesections.com -X DELETE

如果您对d5.codesections.com上的公共d5服务器感到满意,那么您只需要知道这些。如果您想自行托管d5,请继续阅读。

自行托管d5

如果您不想使用d5.codesections.com服务器,您也可以自己托管d5。(当然,您需要在可以远程访问的地方托管d5。)

安装d5

由于d5是以静态链接的二进制形式分发的,因此在任何x86 Linux发行版上安装它就像下载最新版本并将其设置为可执行文件一样简单(chmod +x ./d5)。

d5设计用于在服务器环境中运行,因此目前不提供macOS、Windows或ARM(例如树莓派)计算机的二元文件。如果您需要这些平台之一的预编译二元文件,请提出问题。在此期间,您可以使用Cargo(Rust包管理器)从源代码构建d5。

配置和运行d5

通过命令行调用d5来运行它(./d5)。您可以使用环境变量来配置它;d5目前支持以下变量

  • PORT:d5运行的端口号(如果未指定,则默认为3030
  • HOST:d5运行的宿主地址(如果未指定,则默认为127.0.0.1)。HOST可以指定为IPv4地址或字符串(例如,localhost)。
  • KEY:如果设置,则启用以下描述的单用户模式,并设置单用户模式的username:password密钥。

默认情况下,d5处于多用户模式。在此模式下,d5允许任何用户存储IP地址并使用关联的用户名-密码对检索它们。如果您提供KEY环境变量,d5将运行在单用户模式下,并且允许通过KEY环境变量提供的用户名-密码对存储单个IP地址。在设置KEY变量时,您必须以curl使用的相同格式提供用户名和密码:由冒号分隔(username:password)。

使用反向代理(例如Nginx)与d5一起使用

尽管您可以直接将d5暴露给公共互联网,但更常见的部署策略是将d5放置在反向代理之后,例如NginxTraefik。如果您这样做,您需要配置您的反向代理以通过remote_addrx-forwarded-for头将传入的IP地址转发。 (d5读取这些头以了解相关的IP地址。)例如,以下是在d5.codesections.com上定位的服务器的最小Nginx配置块:

server {
    server_name d5.codesections.com;
    location / {
        proxy_pass http://localhost:3030;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

根据您期望的安全性,您几乎肯定需要设置https(例如,使用Let's Encrypt),并且您还可能希望设置速率限制。

使用d5返回的IP地址

如上所述,d5的主要用例是返回计算机的当前IP地址,为ssh或类似命令提供目标。然而,在Unix工具的长期传统中,d5提供了简单、机器和人类可读的输出,并且可以轻松与其他工具结合以解决更复杂的问题。

例如,如果您需要一个完整的动态DNS解决方案(而不是DIY版本),可以将新IP地址传递给DNS Lexicon,并让它处理与特定URL关联的DNS记录更新。

目标

d5力求成为

  • 简单/简约 — d5解决的是一个简单的问题:您不知道计算机的IP地址,但想知道。这不应该很难。d5的源代码目前是一个包含73行代码的单一文件;我想不出任何理由它应该超过100行代码。
  • 轻量级 — 与上述内容一致,d5不应使用很多CPU周期或大量RAM来解决这样一个简单的问题。
  • 私密且相对安全 — d5不应记录IP或用户信息,并且在不妨碍前两个目标的情况下,应尽可能安全。

非目标

d5并不是试图

  • 提供除了IP地址以外的信息(用户代理等)。请使用ifconfig.me
  • 提供完整的(非DIY)动态DNS解决方案。请使用DDclientduckdns或类似服务。或者,如上所述,使用d5 + DNS Lexicon。

常见问题解答(FAQ)

为什么我应该使用d5而不是完整的动态DNS解决方案如DDclient?

也许您不应该!DDclient/类似软件做两件事:1)监视您的当前IP地址;2)更新DNS设置,使可读的URL指向新地址。如果您需要这两个功能——也就是说,如果您想设置一个动态的可读URL——那么使用DDclient可能是有意义的。(尽管我认为还有Unix哲学/分离关注点的理由,可以将这两个任务分开到不同的程序中,并使用d5 + DNS Lexicon。)

但是,很多时候,您不需要具有可读URL的真正动态DNS——您只需要一种无论IP地址如何变化都能连接到计算机的方法。如果您不需要这种额外功能,那么承担像DDclient这样的代码复杂性的负担是过度的。例如,DDclient有超过4,000行的Perl代码;d5不到100行的Rust代码。4,000行的代码提供了更大的错误面。

为什么我应该使用d5而不是DuckDNS或类似的服务?

隐私和控制。我对DuckDNS或类似的服务没有任何反感——DuckDNS的隐私政策看起来相当不错,就这类事情而言。但他们有隐私政策,因为他们确实收集个人数据——他们必须这样做,以提供他们所提供的服务。d5以任何方式都不会存储您的数据,如果您不相信d5.codesections.com上运行的版本,您可以轻松地自己托管自己的副本。

为什么我应该使用d5而不是自托管ifconfig.io或类似的服务?

简洁。像ifconfig这样的工具既做得太多又做得太少。它们做得太多,因为它们除了IP地址外还提供了大量信息;您不需要这些信息来远程连接,收集它们只会让代码更复杂。它们做得太少,因为它们只告诉您关于当前计算机的IP地址,而不允许您检索其他计算机的IP地址。这意味着,当使用ifconfig时,您需要首先获取您计算机的IP地址,然后然后找到一种方法将IP地址发送到其他地方。这涉及到多次往返,比简单任务所应有的复杂性要多。

我可以不使用curl使用d5吗?

当然可以——d5公开了一个非常简单的HTTP API,curl只是消费该API的一种方式。如果您想使用不同的工具来发送HTTP请求,您可以将curl命令示例转换为您的首选工具,请参阅curl.trillworks.com

d5有多安全?

d5提供了一定的安全性,但并非非常出色。d5不会在磁盘上存储IP地址或用户名-密码对,因此d5服务器的泄露不会泄露任何此类数据。然而,因为d5使用基本认证,用户名-密码对将以纯文本形式传输(除了HTTPS提供的加密之外)。因此,任何彻底破坏d5服务器的人都会处于截取IP地址和用户名-密码对的位置。此外,d5本身不实现速率限制(尽管在反向代理级别很容易实现)。这意味着,根据代理配置,弱用户名-密码对可能会受到暴力破解的威胁。

难道d5不应该像Postgres或Redis这样的数据库中存储IP地址,而不是在内存中保持它们吗?

不。d5的主要目标之一是尽可能简单,依赖单独的数据库将与“简单”截然相反。

好吧,但d5至少应该将IP地址存储在文本文件中吗?在内存中保持它们看起来……太脆弱了。

那也是我的第一个想法(以及d5的初始实现),但有两大考虑让我改变了主意。首先,存储密码需要哈希它们(增加复杂性)并可能使攻击者能够访问哈希密码(降低安全性)。

其次,更重要的是,我意识到持久化IP地址是不必要的。将数据持久化到硬盘的正常原因是为了防止程序崩溃或关闭时数据丢失。但是,d5背后的整个想法是IP地址不断变化,并且每几分钟就会更新一次。因此,如果d5崩溃,就不会丢失有意义的数据——5分钟内,所有IP地址都会重新添加到系统中。

真的可以把d5称为“DIY动态DNS”吗?它不会创建任何DNS条目。

这是一个合理的观点,我之所以称之为“DIY”,是因为我试图达到的目的。如果您想称之为“自托管远程IP地址检索”,我不会与您争论。但这个名字听起来并不那么顺口。

为什么叫d5?我注意到“DIY动态DNS”只有三个D。

主要是因为我想避免与d3.js(一个JavaScript数据可视化库)名称冲突。但如果两个缺失的D让您感到困扰,您可以将这个项目视为“Daniel的DIY动态DNS,适合初学者”(“适合初学者”部分指的是对简单性的过度关注)。

依赖关系

~14–24MB
~372K SLoC