【问题标题】:How to insert VLAN tag on outgoing packet如何在传出数据包上插入 VLAN 标记
【发布时间】:2018-05-13 23:27:12
【问题描述】:

我正在通过本地 vlan 在传出数据包上为某些客户端 mac 插入 vlan 标签。我尝试了 nh_hooks IN、OUT 和 Forward,但没有成功。

我想要的是我可以将标签添加到从客户端到本地 vlan 的数据包,然后通过同一个 vlan 发送,或者我可以将本地 vlan 数据包从基于 MAC 的某些客户端转发到标记的 vlan 接口?

netlink 代码或内核级代码有什么建议吗?还是可以通过基于 MAC 的 ebtables 来做到这一点?

【问题讨论】:

标签: linux ethernet netlink vlan


【解决方案1】:

Linux 中的 VLAN 标记是通过使用子接口完成的,例如ip link add link eth0 name eth0.8 type vlan id 8 将标记的 VID 8 添加到 eth0,创建 eth0.8 子接口。

本机 VLAN 是未在中继/端口上标记的 VLAN,因此其在其他地方的 VLAN ID 取决于中继端点(交换机)在转发时是否以及如何标记帧。

在 VLAN 中继上,标签中的 VID 帧正在运行的 VLAN。

【讨论】:

  • 实际上我想要做的是客户端数据包之一来自与 eth0 的网桥接口,我们称之为 br-wan,我想要的是将该客户端的数据包从 br-wan 转发到br-vlan_8 是 eth0.8 的桥接接口。有可能这样做吗?因为我希望标记该特定客户端,但它的数据包来自 eth0 的桥接接口。我的 VLAN 接口已经创建。
  • 当然这是可能的,但很可能您需要创建/使用适当的子接口。根据您的具体需要,仅使用两个交换机端口进行标记可能更容易(端口 1 使用未标记的 VLAN 8,端口 2 已标记)。
【解决方案2】:

PC1 ---[SW1] ----[SW2] -----[SW3] ----PC3

[sw2] ---> PC2。 [sw2 也连接到 PC2。

假设 SW2 是不支持 VLAN 的非 IEEE 802.1q 交换机。 SW1、SW3 做支持。所有 PC 都在 VLAN 10 中。

trunk 端口上的 SW1/SW3 会将 VLAN 10 的数据包作为 untagged 数据包发送,以便 PC2 可以理解。当 SW1/SW3 收到任何帧时,将其分类为 VLAN 10。 默认本地 VLAN 为 VLAN 1。

有问题的第一个错误:本机 VLAN 帧/数据包在未标记的情况下发送和接收。 (无 4 字节 VLAN 标头)。

如果我理解正确,将未标记的本机 VLAN 转发到已标记的 VLAN 将配置 SW1 本机 VLAN 为 VLAN 10,将 SW3 本机 VLAN 配置为 Vlan 30。PC3 在 VLAN 30 中。vlan 10 将被转换到 VLAN 30。

所以PC1中的vlan 10与PC2中的未标记帧和PC3中的vlan 30相同。

【讨论】: