我尝试在线搜索,但只得到了大量不相关的结果,我想要实现的基本上是一个受密码保护的动态 DNS 服务器。
例如,假设我拥有一个域名example.com
,我想创建一个子域名mypc.example.com
(但不只是一个),该子域名仅针对具有特定密钥的手机(Android/iOS)和 PC(Windows、Linux)进行解析,没有该密钥的机器则无法解析 IP。基本上是动态 DNS 服务的私人替代品。
另一个例子,只是为了进一步说明,采用同一个域名,我想让我的 Android 手机始终以该名称发布其 IP phone.example.com
。
我考虑过创建 cron 任务,向我的服务器发送消息以更新某些A
记录,但任何知道子域的人都可以监视我 :P。解决方案是随机子域,但当我真正需要它们时,不可能记住它们。私人本地 DNS 服务器也可以在家里允许这样做,但在其他地方则不行。
有人可以建议我如何为自己建立这样的服务吗?
(如果查询被加密那就更好了,这样答复就不会被拦截/篡改)
答案1
例如,假设我拥有一个域名 example.com,我想创建一个子域名 mypc.example.com(但不只是一个),该子域名仅针对具有特定密钥的手机(Android/iOS)和 PC(Windows、Linux)进行解析,这些没有该密钥的机器肯定无法解析 IP。基本上是动态 DNS 服务的私人替代品。
重点是我加的。这句话表明你的问题已经不再是关于 DNS 的了。你正在寻找与 DNS 类似但又不是 DNS 的东西。
DNS 内的安全机制主要集中在以下领域:
- 验证权威数据的变化,并防止伪造的 IP 在后端系统之间生成虚假消息。(动态更新和区域传输)
- 对递归服务器看到的权威响应进行身份验证,以防止 DNS 中毒攻击。(DNSSEC)
- 保护存根解析器和递归服务器之间的通信,以提高最终用户的隐私,并防止沿该路径进行篡改。(DNS over HTTPS、DNSCrypt 等)
- 减少伪造 DNS 查询所消耗的网络资源量。(DNS Cookies)
需要注意的是,这些举措并不包括个人记录的隐私。DNS over HTTPS 和 DNSCrypt做旨在提供一定程度的隐私保护,但仅限于可能在网络上被监听的存根解析器。据我所知,保护个人记录并不是我们追求的目标。
如果我不得不做出一个假设,那么个人记录隐私之所以不是任何人的首要任务,是因为它完全违背了当前设计模型的本质。人们认为,对于实施所需的努力程度而言,它没有太大的价值。(或者更直白地说,它本质上被认为不适合原始设计)客户端的凭证必须通过递归系统传递到权威系统,并且为了维护隐私,所有参与者之间的传输必须是安全的。它对所有相关方提出了许多要求,但回报却微乎其微。
简而言之,DNS 类似于您正在寻找的解决方案,但它不是按照您设想的模型构建的。Michael 的评论是正确的:您的安全模型必须假设有人会在某个时候通过自动扫描或社交工程来了解 IP 地址。安全性的重点必须放在当有人向您的 IP 地址发送流量时会发生什么。
答案2
所以,实际上没有任何东西可以作为一个产品来实现这一点。你可以或许拼凑一些东西来做一些类似的事情,但不太可能像 iOS/Android 那样,因为你可以改变的东西是有限的(没有越狱/root 等)。
如果您想保护查询不被客户端和服务器之间的窥探,您可以使用 DNSCrypt 或 DNS over TLS 之类的东西,但这并不能解决任何人仍然可以查询您的域的担忧。
DNSSEC 仅允许您验证记录是否确实符合预期,但据我所知,它不提供身份验证机制。它的目标是签署 DNS 响应,以表明查询在被请求后未被其他实体修改。
您想要实现的目标的问题在于,DNS 的工作方式并非如此。从根本上讲,DNS 是一种分布式服务。当您在设备(手机、平板电脑、PC 等)上配置 DNS 服务器时,它会发送全部DNS 查询此框并期望得到响应。如果此框知道该值是什么,它将返回该值;如果不知道,则必须转到其配置中的下一个框并向该框询问该值;此过程重复进行,直到找到响应。
如果你想限制谁可以查询你的机器,最好的办法是使用防火墙规则来控制谁可以首先向系统发送请求。这显然不适用于移动和动态客户端。
您所要求的,必须是定制的解决方案,或对 DNS over TLS 之类的可以添加身份验证的扩展。也许可以使用具有 DNS over TLS 连接的客户端证书之类的东西来证明客户端是您期望的,然后如果正确,则提供 DNS 响应。我认为现在 DNS over TLS 还不支持此功能,但添加它似乎是可行的。
你真正的目标是什么?当人们问出像这样极其具体的问题时,那是因为他们心中有一个目标,并认为他们已经找到了解决该目标的途径……他们往往在错误的方向上寻找答案。
更新:
仅根据域名 ssh 进入我的笔记本电脑就很好了
所以我们已经讨论了为什么这不能仅通过 DNS 来实现。如果真的想要经过身份验证的 DNS,您必须构建自定义解决方案,因为我不知道目前有什么可以做到这一点。
为了实现您的目标(尽管 IP 是动态的,但仍能连接到您的计算机),我会研究 TeamViewer 之类的服务,其中有一个远程服务器,该服务器设置为接受来自您的客户端计算机的持久连接。这样您就可以连接到该服务,然后该服务将能够设置到远程客户端的“隧道”。另一个这样的服务是 LogMeIn 之类的服务。
这些工具会设置从客户端到服务提供商服务器的持久连接。这意味着您可以通过大多数 NAT/防火墙设置连接,因为大多数网络不会阻止出站流量。从这里开始,无论您的笔记本电脑是在家里还是在当地的咖啡店,您仍然可以使用它。
答案3
仅供参考,由于没有更好的解决方案,我使用一个简单的 Flask/Python web 应用程序来更新数据库中的 IP 地址,并在此基础上生成一个 hosts 文件,在我的设备和本地 DNS 解析器之间同步。这避免了在线发布的问题。
不幸的是,iOS 设备只能使用本地 DNS 服务器解析这些名称,但这还算可以。