在 netfilter 模块中设置 CONNMARK
Set CONNMARK in netfilter module
我有一个连接到 NF_INET_LOCAL_OUT 的 netfilter 模块。在钩子函数中,我设置标记如下:
if (tcp_header->syn && dport == 80) {
skb->mark = 0x1;
}
但是,这似乎只为这个数据包设置了标记,而不是连接标记。
- 如何将 connmark 设置为 0x1 以便此流中的所有数据包
有这个标记吗?
- 如何访问 connmark 中的数据包
钩子函数?
感谢您的帮助。
注意:我不是内核网络专家;我只是擅长阅读网络代码本身:)
完全借鉴最新版本(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
,这是修改此代码段的地方;它可能会给你更多的洞察力,而不仅仅是这个代码块。
祝你好运!
我有一个连接到 NF_INET_LOCAL_OUT 的 netfilter 模块。在钩子函数中,我设置标记如下:
if (tcp_header->syn && dport == 80) {
skb->mark = 0x1;
}
但是,这似乎只为这个数据包设置了标记,而不是连接标记。
- 如何将 connmark 设置为 0x1 以便此流中的所有数据包 有这个标记吗?
- 如何访问 connmark 中的数据包 钩子函数?
感谢您的帮助。
注意:我不是内核网络专家;我只是擅长阅读网络代码本身:)
完全借鉴最新版本(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
,这是修改此代码段的地方;它可能会给你更多的洞察力,而不仅仅是这个代码块。
祝你好运!