基于VLAN与目的IP匹配实现MAC DNAT的ebtables配置问题
这个问题我之前也碰到过,核心原因是带VLAN头的数据包在ebtables里的外层协议是802_1Q(0x8100),而非IPv4,所以你直接用-p IPv4的规则根本匹配不上这类包,这就是第二条规则失效的关键。
给你两个可行的解决方案,优先推荐第一种:
方案一:单条规则实现(推荐)
ebtables其实支持针对VLAN封装的内层协议做匹配,你可以用--inner-protocol参数来指定VLAN标签之后的上层协议,这样就能在同一条规则里同时匹配VLAN ID、IPv4目的IP,然后执行MAC DNAT:
# 替换成你的实际VLAN ID、目的IP和目标MAC ebtables -t nat -A PREROUTING \ -p 802_1Q --vlan-id 100 \ --inner-protocol IPv4 \ --ip-dst 192.168.1.10 \ --to-destination aa:bb:cc:dd:ee:ff
这条规则的逻辑是:匹配所有外层协议为802_1Q、VLAN ID是100,且内层协议是IPv4、目的IP为192.168.1.10的数据包,然后把它们的目的MAC地址修改为aa:bb:cc:dd:ee:ff。
方案二:内核标记分两步处理(兼容旧版ebtables)
如果你的ebtables版本比较老,不支持--inner-protocol,可以通过给数据包打内核标记的方式分两步处理:
- 先给指定VLAN的数据包打上唯一标记:
ebtables -t nat -A PREROUTING -p 802_1Q --vlan-id 100 --set-mark 0x100
- 再匹配带有这个标记的数据包,结合IP条件执行MAC DNAT:
ebtables -t nat -A PREROUTING \ -m mark --mark 0x100 \ -p IPv4 --ip-dst 192.168.1.10 \ --to-destination aa:bb:cc:dd:ee:ff
验证方法
配置完规则后,可以用tcpdump抓包验证效果:
tcpdump -i 你的网卡名 vlan 100 and dst host 192.168.1.10
观察输出里的目的MAC是否已经被修改为你指定的地址。
内容的提问来源于stack exchange,提问作者user3550166
相关产品推荐
相关产品推荐

