【问题标题】:If i set an mbuf tag in a socket filter can i later find these tagged packets in an IP filter?如果我在套接字过滤器中设置了一个 mbuf 标记,我以后可以在 IP 过滤器中找到这些标记的数据包吗?
【发布时间】:2020-01-14 19:31:56
【问题描述】:

我正在 MacOS 上编写一个网络内核扩展,它由一个套接字过滤器和一个 IP 过滤器组成。我的 IP 过滤器作为一种防火墙工作,我只想允许之前被套接字过滤器标记为允许的数据包通过。

在套接字过滤器sf_data_out_func 函数中,我成功标记了所有mbuf。但是在我的ipf_output_func 中,我似乎无法找到这些带有mbuf_tag_find() 的标记数据包。

我在套接字过滤器中标记数据包如下:

static errno_t socket_data_out(void *cookie, socket_t so, const struct sockaddr *to, mbuf_t *data, mbuf_t *control, sflt_data_flag_t flags)
{
    if(!cookie)
        return 0;

    struct my_entry *entry = cookie;

    errno_t ret;

    int *tag_ref = NULL;

    // Not used
    int value = 1;

    if((ret = mbuf_tag_allocate(*data, my_tag_id, ALLOWED_PACKET, sizeof(value), MBUF_WAITOK, (void**)&tag_ref)))
    {
        log("mbuf_tag_allocate failed");
    }

    return 0;
}

在IP过滤器中如下:

static errno_t ipfilter_output(void *cookie, mbuf_t *data, ipf_pktopts_t options)
{
    errno_t    status;
    int        *tag_ref;
    size_t     len;
    int        value = 1;

    status = mbuf_tag_find(*data, my_tag_id, ALLOWED_PACKET, &len, (void**)&tag_ref);
    if(status == 0) 
        log("Found an allowed packet!");

    return 0;
}

但 IP 过滤器永远不会打印出“找到允许的数据包!”。

IP 过滤器能否找到先前在套接字过滤器中标记的数据包?

【问题讨论】:

    标签: macos network-programming kernel kernel-extension darwin


    【解决方案1】:

    据我所知,文档中无法保证套接字过滤器看到的mbuf 与稍后通过IP 过滤器的mbuf 相同。如果数据从一个mbuf复制到另一个,标签也不会自动复制。

    套接字过滤器和 IP 过滤器是两个不同的过滤器概念,它们不一定能很好地混合。您要么关心从哪个套接字发送数据,要么不关心。在第一种情况下,您只需要一个套接字过滤器,而在后一种情况下,您只需要一个 IP 过滤器。

    【讨论】:

    • 啊,非常感谢!你能想出一种方法来做我想做的事吗?我希望能够检测到来自某个应用程序 (PID) 的所有 IP 流量! :) 不幸的是,我不能只使用套接字过滤器中的 data_out,因为这需要我附加到系统中的每个套接字....
    猜你喜欢
    • 2010-10-17
    • 2011-05-28
    • 2014-06-30
    • 1970-01-01
    • 2015-02-24
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多