需要根据 vlan 和目标 IP 匹配进行 DNAT mac。

需要根据 vlan 和目标 IP 匹配进行 DNAT mac。

ebtable 规则不允许我在一条规则中指定 vlanid 和 ipv4 协议。我也尝试了这个,但第二条规则没有与 VLAN 数据包匹配。

ebtables -t nat -A PREROUTING --vlan-id 100 -j mark --set-mark 100 --mark-target CONTINUE
ebtables -t nat -A PREROUTING -i <iface> --mark 100 --ip-dst <ip> -j dnat --to-dst <mac> --dnat-target ACCEPT

第二条规则是如果数据包带有 VLAN 标头,则不会匹配。有什么方法可以根据匹配的目标 ip 地址和 vlan id 进行 DNAT mac 吗?

答案1

这是当前使用 ebtables 进行网桥过滤的限制:ebtables 匹配是特定的而不是通用的,除非添加 vlan-plus-ip 匹配,否则不可能将 VLAN 标记的 IP 与ebtables

这里有两种方法可以解决这个限制,而第一种方法可以在其他情况下实现很多功能,但无法处理特定OP的问题。

桥接网络过滤器(不适用于这种情况)

对于许多情况(但实际上不是这种情况,见下文)相关的可能是什么ebtables'对堆叠协议的糟糕处理,是告诉桥接代码做一个上行呼叫iptables经过使用 br_netfilter 模块。恩,那就对了,iptables将在网桥级别而不是路由/IP 级别运行。请注意,目前这是一个系统范围的更改,可能会产生系统范围的影响,包括其他桥和其他命名空间(这应该成为每个命名空间“很快”,可能在内核 5.3 之后)。一些意想不到的影响以及如何预防它们的描述见7. 帧/数据包通过 iptables PREROUTING、FORWARD 和 POSTROUTING 链的两种可能方式

modprobe br_netfilter
sysctl -w net.bridge.bridge-nf-call-iptables=1 #actually default

请注意,有VLAN 部分无需采取任何行动:

{ip,ip6,arp}表是否可以看到未标记网桥上带有 VLAN 标记的 IPv4/IPv6/ARP 流量?
是的。内核版本 2.6.0-test7 及以上版本具有此功能。要禁用此功能,请参阅上面的问题。

现在ebtables/iptables 交互都有可能,我们来看看5.桥接IP数据包的链遍历。它告诉帧/数据包至少会做:

-> ebtables nat/PREROUTING -> iptables nat/PREROUTING, then
-> ebtables filter/FORWARD -> iptables filter/FORWARD ....

还有其他情况,但需要的一种情况不存在:返回到相同的调用部分,例如:

-> ebtables nat/PREROUTING -> iptables some/THING -> ebtables nat/PREROUTING

因此,虽然取决于OP的具体布局(包括第二条规则中接口的角色以及MAC地址的含义,是本地的吗?不是本地的?等),可能还剩下一些选项(确实需要标记要发送的数据包)来自的消息ebtablesiptables),我没有看到办法。

这就是为什么设计了 ebtables/iptables 替代品来首先避免所有这些混乱:nftables

nftables

替代品nftables设计时考虑了通用用法,因此在处理桥接路径或路由路径中的 IP 时,不必依赖略有不同的内核模块来执行相同的操作。

nftables 是一个不断变化的目标,最好使用 nftables >= 0.8.3 和 kernel >= 4.10 来获得大多数功能。这是使用 nftables 0.9.0 和内核 5.1.x 进行测试的。旧的 nftables/内核(例如 RHEL7/CentOS7)可能不具备所有必需的功能,因此必须再次进行测试。

对于这个特定情况仍然存在一些限制,但它们似乎是在用户空间上nftables侧而不是内核侧,因此我提供了两种方法来克服它。

让我们添加管道(例如在 a 之后nft flush ruleset):

nft add table bridge nat
nft add chain bridge nat prerouting '{ type filter hook prerouting priority -300; policy accept; }'

如果匹配的 IP 是 192.0.2.1 并且目标 MAC 是02:00:00:00:00:01,通常这一行足以完成工作(取决于 nftables 的版本,它必须或多或少地详细描述,我选择详细,无论如何它正在创建完全相同的字节码并以简化版本显示),但失败了:

# nft add rule bridge nat prerouting ether type vlan vlan id 100 vlan type ip ip daddr 192.0.2.1 ether daddr set 02:00:00:00:00:01
Error: conflicting protocols specified: vlan vs. ether
add rule bridge nat prerouting ether type vlan vlan id 100 vlan type ip ip daddr 192.0.2.1 ether daddr set 02:00:00:00:00:01
                                                                                           ^^^^^^^^^^^

nftables用户层工具在遵循之后不想返回到较低级别的协议的解析以太网 -> VLAN -> IP

这可以通过将规则与用户链分开并将更改放在那里来解决:

nft add chain bridge nat mydnat
nft add rule bridge nat prerouting ether type vlan vlan id 100 vlan type ip ip daddr 192.0.2.1 jump mydnat
nft add rule bridge nat mydnat ether daddr set 02:00:00:00:00:01

或者通过告诉nftables“这样做,不要试图理解”,使用原始有效负载告诉更改链路层的前 48 位(即以太网目标MAC)。因此,这一行将执行相同的操作,而不是上面的 3 行:

nft add rule bridge nat prerouting ether type vlan vlan id 100 vlan type ip ip daddr 192.0.2.1 @ll,0,48 set 0x020000000001

请注意,后一种方法实际上使用相同的字节码,而不是后一种方法的第三行:

nft add rule bridge nat mydnat @ll,0,48 set 0x020000000001

ether daddr set 02:00:00:00:00:01在链中显示规则时将被解码回完全相同米德纳特。人们可以想象未来的版本nftables将在单衬箱中接受它。

只是为了告诉它按书面方式工作(即:如果没有来自 OP 等的 ARP 或上下文的附加规则,可能无法按预期工作),这是在 192.0.2.1 上接收 ping 时接收端的 tcpdump:

14:03:06.542085 9e:72:8c:20:15:2a > ff:ff:ff:ff:ff:ff, ethertype 802.1Q (0x8100), length 46: vlan 100, p 0, ethertype ARP, Request who-has 192.0.2.1 tell 192.0.2.2, length 28
14:03:06.542135 ae:3a:24:06:a7:da > 9e:72:8c:20:15:2a, ethertype 802.1Q (0x8100), length 46: vlan 100, p 0, ethertype ARP, Reply 192.0.2.1 is-at ae:3a:24:06:a7:da, length 28
14:03:06.542184 9e:72:8c:20:15:2a > 02:00:00:00:00:01, ethertype 802.1Q (0x8100), length 102: vlan 100, p 0, ethertype IPv4, 192.0.2.2 > 192.0.2.1: ICMP echo request, id 21702, seq 1, length 64

其他 IP 192.0.2.11 不受影响:

14:11:04.026480 9e:72:8c:20:15:2a > ff:ff:ff:ff:ff:ff, ethertype 802.1Q (0x8100), length 46: vlan 100, p 0, ethertype ARP, Request who-has 192.0.2.11 tell 192.0.2.2, length 28
14:11:04.026491 ae:3a:24:06:a7:da > 9e:72:8c:20:15:2a, ethertype 802.1Q (0x8100), length 46: vlan 100, p 0, ethertype ARP, Reply 192.0.2.11 is-at ae:3a:24:06:a7:da, length 28
14:11:04.026505 9e:72:8c:20:15:2a > ae:3a:24:06:a7:da, ethertype 802.1Q (0x8100), length 102: vlan 100, p 0, ethertype IPv4, 192.0.2.2 > 192.0.2.11: ICMP echo request, id 21895, seq 1, length 64
14:11:04.026515 ae:3a:24:06:a7:da > 9e:72:8c:20:15:2a, ethertype 802.1Q (0x8100), length 102: vlan 100, p 0, ethertype IPv4, 192.0.2.11 > 192.0.2.2: ICMP echo reply, id 21895, seq 1, length 64

相关内容