2

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

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

4

1 回答 1

0

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

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

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

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

于 2018-03-31T11:00:28.800 回答