我有一个域(例如example.com
)、静态 IP 地址(例如)和位于, , ,的212.5.5.5
本地设备(这不是网站)。192.168.0.1:80
192.168.0.2:80
192.168.0.3:80
192.168.0.4:80
192.168.0.4:47
如何使用子域(例如,、等)访问这些device1.example.com
设备device2.example.com
?
目前我只能得到example.com:80
和example.com:47
工作,它指向192.168.0.4:80
和192.168.0.4:47
。
我知道您不能在 DNS 服务器上设置端口。
我应该如何克服我的问题?
您可以让一台面向公众的服务器运行 nginx 反向代理,将基于子域的流量重定向到正确的服务器。
“主”服务器上的 nginx 配置:
除了其中一个之外,您需要为所有内容使用备用端口。例如,212.5.5.5:80 将转发到 192.168.0.1:80,然后 212.5.5.5:81 将转发到 192.168.0.2:80,而 212.5.5.5:82 将转发到 192.168.0.3:80,依此类推上。这在大多数现代 NAT 设备上应该是可配置的。
另一种方法,如果您愿意使用 IPv6,只需在您的 NAT 设备或路由器上打开 IPv6 传递。这基本上将您 LAN 上的每个 IPv6 地址都暴露给了公共互联网,让您可以直接从外部访问它们。正如您可能想象的那样,这会带来一些风险。由您决定该风险是否可以承受。
您不应将这些服务直接暴露给互联网。您无法审核这些设备以确保它们是安全的,仅仅暴露它们就会泄露有关内部网络状态的信息。
正确的解决方案是设置一个允许您远程访问内部网络的 VPN 服务器。理想情况下,内部网络应与您的主要网络隔离,仅用于这些暴露的设备。如果它们被黑客攻击,这会限制损失。
开源 VPN 软件成熟、经过审核且安全问题广为人知。您将自己限制在更小的攻击面。
如果您只有一个外部 IP 地址,则:
首先是区分我的端口,你好像已经做到了。
接下来对于所有的80端口,可以使用nginx作为反向代理,将流量路由到各个地方。您可以准确地告诉它您要求什么,例如路由
http://device1.example.com
到192.0.0.1:80
等。另一种方法是路由http://example.com/device1
到192.0.0.1:80
。要执行第一种方式,请参阅 nginx 手册中的虚拟主机。
如果使用虚拟主机方法,您还必须将所有名称指向外部 IP 地址。或者只是基域,如果使用目录方法。
您可以首先确保每个人都需要从 Internet 访问这些服务(=它们确实是公开的)。否则,您可以考虑设置一个 VPN 服务器并访问您网络内的服务。
我假设端口上的服务是
80
提供典型 Web 服务的 Web 服务器。在这种情况下,其他答案中建议的反向代理解决方案适用。它们可能是准备/打算使用
SRV
您的 DNS 中的条目运行的服务。这个想法是你解决了一个众所周知的服务记录,这反过来又给了你要连接的名称:端口。以 Minecraft 为例:minecraft.example.com
_minecraft._tcp.minecraft.example.com.
以获取要连接的实际 IP 和端口。这是一个非常有用的功能,但它必须在您正在访问的服务的客户端上实现
如果你想要的正是你所描述的,丹尼尔的答案是正确的 - 你必须设置另一台服务器,让它接收所有 :80 流量并根据域将其代理到正确的服务器。
但我建议简单地获取另一个 IP 地址。从您的评论来看,您似乎正在使用一些本地 ISP,并且您可以在附近的多个 ISP 中进行选择。处于竞争环境中的较小 ISP 很可能就任何问题达成一致。只要您做的事情合法,他们中的大多数人都会同意以每月几欧元的价格为您提供一个额外的 IP 地址。
另一种选择是只使用一台服务器。如果您的 :80 服务器是同一主机上的虚拟机,您将通过使用多个虚拟主机为所有服务提供单个 Web 服务器来节省资源并降低复杂性。