我有一台可以访问互联网的路由器,后面还有两台计算机 C1 和 C2。C1 运行一项(重要性较高)服务,需要几个固定的入站端口,因此有 NAT 规则将这些端口转发给它。C2 运行另一项(不太重要)服务,需要打开一系列入站端口,因此路由器这些端口上的入站流量会转发给它。例如 40000:50000
现在,C1 不知道将转发到 C2 的入站端口。它可以向某个远程服务发出请求,并说“在端口 45000 上响应我”。
路由器之后会发生什么?响应端口是否保留?在这种情况下,C1 无法再接收所有这些答案,因为它们将被发送到 C2?或者路由器是否会调整其要求的入站端口以接收响应,因此永远不会与任何端口转发规则发生冲突,然后将其转发到 C1 要求的响应端口?
或者我应该以某种方式告诉 C1 的 Linux 系统配置,它不应该在动态选择的响应端口中使用 C2 的入站范围?
答案1
不同路由器之间有所不同,但从根本上讲,端口能在大多数情况下不会发生冲突。但是,如果需要,路由器会选择不同的端口,但在您的示例中,这不是必需的。
路由器中的 NAT 是有状态的;它会保存一个“活动连接”(又称状态或流)表及其 NAT 配置。对于每个传入数据包,它会检查状态表以确定与该特定流关联的内部 IP 地址前它检查一般的 NAT 规则;因此,仅当数据包与任何已知流都不匹配(即是“新”数据包)时,UDP 端口 40000 上的入站“端口转发”规则才会生效。
(大多数家用路由器实际上在底层使用 Linux iptables 和 conntrack,并且 NAT 使用同一张表和用于状态防火墙。
因此,只要其他参数不同,就不会发生冲突;尽管不能保证所有路由器的行为都相同 - 特别是“锥形 NAT”与“对称 NAT”(不要与 1:1 NAT 混淆......)的行为会有所不同,我相信。
但是,举一个不同的例子,如果两个内部主机都使用相同的参数(相同的源端口、相同的目标端口、相同的目标地址)建立出站连接,并且路由器将它们通过 SNAT 转换为相同的源地址),那么路由器也会将其中一个通过 SNAT 转换为不同的源端口以保持唯一性。
我有一个较旧的答案,其中包含示例:https://superuser.com/a/1253026/1686
答案2
这取决于一些因素。
如果程序使用 uPNP,路由器将自动创建内部规则并标记流量,以便流量流动时到达正确的服务器。
另一种情况是,程序建立入站连接,但服务器端则以另一种方式创建新连接。出站流量不需要您这边的 NATrules,但需要另一端的 uPNP 处于活动状态。这种情况几乎总是如此。
也可能某个程序指定您必须打开某个端口范围,并且它使用该端口范围。如果是这种情况,您早就知道了。
还有可能的是,程序期望 uPNP 处于活动状态,如果 uPNP 不活动,程序就会失败。