在 netfilter 模块中设置 CONNMARK

Set CONNMARK in netfilter module

我有一个连接到 NF_INET_LOCAL_OUT 的 netfilter 模块。在钩子函数中,我设置标记如下:

if (tcp_header->syn && dport == 80) {
    skb->mark = 0x1;
}

但是,这似乎只为这个数据包设置了标记,而不是连接标记。

  1. 如何将 connmark 设置为 0x1 以便此流中的所有数据包 有这个标记吗?
  2. 如何访问 connmark 中的数据包 钩子函数?

感谢您的帮助。

注意:我不是内核网络专家;我只是擅长阅读网络代码本身:)

完全借鉴最新版本(4.15.8)中的net/netfilter/xt_connmark.c,试试下面的代码:

if (tcp_header->syn && dport == 80) {
    skb->mark = 0x1;

    enum ip_conntrack_info ctinfo;
    struct nf_conn *ct;

    ct = nf_ct_get(skb, &ctinfo);
    if (ct != NULL) {
        u_int32_t newmark;

        newmark = 0x01;
        if (ct->mark != newmark) {
            ct->mark = newmark;
            nf_conntrack_event_cache(IPCT_MARK, ct);
        }
    }
}

基本上,为了设置 CONNMARK 本身,您需要首先获取流的实际 conntrack 条目。完成后,您会看到当前标记是否已设置为 0x01 的新标记。如果不是,则设置标记并触发标记已设置的事件。

您可能想进一步了解 connmark_tg,这是修改此代码段的地方;它可能会给你更多的洞察力,而不仅仅是这个代码块。

祝你好运!