为什么代理服务器可以访问我的服务器而我不能?

为什么代理服务器可以访问我的服务器而我不能?

所以我有一台服务器。它已启动并正在运行。它可以通过代理服务器访问。问题是 - 服务器可以通过其全局名称在本地网络外访问,但无法通过该名称在内部访问...

我使用 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 网关,您的数据包就会发生这种情况。

  1. 内部用户(位于 192.168.1.30)连接到 93.100.45.201:33333。它发送了一个 SYN 数据包。
  2. NAT 网关将该连接转发到 192.168.1.13:4773。
  3. 位于 192.168.1.13:4773 的服务器看到 192.168.1.30 向 4773 发送了一个 SYN 数据包,以启动 TCP 对话。它向 192.168.1.30 回复 SYN/ACK。
  4. 内部用户 (192.168.1.30) 看到来自 192.168.1.13 的 SYN/ACK 数据包并将其丢弃。它原本期待来自 93.100.45.201 的 SYN/ACK。
  5. 大约 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 服务器,其余的只是各种类型的配置更改。第二种方法需要花钱,但只要您安装到位,它应该就可以正常工作。

相关内容