我在 Azure VNet 中有一个 VM,需要知道由防火墙设备端口转发的传入连接的原始公共 IP 地址。到目前为止,如果我对传入连接进行“SNAT”,我只能成功地从防火墙端口转发到服务器。但这会隐藏原始源 IP。
以下是 当前设计
防火墙具有单个接口 10.0.0.1,该接口与 Azure 中的公共 IP 相关联。防火墙上配置了端口转发,以按照本文概述的逻辑将任何 TCP 80 发送到服务器 10.0.1.1博客 客户端连接到公共 IP 地址。防火墙上的日志显示 IP 1.2.3.4 -> 10.0.0.1 的批准数据。如果在防火墙上配置了出站 NAT 以在端口转发后转换连接,则服务器 (10.0.1.1) 显示连接,但源 IP = 10.0.0.1(即 FW 的私有接口)
如果在 FW 设备上禁用出站 NAT 转换,则日志会在 FW 上显示相同的传入连接批准信息,但数据包永远不会到达 10.0.1.1 服务器。
如果我建立第二个服务器 10.0.1.2 或 10.0.0.2,然后连接到 10.0.0.1:80(在 FW 设备上禁用出站 NAT 转换),则连接将成功到达服务器 10.0.1.1,并且源 IP 正确等于 10.0.1.2 或 10.0.0.2
我怀疑 Azure 结构路由会丢弃任何源 IP 不在 VNet 地址空间范围内的数据包。网上有很多文章展示了 Azure 中类似的“DMZ”风格方法,但没有一篇文章提到请求处理服务器需要知道原始公共源 IP 地址。
可以做到吗?
编辑:
经过一整天的努力,我还是无法让它工作。所以我放弃了 FW,重新创建了另一个具有 2 个 NIC 的应用程序。原始 NIC(WAN)与之前一样,另一个位于 10.0.1.1 子网(LAN)中。但它仍然无法工作!我甚至无法连接......
我在办公室的裸机上复制了相同的设置,它运行完美。我检查了裸机实例和 Azure 实例之间的所有 FW 设置(包括路由)。我在 Azure 实例的 LAN 接口上运行了数据包捕获,可以看到“端口转发”数据包离开接口。我在 10.0.1.1 上运行了 Wireshark,但没有任何数据包到达!我认为这可能是默认网关问题,因此我为网络 1.2.3.4/32 添加了一条指向 10.0.1.0 子网的用户定义路由,以确保 ACK 会通过 FW 设备返回到客户端。但这也不起作用。
任何其他帮助都将非常感激,这个已经被破解了。
成功
经过几个小时和虚拟机后,我终于让它工作了。问题出在 10.0.1.x 网络上的用户定义路由。我只启用了一条路由来覆盖连接的客户端范围,但那没有用。如果我将 UDR = 0.0.0.0/0 并将下一跳设置为 FW 设备,那么就成功了。
总结一下我的工作配置。
- 带有一个 NIC 的 pfSense 防火墙
- 10.0.0.x 网络中的 NIC 也与公共 IP 相关联
- 未定义出站 NAT 映射
- 从客户端 IP:端口到 10.0.1.x 网络中的服务器的端口转发规则
- 在 10.0.1.x 网络上设置用户定义规则 0.0.0.0/0,下一跳 = FW 上 NIC 的私有 IP
- FW NIC 上启用了 IP 转发
虽然上述操作现在将客户端 IP 一直传递到 10.0.1.x 网络中的 VM 并允许成功连接,但我确实添加了 10.0.1.x/24 的出站 NAT 映射,以便 VM 可以访问互联网。没有它,它就无法访问。UDR 还会终止通过连接到 10.0.1.x 网络中 VM 的公共 IP 进行的任何访问,并且现在需要在 FW 上设置其他规则以允许通过 FW 向 VM 进行 RDP 等。
为了大家的利益,我也让两个 NIC FW 工作起来。这里 UDR 只需要指向“LAN”NIC 的 IP。
答案1
如果防火墙上配置了出站 NAT 以在端口转发后转换连接,则服务器(10.0.1.1)显示连接,但源 IP = 10.0.0.1(即 FW 的私有接口)
如果在 FW 设备上禁用出站 NAT 转换,则日志会在 FW 上显示相同的传入连接批准信息,但数据包永远不会到达 10.0.1.1 服务器。
所有这些都是设计行为。并且它应该以这种方式工作。
如果源IP地址不是防火墙的私网地址,则直接将响应发送到1.2.3.4。(源IP是公网IP地址,则使用分配给服务器的公网地址发送响应)
发送数据包的客户端将会收到来自完全不同的公网IP地址的响应,从而导致连接失败。
为了使响应数据包穿过防火墙,应该启用出站 NAT。
=========================================================================
更新:
如果涉及用户定义路由 (UDR),则它可以工作。我使用 2 个 Linux VM 对其进行了测试。
需要注意几点:
执行端口转发的虚拟机上应启用 IP 转发。(Azure 门户和操作系统上的设置均应如此。)
执行端口转发的 VM 的 NSG 需要重新配置以允许转发的流量和来自客户端 VM 的响应。
客户端虚拟机的 NSG 需要重新配置以允许端口转发虚拟机转发的流量。