在 Linux 虚拟接口上使用 VLAN

在 Linux 虚拟接口上使用 VLAN

我有一个应用程序,它使用原始套接字来消耗来自多个 Linux(内核 4.14)接口(包括无线接口)的所有数据包。为了将无关的脚本保持在最低限度,我尝试使用 hostapd 将无线和 bss 接口绑定到具有我的应用程序侦听的接口的网桥。我还有一个用例,我需要我的应用程序从特定 VLAN 上的无线接收流量(有点像本机 VLAN 重新映射)。目前,我的设置如下所示:

  • 创建虚拟接口供我的应用程序绑定
ip link add dummy0 type dummy
ip link set dummy0 up 
  • 根据需要,在dummy接口上创建vlan接口
ip link add link dummy0 name dummy0.100 type vlan id 100
ip link set dummy0.100 up
  • 创建一个桥将虚拟设备连接到 wlan,根据需要连接虚拟设备 0 或 VLAN。应用程序仍然只监听 dummy0
brctl addbr br0
brctl addif br0 dummy0.100
ip link set br0 up
  • hostapd 将 wlan 或 bss 接口附加到 hostapd.conf 中定义的网桥

当不涉及 VLAN 时,此方法效果很好。对于 vlan 接口,我只能使流量流向一个方向。 dummy0 上的 tcpdump 显示了我所期望的所有流量。 dummy0.100 和 br0 上的 tcpdump 仅显示来自无线接口的流量,但不显示返回流量。

我假设问题是我的应用程序正在将带有 vlan 标记的原始帧写入 dummy0 而不是 dummy0.100,但我认为问题也可能在于使用虚拟接口本身。有什么方法可以让我在 dummy0 上使用原始套接字,用 vlan 标记写入帧,并让它们正确显示在 dummy0.100 上?我也愿意接受更好的解决方案,但这需要最少的设置和监控基础设施。

答案1

正如 @dirkt 所指出的,RAW 套接字在绑定到根设备时可能无法将数据包定向到 VLAN 子接口。 @dirkt 建议的一个合理的解决方案是使用 veth 对。

ip link add veth0-wifi type veth peer name veth0-app
ip link set veth0-wifi up
ip link set veth0-app up
ip link add link veth0-wifi name veth0-wifi.100 type vlan id 100
brctl addbr br0
brctl addif br0 veth0-wifi.100
ip link set br0 up

在hostapd.conf中设置bridge=br0并将应用程序绑定到veth0-app

@AB 建议的替代方案(由于技术原因尚未探索)是让应用程序发布一个 Tap 设备,该设备应允许大部分相同的组织。

相关内容