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

21
如果我有两台内部计算机通过NAT路由器连接到同一个外部IP地址,那么路由器如何将流量传递到正确的内部计算机? 我的理解是,NAT将传入的数据包转发到最近向[传入数据包的]发送者IP地址发送出站数据包的计算机。既然两台计算机都发送到同一地址,那么路由器会将数据包转发到两台计算机吗?如果是这种情况,是否客户端软件需要确定哪些数据包是相关的?如果两台计算机都尝试连接到同一个端口,是否可能呢?

4
如果你在询问你基于IP的程序是否需要意识到NAT,答案是否定的 - 这就是为什么它如此成功的原因。 - Mark Ransom
已经有一个被接受的答案了,所以我不认为设置悬赏有什么意义。 - Ron Maupin
@RonMaupin 他想将一些声望奖励提供给现有的答案,因为他喜欢它或它对他有很大帮助。请参阅赏金的描述一个或多个答案是值得额外赏金的典范。奖励现有的被接受的答案。这里的人经常这样做,即使多年后也会向好的答案奖励额外的赏金。 - Christos Lytras
6个回答

44
打开套接字时,您需要指定目标系统的一个端口,并在自己的系统上打开一个相应的监听端口来接收任何响应。您必须向目标系统发送您的监听端口。
当您启动 Web 浏览器并访问 www.google.com:80 时,浏览器会从系统中获取/搜索可用的非系统共轭端口以进行监听。假设这个共轭端口是10000。监听端口则用于接收来自 Google 的 http 流返回。
然后,坐在你旁边的孩子无意中也浏览了 www.google.com:80 ,他/她的游戏站或 Xbox 等谷歌会话也被分配了共轭端口10000。
你们俩都坐在一个电缆调制解调器后面,此电缆调制解调器位于你们的无线路由器后面。而且,两个系统都在无线路由器后面 - 按照网络拓扑的顺序。
为了防止路由器/调制解调器上的端口地址冲突,
假设你的电缆公司 DHCP 分配给你的 modem ip4 地址为 72.72.72.72。但你的无线路由器 DHCP 分配给你的系统的地址是 192.168.0.10 ,分配给孩子的系统的地址是 192.168.0.11。
当带有监听端口信息的帧经过 NAT 路由器传输时,它将转换一个或两个监听端口。假设你的页面使用端口 15000,孩子的页面使用端口 16000。
然后,你的无线路由器将你的请求发送到 Google 服务器,以 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 服务器或 FTP 服务器怎么办?如果您有两个系统,这两个系统都有 Web 服务器且这两个 Web 服务器都在侦听端口80上,该怎么办?
假设您第一个 Web 服务器系统注册/分配的本地 IP 地址为 192.168.0.30,而第二个 Web 服务器系统为 192.168.0.40。
无线路由器通常会有一个配置 Web 页面,默认情况下为 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连接到你的Web/Game服务器,你需要确保无线路由器不会使用它自己的动态NAT端口(8080和8088)。当然,这仅适用于在你的ISP DHCP决定更新你的调制解调器的IPv4地址之前。

IP地址72.72.72.72只有在ISP DHCP决定更新你的调制解调器的IPv4地址之前才有效。之后,你必须致电/发送电子邮件给你的朋友并告诉他们服务器地址已更改为72.72.90.200:8080和72.72.90.200:8088。或者,你可以订阅动态DNS(DDNS)服务,使用命名域,DDNS服务将需要你在系统上安装一个简单的心跳实用程序来帮助他们监视地址变化。DDNS翻译是一个单独的问题/策略。

NAT调制解调器

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


8
太棒了,你的解释太好了!我一直很困惑NAT的解释中大多数都没有清楚地解释出对源地址进行修改后如何将响应发送回发送者。 - AaronLS
这是否意味着每个目标IP的连接数都限制在可用端口号的数量上?即,如果一个组织有超过65k名员工同时尝试访问google.com(假设IP相同),如果他们全部在同一个IP后面,则无法正常工作?在这种情况下会发生什么?这种情况有术语吗? - balki
请查看:https://www.freeccnastudyguide.com/study-guides/ccna/ch10/10-4-nat-overloading-aka-port-address-translation-pat/ - Blessed Geek

4
路由器管理每台计算机的“源”端口。当您连接到“目标”的80端口时,路由器可能会将源端口分配给一些高端口号。 Wikipedia总结为:
网络地址转换涉及重写IP数据包的源和/或目标IP地址以及通常也是TCP / UDP端口号。必须重写校验和(IP和TCP / UDP)以考虑更改。

请纠正我如果我错了:两台计算机最初都请求连接到1.1.1.1的1000端口。路由器制造新的端口,40000和40001。路由器沿着连接的1000端口发送数据包。当服务器将其发送回时,它将返回到40000或40001端口。这是有道理的,除了我认为在打开连接时,发送和接收发生在同一端口上。 - user241146
3
“套接字”包含四个数据部分:源IP地址、源端口、目标IP地址和目标端口。在您的例子中,40000和40001是源端口,1000是目标端口。 - kdgregory

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表中每个端口号都是唯一的。当然,路由器会在透明地修改源地址和目标地址时完成所有“肮脏”的工作。


所以如果两台计算机使用相同的源端口,则路由器会自动为任何主机重新分配新的源端口?然后,主机A和主机B连接到的服务器看到一个不同的源端口?如果主机A和主机B的端口没有冲突,路由器将不会更改源端口?只是想确认我是否正确理解了。谢谢。 - kuchi
1
@kuchi,是的,服务器对于每个主机看到的端口都不同。路由器通常解决地址冲突,即如果两个主机连接到两个不同的服务器,则可以使用相同的端口。四元组(src_ip, src_port, dest_ip, dest_port)必须是不同的。 - Nick Dandoulakis

1

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


0

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


-1

RFC3022 提供了很多关于这个工作原理的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接