将 FW 上的端口转发(NAT)到设备上,而无需设置 GW?

将 FW 上的端口转发(NAT)到设备上,而无需设置 GW?

简而言之: 是否可以从设备 LAN 外部访问设备/服务器(无需在该设备的网络配置中设置 GW 地址)?

当前设置:

  1. 我租用了一台 ESXi 服务器,其 ESXi 端口暴露在互联网上 - 主机有其公共 IP(xxxx)。ESXi 上的默认网关设置为服务提供商网关的公共 IP(即 xxx1)。
  2. 我还另外设置了 ESXi 的管理网络,以便从 ESXi LAN 交换机访问 - 可以从任何 LAN VM(LAN - 192.168.0.0/24,ESXi LAN-IP 192.168.0.2)访问 ESXi。
  3. 我已将 pfSense FW 安装为 VM(其公共 IP 位于 WAN(yyyy)上,LAN-IP 为 192.168.0.1),因此其他 VM 可以访问互联网。

问题: 无法通过 pfSense 访问 LAN IP 上的 ESXi(无论是使用 NAT 端口转发还是从 pfSense 上设置的 OpenVPN 网络)。我了解 ESXi 没有办法添加其他路由以使用 pfSense FW 作为网关来访问指定的 LAN 子网,并且 ESXi 不知道如何回复 ESXi LAN 之外的地址。

问题: 有没有办法从 ESXi-LAN 外部和 ESXi-LAN 内部的主机通过 pfSense FW(或任何其他 FW/GW 作为示例)设置连接,而无需在 ESXi 主机的网络设置上设置网关?

答案1

(我实际上多次提到过双 NAT,但没有详细解释。以下内容适用于 Linux,在 Mikrotik RouterOS 上将以相同的方式工作;我不确定如何在其他系统上实现这个概念,甚至不确定是否有可能。)

NAT 通常分为 SNAT 或 DNAT。

它被称为 SNAT,“源 NAT”是指将流的第一个数据包的源地址转换(更改)为其他地址。(通常源端口也会更改。)通常,这用于允许 LAN 中使用私有(RFC1918)地址的所有计算机访问公共 Internet;为此,当 NAT 盒将它们路由出去时,它们的地址将更改为 NAT 盒的公共地址。此外,它会记住所做的更改,从而可以区分回复数据包并为其应用反向地址(和端口)替换。但是对于那些要通过我们的 NAT 盒发送数据包的内部系统,它们首先需要通过它的路由。(它们甚至可能不知道它执行 NAT。)

例如,在Linux中:

iptables -t nat -A POSTROUTING -o wan_iface -j MASQUERADE

MASQUERADE是一种 SNAT 类型规则,只是拼写方式不同,并且具有特殊逻辑“转换为传出接口所具有的任何地址”。)

DNAT,“目标 NAT”是指系统接收数据包并更改其目标地址。通常这样做是为了将数据包“转发”到 NAT 盒后面的某个“内部”系统;例如,可以设置路由器来转发到达端口 80 和 443 的任何内容,这些内容最初是发往路由器的 IP,以更改目标 IP 并将其进一步转发到某个 Web 服务器。NAT 盒将检测回复并替换其中的地址和端口。但是,该系统将看到原始源 IP 地址,因此它需要通过 NAT 盒路由到数据包的源地址才能正确回复。

例如,

iptables -t nat -A PREROUTING -i wan_iface -p tcp --dport 443 -j DNAT --to-destination internal_ip

在这两种情况下,通常将 NAT 盒设置为“默认网关”,因此当远程地址不在 LAN 中时,所有系统都会通过它路由数据包。

但实际上这并不是一个或另一个,你可以申请两个都同时考虑这两个概念。为此,您需要添加两个规则并精心设计它们,以便它们都匹配同一个数据包。由于 DNAT 规则首先被处理,因此 SNAT 规则将看到数据包被半翻译(目标地址和端口已更改);在构建第二个规则匹配时需要考虑这一点。例如:

iptables -t nat -A PREROUTING -i wan_iface -p tcp --dport 443 -j DNAT --to-destination internal_ip
iptables -t nat -A POSTROUTING -o lan_iface -p tcp --dport 443 -d internal_ip -j MASQUERADE

请注意,第二个匹配检查第一个规则设置的目标地址。还值得一提的是,DNAT 规则通常与入口接口和“原始”目标 IP 地址过滤器一起使用,而 SNAT 规则通常与出口接口和“原始”源 IP 地址过滤器一起使用(但在本例中不是;您可能应该添加一个,请阅读最后的警告)。

实际情况是,数据包将首先根据第一条规则进行转换,并将其目标地址更改为某个内部 IP。然后,数据包被路由(决定转发),现在再次路由,出口接口被选中,第二条规则触发,将 IP 的源更改为路由器的 LAN 端地址。所以现在,具有内部 IP 的系统将“从路由器”接收数据包并“发往自身”。因此,由于源地址现在“在 LAN 中”,它不需要网关来发送回复。当然,任何回复都将被正确转换并转发回来。

这样做的一大缺点是内部系统无法知道谁真正发起了连接;该信息被网关隐藏。因此,网关必须严格过滤将破坏并通过此方式传递的数据包,以阻止任何恶意行为。如果目标系统没有设置网关,则无法解决这个问题。

另一个增强功能是为网关的 LAN 接口分配额外的地址,以便在 SNAT 规则中使用它(-j SNAT --to-source additional_LAN_address而不是-j MASQUERADE)。这样,如果只有少数外部系统需要以这种方式进行通信,您可以为每个系统分配一个“内部”地址,并将每个系统转换为“其”内部地址。目标无网关系统将看到这些地址,因此它将能够分辨出这个数据包是谁的。

相关内容