【问题标题】:iptables / ebtables hook function to filter on interface or layer 2iptables / ebtables 钩子函数用于过滤接口或第 2 层
【发布时间】:2018-03-30 23:14:12
【问题描述】:

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

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

【问题讨论】:

  • 我将其作为内核模块驱动程序编写。我可能会将一些数据包转发到用户空间并防止它在 NIC 上发出。所以,我真的不能使用 iptable/ebtables 命令,因为我需要 sk_buffer 数据。我需要全帧 - eth、IP 标头。

标签: linux-kernel netfilter ebtables


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 2021-05-19
    • 2013-06-11
    • 2019-07-26
    • 1970-01-01
    相关资源
    最近更新 更多