我有一个netfilter模块挂钩到NF_INET_LOCAL_OUT。在钩子函数中,我按如下方式设置标记:
if (tcp_header->syn && dport == 80) {
skb->mark = 0x1;
}
但是,这似乎只为此数据包设置了标记,而不是连接标记。
感谢您的帮助。
答案 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
,这是修改此代码段的位置;它可能比单独使用这个代码块提供更多的洞察力。
祝你好运!