Linux kernel iptables/ebtables钩子函数,用于在接口或第2层上进行过滤

Linux kernel iptables/ebtables钩子函数,用于在接口或第2层上进行过滤,linux-kernel,netfilter,ebtables,Linux Kernel,Netfilter,Ebtables,我已经使用netfilter钩子函数来过滤/嗅探传出的IP数据包。我希望在IP层和链路层之间过滤(来自主机的)传出数据包,以查看第2层信息,如接口、MAC地址。NF_INET_POSTROUTING没有提供mac地址信息,因为我猜在地址解析之前,它在ip_output()中被调用 我查找了ebtables钩子函数,它们似乎与桥接输入/转发/输出相关。如果我理解,来自本地tcp/ip的传出数据包不会通过网桥转发挂钩。有没有办法在Linux IP和链路层之间挂接数据包以进行过滤(删除或修改)…?我不

我已经使用netfilter钩子函数来过滤/嗅探传出的IP数据包。我希望在IP层和链路层之间过滤(来自主机的)传出数据包,以查看第2层信息,如接口、MAC地址。NF_INET_POSTROUTING没有提供mac地址信息,因为我猜在地址解析之前,它在ip_output()中被调用


我查找了ebtables钩子函数,它们似乎与桥接输入/转发/输出相关。如果我理解,来自本地tcp/ip的传出数据包不会通过网桥转发挂钩。有没有办法在Linux IP和链路层之间挂接数据包以进行过滤(删除或修改)…?

我不确定是否有通用的挂接方法,但我想到了一些方法:

  • LD|u预加载
    socket操作:为您自己的
    send(| to | msg)实现提供一个共享库
  • 注册虚拟TAP接口并将应用程序绑定到该接口
  • 在内核中注册一个虚拟接口,并将应用程序绑定到它
司机就是后者的一个例子。在幕后,它将出口流量分散到从属设备,并收集来自从属设备的入口流量


我在我的司机身上试过这个。您可以通过DebugFS配置微管理接口。任何绑定到
uman0
虚拟接口的应用程序都将使其出口流量通过
uman\u start\u xmit
,而入口流量通过
uman\u handle\u frame
,您可以在其中添加代码以决定是否转发/损坏/丢弃数据包
uman
是我学士学位论文的副产品,可能不适合生产使用(如果您让它更合适,欢迎拉取请求:-)

我是作为内核模块驱动程序写的。我可能会将一些数据包转发到用户空间,并阻止它在NIC上运行。所以,我真的不能使用iptable/ebtables命令,因为我需要sk_缓冲区数据。我需要完整的帧-以太网,IP头。