Linux kernel 在netfilter模块中设置CONNMARK

Linux kernel 在netfilter模块中设置CONNMARK,linux-kernel,netfilter,Linux Kernel,Netfilter,我有一个netfilter模块,它连接到NF_INET_LOCAL_OUT。在hook函数中,我设置了如下标记: if (tcp_header->syn && dport == 80) { skb->mark = 0x1; } 然而,这似乎只是为这个数据包设置了标记,而不是连接标记 如何将connmark设置为0x1,以便此流中的所有数据包 你有这个记号吗 如何访问中数据包的connmark 钩子函数 谢谢你的帮助。NB:我不是内核网络大师;我只是擅长阅读网

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

if (tcp_header->syn && dport == 80) {
    skb->mark = 0x1;
}
然而,这似乎只是为这个数据包设置了标记,而不是连接标记

  • 如何将connmark设置为0x1,以便此流中的所有数据包 你有这个记号吗
  • 如何访问中数据包的connmark 钩子函数

  • 谢谢你的帮助。

    NB:我不是内核网络大师;我只是擅长阅读网络代码本身:)

    在最新版本(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\u tg
    ,这就是修改此代码段的地方;它可能会给你更多的洞察力,而不仅仅是这个代码块

    祝你好运