跟进我的另一个问题我想澄清以下几点:
要配置桥接口而不是其端口之一,需要附加关键字 self。路由堆栈(第 3 层)处理 IPv4 或 IPv6 数据包,因此期望接收此类类型的帧,而不是带标记的帧。因此,VLAN ID 10 在离开网桥时必须取消标记(以便路由堆栈接收流量),并且这必须是端口 VLAN ID,以便从路由堆栈到网桥的流量被标记回来。通过这种方式,只有一个 VLAN 可以链接到路由堆栈。
一个中继端口承载多个 VLAN,但是PVID
对于通过中继端口离开的帧bridge
(从路由堆栈进入网桥等)必须只有一个值,那么无法确保该帧标记有正确的 VLAN ID (已经到达桥上的那个)?
在图表上我试图解释我的问题:
+----+
| L3 |
+--+-+
|
|
|br0
+------+-------+
| Linux Bridge |
+------+-------+
|trunk (vid 2-4094)
|PVID (??)
|
+------+-------+
| L2 switch |
+-+----+-----+-+
| | |
| | |
10| 20| 30|
例如,带有 VID 10 标记的帧(前往br0
)到达 Linux 桥接trunk
端口,该标记将被剥离并移交给堆栈,进行处理(例如 ICMP),并生成一个响应数据包,该数据包进入桥接br0
将被标记为PVID,如果我设置PVID=20,那么这样的数据包将永远不会到达VLAN10上的主机?
我期望 Linux 网桥能够根据原始数据包的目标 MAC 和 VLAN ID 转发回复数据包。
更新经过一些实验,我发现以下设置有效。因此,创建 Vlan 子接口ethX.VID
并将它们添加到网桥中,然后对每个子接口进行标记/取消标记,br0
具有单个 IP 地址。
即标记的数据包(多个 VLAN)到达 br0,取消标记,推入堆栈,响应数据包通过 br0 一路返回到正确的 Vlan 子接口,在那里它被标记并流出。
+----+
| L3 |
+--+-+
|
|
|br0
+------+-------+
| Linux Bridge |
+------+-------+
| | |
| | |
|eth0.10|eth0.20|eth0.30|
+------+
| eth0 |
+--+---+
|trunk (vid 2-4094)
|PVID (??)
|
+------+-------+
| L2 switch |
+-+----+-----+-+
| | |
| | |
10| 20| 30|