读取网桥从属接口上的数据包

读取网桥从属接口上的数据包

如果我有两个接口(eth0、eth1)连接到网桥(br0),那么我希望将套接字绑定到每个从属接口,这样我就可以接收通过特定接口接收的数据包,并且只能接收该接口。我可以按照所述绑定套接字(在将从属接口添加到网桥之前或之后),但一旦将数据包添加到网桥,就不会再收到数据包。

或者,我可以监听桥接接口,并使用一些方法来发现接收到的数据包来自哪个从属设备,例如使用,recvfrom()但这会失败,因为struct sockaddr_ll.sll_ifindex指示桥接接口。如果套接字未绑定或绑定在(任何接口)上,情况也是如此sll_ifindex=0

更新

我怀疑ebtablesBROUTING条目可能能够阻止转发到网桥的相关数据包,这反过来又可能使这些数据包通过绑定到从属接口的套接字可见。我还没有调查过这一点。

它可能不是那么有用,因为在桥接配置中,从属设备通常没有定义 IP 地址。接收 ARP 数据包不会有问题(它们可以通过套接字规范中的以太网类型指定PF_PACKET, SOCK_RAW),但 DHCP 数据包需要以太网类型IP和用户空间过滤,这可能比使用我在答案中建议的通过 libpcap 的内核过滤器效率低得多。我猜这取决于 BROUTING 过滤器的有效性。

背景

好吧,我会坦白我真正想做什么。我想使用一个 WLAN 接口(我将其称为主接口)以站模式连接(连接到某个接入点),并将该接口桥接到另一个接口(辅助接口),可以是以太网接口,也可以是运行接入点的第二个 WLAN 接口(使用 hostpad)。子网 DHCP 服务通过主接口提供。这里和上面都有很多问题Unix 和 Linux并给出答案解释为什么这样做不行:将无线网络桥接到 LAN如何使用 Debian 配置从 WiFi 到以太网的网络接口桥?, 例如。

我更倾向于使用网桥,而不是其他类型的解决方案,例如 NAT 或IP 级代理。网桥需要支持广播和多播流量以及单播。我了解这无法开箱即用的基本原因以及使用 4addr 模式和 WDS(不适用于我的情况)的可能性和限制。

事实上,由于在开箱即用方面存在这样的问题,最近的 Linux 内核全面禁止在桥接器上添加站模式 WLAN 接口。这是一个相对简单的内核补丁,可以恢复该限制。

有了这些,使用ebtables如下所述桥接网络连接:使用无线网卡桥接获得大部分内容。该示例需要通过一对 ebtables 条目手动配置每个桥接主机,并暗示这些主机的静态 IP 地址配置。它不支持连接到辅助接口的主机的 DHCP 配置。

使用 dhcprelay忙碌盒子, 或者dhcp 帮助程序可能是故事的一部分,只是一旦将接口添加到网桥,他们就无法看到流量和/或识别流量来自哪个接口,这对于他们的操作至关重要,也是我上面的问题的来源。

除了中继 DHCP 请求之外,我还希望能够监控该流量和 ARP 流量,以便用它来管理 ebtables 条目的自动添加和删除,并使用合成 ARP 流量作为保持活动机制。

答案1

一个选择可能是使用libpcap每个感兴趣的接口都有一个实例。看起来 pcap 可以看到已添加到网桥的接口上的数据包。我目前采用这种方法。我怀疑数据包过滤器的开销会很大。

但我承认我不明白 libpcap 如何在从属接口级别查看数据包。据我所知,它还使用AF_PACKET, SOCK_RAW。也许它使用与有关PACKET_MMAP。我曾尝试摆弄诸如套接字过滤程序的存在与否之类的东西,但没有得到任何结果。

相关内容