我想用不同的 VLAN 标签标记来自启用双栈的连接的传入 IPv4 和 IPv6 数据包,例如 IPv4 数据包应该转到 VLAN4,而 IPv6 数据包应该转到 VLAN6。更一般地说,我想将混合 IPv4 和 IPv6 数据包的双栈 ip 流拆分为两个干净的单栈网络,这样您就不会在 IPv6 网络上找到任何 IPv4 数据包,反之亦然。我需要它来测试和支持仅 IPv6 的网络。当然,我仍然需要 IPv4 数据。它不能简单地被丢弃。
Linux Box
Debian Bullseye
untagged ┏━━━━━━━━━━━┓ tagged (trunk)
════════════════════════┫eth0 vlan4┣═╦══════════════════════
IPv4 and IPv6 ┃ vlan6┣═╝eth1 IPv4 with VLAN4 tag
dual stack ┗━━━━━━━━━━━┛ IPv6 with VLAN6 tag
我查看了 Linux 网桥,nftables
但无法找到解决方案。我怎样才能实现这种选择性标记?
虽然您的答案显然对您有用,但它似乎过于复杂。我怀疑它是否可以满足您的要求,因为它在给定的输出中缺少任何 IPv4 地址(除了 lo)。
创建 2 个标记接口(例如命名为 vlan4 和 vlan6),为它们分配 IPv4 和 IPv6 地址 + 网关,并使用 sysctl 为 IPv4 禁用 SLAAC 就足够了。
除了启用 eth0 和 eth1 之间的流动所需的东西之外,不需要桥接或弄乱 nftables。
我找到了解决方案。因为我想操作 VLAN,所以我必须使用网桥。VLAN 在 OSI 第 2 层上工作,网桥是可以处理第 2 层协议的设备。所以首先我将两个 VLAN 接口添加到物理接口eth1。然后将所有接口eth0、vlan4和vlan6 添加到网桥。其余的由nftables完成。
IPv4 和 IPv6 在 layer3 上定义,在 layer 2 上没有不同的含义。因此nftables可以将它们作为具有不同“标记”的数据包处理,这是 IP 标头中的协议类型。幸运的是, nftables可以使用
meta protocol {}
. 它将传入的未标记 IPv4 和 IPv6 数据包定向到相应的 VLAN 接口。像往常一样由界面自动完成标记。我使用systemd-networkd,这里是详细配置。首先创建网络设备vlan4、vlan6和网桥br0:
然后将接口连接到 eth1 和网桥:
现在只需打开桥:
重新启动后,这将为您提供:
也值得检查
resolvectl
。现在我们必须做最后一步,并使用以下规则使用nftables重定向数据包:在转发链上,这将丢弃所有 IPv6 到/从接口vlan4并且只允许它在接口vlan6上。所有其他的东西都被丢弃在接口vlan6上,但是通过接口vlan4上接受的链默认策略。这确保了所有旧的东西,如 ARP 和其他广播也进入接口vlan4。
输出链只是为了避免网桥本身将数据包发送到错误的 VLAN。在我的配置中,它仅使用 IPv6(单堆栈),因此链默认策略将删除所有内容,除了 IPv6 到vlan6。