【问题标题】: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;
}
但是,这似乎只为这个数据包设置了标记,而不是连接标记。
- 如何将 connmark 设置为 0x1,以便此流中的所有数据包
有这个标记吗?
- 如何访问 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 的地方;它可能会给您带来比仅此代码块更多的洞察力。
祝你好运!