所以我有一台服务器。它已启动并正在运行。它可以通过代理服务器访问。问题是 - 服务器可以通过其全局名称在本地网络外访问,但无法通过该名称在内部访问...
我使用 Windows NAT Traversal api (UPnP) 使我的服务器可以在本地网络之外访问......
如何使本地网络中的计算机能够使用非本地 IP 地址访问我的服务器?
详细来说:
在本地机器上我有一台服务器(甚高频液晶例如将实时视频数据从我的 webCamera 广播到某个套接字)我可以通过 127.0.0.1:5281(环回)和我的本地网络(我有带 4 个以太网端口 + wify 的 ADSL 路由器)访问它,方法是转到 192.168.1.13:5281 - 这是路由器在本地网络上创建的地址。
我使用了免费的开源程序,例如这使用 UPnP 将我的端口 4773 转发(绑定)到我的外部 IP 地址 97.132.48.111(例如)作为端口 33333,这样现在任何人(互联网用户、代理服务器等)都可以通过访问类似 97.132.48.111:33333 的 URL 来访问该直播流
但是我或我的本地网络(地址为 192.168.1.13)的用户无法使用 97.132.48.111:33333 访问我的流,只能使用 192.168.1.13:5281
我的问题是为什么我不能使用全局地址从我的流中获取数据,我和我的本地网络中的人可以使用全局地址获取流数据吗(如果可以的话如何获取)?
正如我所说,我使用了一个使用协议请求 (UPnP) 来转发端口的程序。我可以使用 UPnP 之类的协议配置我的路由器(至少理论上如此),以使我的路由器变得智能吗?有这样的协议吗?
所以对我来说,主要的是尽可能使用采用开放协议的程序来实现这一点,因为我是一名程序员,我的观点是创建程序,允许 ADSL 用户打开他们的服务器并以我在问题中描述的方式访问它们 - 通过全局地址(顺便说一下,可以是临时的 - 我有一个临时的)=)
目前,我在程序中使用 UPnP 库来转发端口。现在我需要一些协议来配置路由器,使其更智能一些。有人知道吗?
答案1
不幸的是,你的问题缺乏细节,但如果我仔细观察,我就会想到你在 NAT 内部的网络上托管了一个 Web 服务器,并且你在 DNS 中拥有该服务器的公共 IP 地址。
您可能需要设置分割视图 DNS。这意味着您需要为来自 NAT 内部主机的 DNS 请求提供内部 IP,并为外部主机提供外部地址。
答案2
Zoredache 的想法是正确的。问题在于 NAT 的工作方式。如果不做任何特殊的事情,并且使用不智能的 NAT 网关,您的数据包就会发生这种情况。
- 内部用户(位于 192.168.1.30)连接到 93.100.45.201:33333。它发送了一个 SYN 数据包。
- NAT 网关将该连接转发到 192.168.1.13:4773。
- 位于 192.168.1.13:4773 的服务器看到 192.168.1.30 向 4773 发送了一个 SYN 数据包,以启动 TCP 对话。它向 192.168.1.30 回复 SYN/ACK。
- 内部用户 (192.168.1.30) 看到来自 192.168.1.13 的 SYN/ACK 数据包并将其丢弃。它原本期待来自 93.100.45.201 的 SYN/ACK。
- 大约 3 秒和 9 秒后,192.168.1.13 再次重新传输 SYN/ACK,而 192.168.1.30 则尽职尽责地将其丢弃,因为它仍在等待 93.100.45.201 回复它。
这里有两个选择。第一个是如 Zoredache 指出的那样,创建一个水平分割 DNS(内部用户看到一组 DNS 条目,外部用户看到另一组)。这样,同一个名称可以根据您所在的位置指向两个不同的 IP 地址。
解决此问题的第二种方法是使用足够智能的 NAT 网关来识别此特定路由。它不会盲目地转发 192.168.1.30 的数据包而不做任何更改,而是会重写它,使源成为网关本身。这称为源 NAT(根据谁在销售盒子,可以有许多其他名称)。这会反转 NAT,因此重写的是源,而不是目的地。
第一种方法是最便宜的,因为您可以在内部运行自己的 DNS 服务器,其余的只是各种类型的配置更改。第二种方法需要花钱,但只要您安装到位,它应该就可以正常工作。