消费者路由器中的 NAT 使路由器将来自私有 IP(例如 dev0)和特定源端口 X 上的内部设备的请求转换为来自其自己的公共 IP 在不同源端口 Y 上的请求。然后,它会保存一个列出转换的表,因此它知道到达端口 Y 上的公共接口的数据包必须发送到端口 X 上的 dev0。这也称为端口地址转换。
现在,据我所知,端口 Y 将是路由器上一个随机的、未使用的端口。假设您在消费者路由器上运行 DMZ,指向另一个设备 dev1。假设 dev1 在端口 Z 上运行一个应用程序。
当路由器中的 NAT 将来自 dev0 的请求转换为来自端口 Z 上的公共 IP 的请求时会发生什么?我假设来自端口 Z 上的公共网络的传入请求将被路由到 dev0,从而有效地禁用 DMZ 的影响?如何避免这种情况?
答案1
("1-NAT")
收到传入流量后,只有当传入流量来自 NAT 表提供的 IP 地址时,NAT 才会转发流量。因此,端口 Y 上的本地公共接口的 IP 地址 W 必须发送到端口 X 上的 dev0,但前提是流量来自远程公共接口 IP T 端口 U。在建立第一个传出 TCP 连接时,IP T 端口 U 被放置在 NAPT(网络地址端口转换,又称 PAT 或 NAT)表中。
我的回答的这一部分基本上只是劫持了 Daniel 在他的回答中所说的内容,为了清晰起见(我希望)稍微详细一些。但是,这种解释仍然留下了端口冲突的可能性,因为从 IP 地址 T 到公共接口 W 端口 Y 的流量似乎无法到达 DMZ。
好吧,除了这种方法之外("1-NAT")
,我在此添加另外两种方法("2-LSTN")
和("3-EPH")
,它们可以帮助防止您所说的这个问题。
我最后一段话简要总结了您会发现的情况,从统计上看,很少有人可能永远受此潜在问题的影响。(大多数出售给家庭的路由器都是卖给不运行自己服务器的人。)运行重要服务器的人通常不会转发所有 TCP 端口,因此他们也不会遇到问题。在少数可能受到影响的人中,对于那些真正关心并调整配置选项的人来说,从技术上讲,有一些选项是可行的。
("2-LSTN")
首先,如果路由器设置了公共 IP 地址 W 端口 Y 的端口转发规则,则该地址正在由 TCP 使用。可能没有“已建立”的连接,但它将在端口上“侦听”。为了进行比较,请尝试在 Unix 或 Microsoft Windows 上运行“netstat -na”,您可以看到流量正在“侦听” *.*.*.*:#
(例如,*.*.*.*:443
如果正在侦听 HTTPS 端口)。因此,如果路由器有针对 DMZ 的端口转发规则,它可能会避免将流量从端口 Y 发送出去。
这个答案有点假设您只将选定的端口发送到被视为 DMZ 的网络部分,并通过端口转发来执行此操作。如果您只是将所有 TCP 端口转发到 DMZ(这是某些路由器配置屏幕中的“DMZ”选项使用的技术),那么这显然不起作用,因为路由器不知道 DMZ 服务器可能提供的特定服务。幸运的是,我们还有一个潜在的窍门。
("3-EPH")
另一个有助于实现这一点的因素是,传出端口 Y 通常从可能的临时端口(可能也称为“动态端口”)列表中选择。传出流量通常使用临时端口号范围内的随机数。临时端口的范围可能有所不同:IANA 建议使用 TCP 端口 49152 或更高(最高可达 TCP 的最大端口号 65535),Microsoft Windows Vista 及更新版本和 FreeBSD 4.6 及更新版本使用此端口。根据维基百科关于临时端口的页面或 1024 至 4999 根据NcFTP 的临时端口页面(Microsoft Windows 部分)Linux 可能使用 32768 到 61000。这些值是可自定义的,如我超链接到的 NcFTP 页面上更详细地描述的。
只要设备选择的临时端口范围与 DMZ 提供的服务不冲突,那么就不会发生端口冲突。
现在,由于大多数人不会修改路由器的临时端口范围,那么什么可以绝对防止发生冲突的可能性呢?
在我看来,答案是“没有”。但是,从商业角度来看,这种风险似乎是可以接受的(比如制造路由器的企业)。让我们快速回顾一下。您最关键的服务(如 HTTP(S) 和 SSH)可能具有“众所周知”端口范围(0-1023)内的端口号,因此路由器的临时端口可能不会发生冲突("1-NAT")
。对于其他服务,是的,存在潜在的问题,即来自 DMZ 的传出流量可能会导致 NAT 使用您希望 DMZ 能够监听的端口。它只会影响传出流量连接到的系统(通过 NAT),如果路由器使用 IANA 推荐的临时端口范围,则您的几率约为 1/16,384 ("3-EPH")
。对于统计上少数使用 DMZ 端口(0-1023)范围之外的端口的人来说,这可能只是一种可以接受的赌博,其中许多人可能将其用于个人游戏会话(这可能不会产生值得起诉的重大财务后果)。如果游戏玩家受到影响,那么巫术(尝试随机的事情,例如重新启动设备)很可能会导致 1/16384 的机会不发生。对于这些事情很重要的专业连接,他们可以选择修改(即自定义)用于临时端口范围的值,或者更常见的是使用更严格的防火墙规则,仅转发所需的特定端口,这可能会导致路由器知道不要使用该端口号("2-LSTN")
。
答案2
您对场景的描述几乎无可挑剔。然而,您忽略了一个关键点。
当路由器通过面向公众的端口 (WAN) 接收数据包时,它不仅会根据源端口进行转换,还会根据源 IP/端口组合进行转换,这是一个插座。
公平地说,NAT有很多种,我建议仔细阅读NAT为你而来。