iptables / ebtables钩子函数用于过滤接口或第2层

时间:2018-03-30 23:14:12

标签: linux-kernel netfilter ebtables

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

我查找了ebtables钩子函数,它们似乎与Bridge INPUT / FORWARD / OUTPUT有关。如果我明白,来自本地tcp / ip的传出数据包不会通过桥接转发挂钩。有没有办法可以挂钩Linux IP和链路层之间的数据包进行过滤(DROP或修改)......?

1 个答案:

答案 0 :(得分:0)

我不确定是否有一种通用的方法来解决这个问题,但有些方法会浮现在脑海中:

  • LD_PRELOAD套接字操作:提供具有您自己的send(|to|msg)
  • 实现的共享库
  • 注册虚拟TAP界面并让您的应用程序绑定到它
  • 在内核中注册虚拟接口并让应用程序绑定到它

bonding驱动程序是后者的一个例子。在幕后,它将出口流量分散到从属设备并收集来自它们的入口流量。

我在我的uman驱动程序中试过了这个。您可以通过DebugFS配置微管理接口。绑定到uman0虚拟接口的任何应用程序都会使其出口流量通过uman_start_xmit并通过uman_handle_frame进入流量,您可以在其中添加代码以决定是转发/修改/丢弃数据包。 uman是我学士论文的副产品,可能不适合生产使用(如果你使它更健康,欢迎提出请求:-)。