在netfilter模块中设置CONNMARK

时间:2018-03-09 13:28:56

标签: linux-kernel netfilter

我有一个netfilter模块挂钩到NF_INET_LOCAL_OUT。在钩子函数中,我按如下方式设置标记:

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

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

  1. 如何将connmark设置为0x1,以便此流程中的所有数据包 有这个标记吗?
  2. 如何访问数据包中的connmark 钩功能?
  3. 感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

完全从最新版本(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,这是修改此代码段的位置;它可能比单独使用这个代码块提供更多的洞察力。

祝你好运!