iptables / ebtables 挂钩功能,用于在接口或第 2 层进行过滤



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

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

我不确定是否有一种通用方法来钩住它,但我想到了一些方法:

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

绑定驱动程序是后者的一个例子。在后台,它将出口流量分散到从属设备,并从中收集入口流量。

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

最新更新