使用 ebtables 进行 IPv4 和 IPv6 的 MAC 地址 NAT?

使用 ebtables 进行 IPv4 和 IPv6 的 MAC 地址 NAT?

我在 VMware 中运行一个虚拟机。它上面有 Ubuntu 14.04。我想在其上安装 LXC 容器,并让它们使用与虚拟机相同的地址空间。

因此,我创建了一个桥接接口并将以太网端口放入其中。然后我让我的 LXC 容器将其接口添加到桥接器中。

理论上,这应该可以工作。而且在物理机上确实如此。我可以从 LXC 主机(虚拟)机 ping LXC 容器。但我无法从其他任何地方 ping 它们,包括其他 VMware 虚拟机。

我做了一些研究,似乎 VMware 为进入 VMware 主机的 VLAN 提供的虚拟化“交换机”不像普通交换机那样工作。它已经知道连接到它的机器的 MAC 地址,并丢弃来自任何其他 MAC 地址的流量。本质上,它不会学习 MAC 地址,因为它已经知道了。有一个 VMware 选项可以关闭此功能,但它不会让虚拟交换机学习 MAC 地址,而是将其变成集线器,虚拟交换机上的每台机器都会获得通过交换机的所有流量。(我不想这样做——出于性能和安全方面的考虑)。

因此,我认为我需要对桥接上的传出数据包执行与 NAT 相同的操作,但以太网级别除外,以使它们符合 VMware 的预期。然后将实际用于容器的传入数据包重写回正确的 mac 地址。为此,我发现https://wiki.debian.org/BridgeNetworkConnections#Setting_up_the_rules这似乎应该可行。但我有一个问题:我还需要做 IPv6。虽然我想我可能可以弄清楚如何将内容重写为 IPv6 地址,但我还需要重写 IPv6 等效的 ARP,以便主机也知道在哪里找到它。

那么,我需要在 ebtables 中制定哪些规则来为 IPv6 执行以太网级别的 MAC 地址“NAT”(重写传出的 MAC 地址)?

答案1

没有这种方法可以进行 mac-NAT。

事实上,传出的 MAC 总是被重写,因为 MAC 是在直接链接的机器之间使用的。源 MAC 必须是直接发送者的 MAC,而目标 MAC 必须是下一跳的 MAC。相反,IP 在直接链接的机器和间接链接的机器之间用于路由。源 IP 是原始发送者的 IP,而目标 IP 是最终的。

但幸运的是,只需通过对 NAT 表进行一些更改,就可以实现 IPv6 的 NAT。

相关内容