如果我在套接字过滤器中设置了一个 mbuf 标记,我以后可以在 IP 过滤器中找到这些标记的数据包吗?

If i set an mbuf tag in a socket filter can i later find these tagged packets in an IP filter?

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

在套接字过滤器sf_data_out_func函数中,我成功标记了所有的mbufs。然而,在我的 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 过滤器永远不会打印出 "Found an allowed packet!"。

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

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

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