【问题标题】:Set CONNMARK in netfilter module在 netfilter 模块中设置 CONNMARK
【发布时间】:2018-03-11 06:26:01
【问题描述】:

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

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

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

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

感谢您的帮助。

【问题讨论】:

    标签: linux-kernel netfilter


    【解决方案1】:

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

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

    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,这是修改此 sn-p 的地方;它可能会给您带来比仅此代码块更多的洞察力。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 2012-03-07
      • 2018-03-12
      相关资源
      最近更新 更多