【问题标题】:Get the NAT translated IP and port of some local port获取本地某个端口的 NAT 转换后的 IP 和端口
【发布时间】:2014-03-13 03:27:24
【问题描述】:

我有一些软件在 NAT 后面的计算机上的 50885 端口上运行

如何从 Internet 访问此端口? 由于必须启动应用程序,因此我可以从计算机启动某些内容。

如果我理解正确:使用我的本地地址:端口,可以说:192.168.0.10:50885 如果某些事情通过计算机发起的 NAT,那么应该会自动创建某种端口转发,并且应该有某种公共 IP:PORT 应该敲击 NAT 后面计算机上的 50885 端口。我说的对吗?

如果是这样,是不是可以问一个像php这样的服务器端脚本,嘿,告诉我这个公开的IP和端口是什么?

我对端口转发有点困惑。

【问题讨论】:

  • behind a NAT 是什么意思(NAT 是一个动作,而不是一个设备)?您是否有配置了端口/地址转换的路由器?对于您关于检测该配置的问题 - 从该本地主机,不,这是不可能的。
  • 是的,我的意思是在路由器后面
  • 该 NAT 配置只有路由器知道。假设您的路由器配置为将所有入站端口 50885 流量转换为您的公共 IP(例如:12.34.56.78)以转到您的内部主机 192.168.0.10。从外部的角度来看,发送者只知道/关心它需要使用什么作为其目的地(12.34.56.78:50885)。从内部角度来看,您的主机(192.168.0.10)只是在 50885 上接收流量;因为路由器已经转换了流量,所以您的内部主机不知道/关心作为外部发送者原始目的地的公共 IP。

标签: php sockets tcp router nat


【解决方案1】:

根据我的理解,假设您使用套接字 local_ip:local_port 连接 remote1_ip:remote1_port。 NAPT 设备 local_ip:local_port 后变为 translate_ip:translated_port。 remote1 可以获得 translate_ip:translated_port 但我还没有找到这样的服务。下次你与同一个客户端local_ip:local_port的remote2_ip:remote2_port建立新连接时,translated_ip:translated_port会保持不变吗?通常 NAPT 服务器会保留一段时间,比如 5 分钟。因此,如果有人从 remote3:remote3_port 在 5 分钟内连接到 translate_ip:translated_port(从最后一个数据包发送到 translate_ip:translated_port),NAPT 服务器会将流量定向到 local_ip:local_port。如果remote3_port=remote1_port,虽然remote1_ip!=remote1_ip,连接会被本地socket接受。如果信息过期,NAPT服务器会分配一个新的translated_ip2:translated_port2。

【讨论】:

    【解决方案2】:

    是的,您必须查询外部脚本才能从路由器的另一端检索公共信息。有很多网站可以获取 IP(http://whatismyip.comhttp://iplookup.flashfxp.com 等),但我从未见过同时报告 IP 和端口的网站,它们通常只报告 IP。大多数 NAT 在端口上使用一对一的关系,尽管它们可以使用不同的端口。如果您有自己的网站(或有朋友),编写自己的脚本来检索公共端口不会很困难。

    如果您通过路由器从 LAN PC 到外部进行 OUTBOUND TCP 连接,则路由器会自动生成并跟踪必要的 NAT 查找信息,以便它可以为该连接来回转发流量。

    如果您从外部通过路由器与 LAN PC 建立 INBOUND TCP 连接,则不会自动建立 NAT 查找信息。需要通过端口转发规则提前告知路由器,当它在特定公共 IP:Port 上接收到新客户端连接时,将传入连接定向到哪个私有 LAN IP:Port。如果您的路由器支持 uPNP(并且如果它已启用),那么您的应用程序可以在应用程序打开侦听套接字时使用 uPNP API/库以可编程方式在路由器中创建端口转发规则。否则,如果 uPNP 不可用,则必须手动配置路由器。

    【讨论】:

    • it would not be very difficult to write your own script to retrieve the public port 怎么样?只有路由器才能真正了解地址转换;在路由器之外收集翻译的信息只能基于假设。即使使用 whatismyip.com 之类的资源也会为您提供一个可路由回您的公共 IP,但从技术上讲,要知道该 IP 的确切位置是不可能的。想想连接到电缆调制解调器的家用路由器:whatismyip 不会帮助您找到连接到调制解调器的路由器接口。
    • 对于入站端口转换,入站数据包的目的地在目标接收到它们时已经被上游路由器修改,因此目标无法知道由配置的原始目标 IP/端口发件人。真正的 1:1 NAT 将简单地将发往配置的“外部”IP 的 所有 流量转换为内部目标,并且不需要显式端口转换(显然,这只有在您控制多个外部IP,并且您的路由器支持将多个 IP 绑定到其物理外部接口)。
    • @admdrew:公共服务器上的脚本将能够获取路由器的公共端口,因为路由器使用该端口连接到服务器。因此,服务器脚本将能够通过getpeername() 或类似的 API 查询路由器和服务器之间的连接以确定路由器正在使用的端口。我从来没有说过服务器可以确定路由器后面的 LAN IP:Port。但它可以确定路由器本身的公共 IP:端口,然后可以通过连接将其传输回 LAN PC。
    • the server script would be able to query the connection between the router and the server to determine the port that the router is using 服务器接收的出站 TCP 流量(从内部主机的角度)中看到的源/目标端口对于从该服务器到主机的入站生成流量并没有真正的帮助。源端口将是一个随机的临时端口,而目标端口显然是服务器正在侦听的任何端口。这些都不对应于路由器配置用于向内部主机进行入站转换的端口。
    • 您的服务器脚本可以提供帮助的唯一情况是源端口和目标端口应相同的流量,这在 UDP 流量中很常见。但是,在这种情况下,仍然会做出一个假设:您的服务器假设 OP 的路由器已配置并期望在同一端口上接收入站生成的流量。
    猜你喜欢
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2011-01-08
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多