networking - 如果 device2 不知道 device1 的私有 IP,有没有办法从同一 LAN 中的不同设备访问服务器?
问题描述
我正在提供一个应用程序,我希望可以从同一网络中的不同设备访问该应用程序。据我所见,我可以通过访问服务器的私有 IP 来做到这一点。但其他设备无法知道这一点。有没有办法设置类似内部域的东西?
解决方案
出于此答案的目的,我将 HTTP 称为协议,它是迄今为止最广泛和最常用的协议。如果是别的东西,原理是一样的。
要考虑的第一个选项是“仅”使用 IP 地址。 https://192.168.0.3/
记起来还不错;IPv6 更糟,更长。您可以通过电子邮件、聊天或以其他方式将您的用户链接到该地址,这样您就不必记住它。大多数家庭网络默认使用 DHCP,但通常将相同的地址分配给相同的 MAC 地址,除非设备更新次数过多导致 ip 池耗尽,因此地址在实践中很少更改。此外,大多数路由器都会留下不属于 DHCP 池的 IP 空间,您可以在服务器上对其进行静态配置,以排除任何 IP 更改。
IP地址法的魅力在于投资少。现在可以开始工作了。不利的一面是,如果您的 IP 地址发生更改,您的客户端现在无法访问当前配置的服务。输入 DNS。当客户端使用 DHCP 提供的 DNS 服务器来查询名称记录(例如stackoverflow.com
.
家庭网络上的 DNS 服务器通常是由 ISP 提供的(或者希望,因为 ISP 通常不擅长提供良好的 DNS,你会指向 cloudflare(1.1.1.1)或 Google(8.8.8.8、8.8.4.4)或其他一些不错的公共 DNS 的 DNS 提供商。无论哪种方式,关键是,您当前配置的 DNS 服务器可能无法配置为提供您设计的记录。
这给您留下了 4 个选项:公共 DNS、私有 DNS 服务器、“借用”DNS 域或 /etc/hosts。
公共 DNS 可以提供私有 IP 地址,这可能是下一个最简单的解决方案。您必须付费注册域并购买 dns 托管(许多 dns 注册商免费提供 dns 服务)。然后,您可以拥有一个类似的名称myhouse.net
并添加一个“A”(地址)记录,app.myhouse.net
其值为您的本地 IP 地址。任何对该名称的公开查询都将查找您的内部 IP 地址,但这并不是什么大的披露(他们知道您在 RFC 1918 地址空间之一),他们可以像使用域名一样轻松地钓鱼和 xss ,所以对于家庭使用,我认为将私有 ipv4 地址发布到公共 DNS 基本上可以不受惩罚地完成。请注意,这些地址空间是不可路由的 - 它们无法从 Internet 访问,并且与许多其他人的冲突
私有 DNS。正如我们所讨论的,您的网络中可能没有 DNS 服务器,或者您不会问这个问题。您正在使用公共 DNS 服务器进行解析。因此,您无处定义域和记录,例如app.myhouse.local
. 私有 DNS 的第一步是创建或获取可以通过 DHCP 提供给本地客户端的服务器,并且可以使用您的私有域记录进行配置。该服务器将被配置为还递归地执行公共查询,因此它可以用于网络上的所有 DNS 流量。这样,您就可以“发明”自己的“私人”领域,这不是公共知识的一部分。这显然是沉重的打击。您可能可以找到某种服务,让您可以在线执行此类操作,否则您需要安装 Bind 或等效软件。从好的方面来说,它是免费的,并且了解更多关于 DNS 的信息始终是一项不错的投资。
“借用” DNS - 我指的是https://www.noip.com/之类的服务,它允许您在其域之一下创建主机记录。它们通常还包括软件和 API,您可以通过它们更新记录以指向您的动态 IP 地址。我不知道您是否可以在这些服务中存储私有 IP 地址。域名将是他们的一个,而不是您选择的一个(类似myhouse.noip.com
)但它们通常很便宜或免费,并且它们确实解决了创建 DNS 记录的直接问题。同样,该记录将是公共dns 中的私人地址,可以从世界任何地方查询。
/etc/hosts:这个文件(有趣的是,它也存在于 windows 中)为本地系统提供了替代 DNS 的名称解析系统。它通常优先于 DNS(即首先检查它),并可用于在大多数主机上定义记录。我不知道你会如何在平板电脑或手机上做到这一点,而且这显然是你必须提前设置的——不太适合你的用例。
查看这些选项,我建议您首先考虑借用的 dns 域提供商之一。如果这看起来不错,那么你就完成了。如果您无法证明将您的私有 IP 地址放入公共 DNS 是合理的,那将迫使您走这条路。也许只使用IP地址就可以了。
推荐阅读
- google-cloud-platform - 将来自不同项目的服务帐户分配给 Pub/Sub 上的推送订阅
- excel - VBA 计算当天完成的总数,并取决于拆分为三个不同工作表的标准
- cakephp - CakePHP 4.2 Annotate:不正确的应用程序命名空间
- python - 如何将值从 odoo js 传递到控制器?
- amazon-redshift - RedShift:嵌套 json 的一些问题
- python - 如何将空的可选参数从 Python 传递到 Excel VBA 宏
- javascript - 使用 Ajax 将 html 值发送到 Flask 控制器
- ssl - apache tomcat 无法加载证书密钥
- react-native - 在 Recat Native 中重置初始状态值
- jquery - 使用 jQuery 从元素中删除除特定内部跨度之外的内容