两台计算机如何通过 NAT 连接到同一个外部地址?

Posted

技术标签:

【中文标题】两台计算机如何通过 NAT 连接到同一个外部地址?【英文标题】:How do two computers connect to same external address through NAT? 【发布时间】:2010-12-31 05:35:40 【问题描述】:

如果我有两台内部计算机通过 NAT 路由器连接到同一个外部 IP 地址,路由器如何将流量传送到正确的内部计算机?据我了解,NAT 将传入数据包转发到最近将传出数据包发送到 [传入数据包] 发件人 IP 地址的计算机。由于两台计算机都发送到相同的地址,路由器是否将数据包转发给两者?如果是这样,客户端软件是否有责任确定哪些数据包是相关的?

如果两台计算机都尝试连接到同一个端口,是否有可能?

【问题讨论】:

如果您询问基于 IP 的程序是否需要了解 NAT,答案是否定的 - 这就是它如此成功的原因。 有一个公认的答案,所以我看不到赏金的重点。 @RonMaupin 他想为现有答案提供一些声誉奖励,因为他喜欢它或者它对他有很大帮助。请参阅赏金的描述 一个或多个答案是典型的,值得额外的赏金。奖励现有接受的答案。这里的人们经常这样做,即使多年后也能对好的答案给予额外的奖励。 【参考方案1】:

当您打开一个套接字时,您需要寻址目标系统的一个端口并在您自己的系统上打开一个共轭侦听端口以接收任何响应。您必须向目标系统发送您的侦听端口。

有多个系统使用同一个调制解调器

当您启动网络浏览器并访问 www.google.com:80 时,您的浏览器会从系统获取/搜索一个免费的非系统共轭端口以进行侦听。假设共轭端口为 10000。监听端口用于接收来自 google 的 http 流。

然后,您旁边的孩子也顺便浏览了 www.google.com:80 和他/她的 play station 或 xbox 的 google 会话——随便什么也被分配了共轭端口 10000。

你们俩都坐在电缆调制解调器后面,而电缆调制解调器后面是您的无线路由器。并且您的两个系统都位于无线路由器之后 - 所有系统都按照网络拓扑的顺序排列。

防止路由器/调制解调器上的端口地址冲突

假设您的有线电视公司 DHCP 为您的调制解调器分配了 ip4 地址 72.72.72.72。但是您的无线路由器 DHCP 将 192.168.0.10 分配给您的系统,并将 192.168.0.11 分配给您孩子的系统。

当携带您的侦听器端口信息的帧通过您的 NAT 路由器时,它会转换一个或两个侦听端口。假设您的页面使用端口 15000,您孩子的页面使用端口 16000。

然后,您的无线路由器会将来自 72.72.72.72:15000 和 72.72.72.72:16000 的请求发送到 Google 服务器。

然后,谷歌服务器分别响应 72.72.72.72:15000 和 72.72.72.72:16000,当您的无线路由器遇到响应时,它会进入它存储的映射并将 72.72.72.72:15000 转换为 192.168.0.10 :10000 到达您的系统,但将 72.72.72.72:16000 转换为 192.168.0.11:10000 以到达您孩子的系统。

运行 web/game/ftp/etc 服务器

但是,如果您的系统上运行着 Web 服务器或 ftp 服务器,该怎么办。如果您有两个系统并且都有一个 Web 服务器,并且两个 Web 服务器都在侦听端口 80,该怎么办?

假设您的第一个 Web 服务器系统的无线路由器注册/分配的本地 IP 地址是 192.168.0.30,而您的第二个 Web 服务器系统是 192.168.0.40。

无线路由器通常默认有一个配置网页 192.168.0.1:80,除非您更改它。页面上会有一个选项卡,您可以在其中定义/保留应用程序端口映射。

您可以在无线路由器上注册以保留映射

192.168.0.30:80 => outgoing port 8080
192.168.0.40:80 => outgoing port 8088

这样您就必须给您的朋友打电话,您的网络/游戏服务器可以通过 分别为 72.72.72.72:8080 和 72.72.72.72:8088, 无线路由器将阻止其端口 8080 和 8088 使用自己的动态 NAT。

当然,72.72.72.72 与仅在您的 ISP DHCP 决定更新调制解调器的 ip4 地址为 72.72.90.200 之前一样好。之后,您必须给您的朋友打电话/发电子邮件并说 嘿嘿,服务器地址分别改成了 72.72.90.200:8080 和 72.72.90.200:8088。或者您可以订阅动态 dns (ddns) 服务以使用命名域,其中 ddns 服务需要您在系统上安装一个简单的心跳实用程序来帮助他们监控地址变化。 DDNS 翻译是一个单独的问题/策略。

NAT 调制解调器

较新的 ISP 合同为您提供具有 NAT 的调制解调器。如果是这样,您必须关闭调制解调器上的一个或无线路由器上的一个。您不应该同时使用两者 - 翻译两次有什么意义,因为 NAT 只是为了防止地址冲突。当您从无线路由器关闭 NAT 时,它可以作为集线器交换机而不是路由器运行,这样您就可以使用其 LAN 插槽之一而不是通过其 WAN 插槽将其连接到调制解调器。

【讨论】:

+1 多么棒的解释!我一直对以下事实感到沮丧:大多数关于 NAT 的解释从未真正阐明对传出连接的回复是如何将其返回给发送者的。 这是否意味着,每个目标 ip 的连接数受限于可用端口号的数量。即,如果一个组织有超过 65,000 名员工都尝试访问 google.com(假设 ip 相同),如果他们都在同一个 ip 后面,将无法正常工作?在这种情况下会发生什么?有这个术语吗? 看:freeccnastudyguide.com/study-guides/ccna/ch10/…【参考方案2】:

路由器为每台计算机管理独立的“源”端口。虽然您可能连接到“目标”上的端口 80,但路由器可能会将源端口分配给某个高编号端口。

Wikipedia 总结为

网络地址转换涉及 重写源代码和/或 目标 IP 地址,通常 也是 IP 的 TCP/UDP 端口号 数据包通过 NAT 时。 校验和(IP 和 TCP/UDP)必须 也被重写以考虑到 变化。

【讨论】:

如果我错了,请纠正我:两台计算机最初都在端口 1000 上请求连接到 1.1.1.1。路由器组成新端口,40000 和 40001。路由器发送数据包,仍然连接端口 1000。当服务器发回它时,它会发回端口 40000 或 40001。这是有道理的,只是我认为打开连接时,发送和接收发生在同一个端口上。 一个“socket”由四部分数据组成:源IP地址、源端口、目的IP和目的端口。在您的示例中,端口 40000 和 40001 是源端口,1000 是目标端口。【参考方案3】:

已经提供了很好的答案,但这里有另一个例子:

    HOST A addr         HOST B addr
    10.1.0.2:4040       10.1.0.3:4040
-----------------------------------------
NAT 200.50.50.28:4040   200.50.50.28:4041 (what external host sees)

200.50.50.28 是路由器的全球(互联网)IP。

每个端口号在 NAT 表中都是唯一的。当然,路由器会透明地完成修改源地址和目标地址的所有工作。

【讨论】:

那么如果两台计算机使用相同的源端口,路由器会自动为任何主机重新分配一个新的 src 端口?然后主机 A 和主机 B 连接的服务器看到不同的 src 端口?如果主机A和主机B的端口没有冲突,路由器不会改变src端口吗?只是想确认我是否理解正确。谢谢 @kuchi,是的,服务器看到每个主机的不同端口。路由器通常会解决地址冲突,即如果两台主机连接到两台不同的服务器,则可以使用相同的端口。元组 (src_ip, src_port, dest_ip, dest_port) 必须是不同的。【参考方案4】:

它为传入的外部流量使用不同的端口,然后 NAT 将一个端口上的数据包路由到一个内部 IP 地址,并将来自另一个端口的数据包路由到另一个内部 IP 地址......来自每个内部的初始请求计算机,当它在出路时通过 NAT 时,确定哪个端口将用于来自外部 IP 地址的传入流量,并告诉外部服务器将其流量发送回该连接的哪个端口。

【讨论】:

【参考方案5】:

RFC3022 提供了大量有关其工作原理的信息

【讨论】:

【参考方案6】:

由于已经讨论了 Internet 服务提供商 (ISP) 提供的面向公众或外部 IP 地址,因此我想补充一下。 您可以要求您的 ISP 让您的公共 IP 地址保持不变。它将变为静态,因此如果您的朋友想在您的网络地址转换器 (NAT) 中访问您的服务器,您不必通知他们更改 IP 地址。 在撰写本文时,静态 IP 地址的成本约为 100 美元。大多数 ISP 他们称之为商业帐户。 您可以通过谷歌搜索“我的 IP 地址是什么”来确定您面向公众的 IP 地址。

【讨论】:

以上是关于两台计算机如何通过 NAT 连接到同一个外部地址?的主要内容,如果未能解决你的问题,请参考以下文章

NAT——网络内部计算机的保护伞

网络地址转换

TeamViewer是怎样做到穿透NAT和防火墙的

从外部 IP 连接到 MySql

如何使用外部IP NAT启动JBoss AS

配置NAT