我正在尝试使用netfilter
钩子创建一个最小的网络数据包日志记录内核模块。我想检查是否在两个方向上都建立/确认了特定的连接,例如conntrack
将显示什么。
我正在获取每个套接字缓冲区的conntrack信息,并且我想知道每个缓冲区的状态。函数nf_ct_get(const struct sk_buff *skb, enum ip_conntrack_info *ctinfo)
接受一个conntrack info枚举,该枚举具有一个connection established
成员。
有没有办法从conntrack info变量中获取此信息。
还是应该只使用nf_ct_is_confirmed(const struct nf_conn *ct)
函数?
我不确定此功能是否是检查已建立连接的正确功能。
static unsigned int device_all_incoming_hook(unsigned int hooknum, struct sk_buff *skb,
const struct net_device *in, const struct net_device *out,
int (*okfn)(struct sk_buff *)) {
struct iphdr *packet;
struct nf_conn *conntrack;
enum ip_conntrack_info ctinfo;
socket_buffer = skb_clone(skb, GFP_KERNEL);
if (!socket_buffer)
return NF_ACCEPT;
packet = (struct iphdr *) skb_network_header(socket_buffer);
if (packet->protocol < 0)
return NF_ACCEPT;
if (packet->protocol != IPPROTO_TCP) {
return NF_ACCEPT;
}
conntrack = nf_ct_get(socket_buffer, &ctinfo);
printk(KERN_INFO "Info is %d\n", &ctinfo);
return NF_ACCEPT;
}
static struct nf_hook_ops device_hooks[] __read_mostly = {
{
.hook = device_all_incoming_hook,
.pf = NFPROTO_IPV4,
.hooknum = NF_INET_PRE_ROUTING,
.priority = NF_IP_PRI_FIRST,
},
};
static int device_init(void) {
int result;
result = nf_register_hooks(device_hooks, ARRAY_SIZE(device_hooks));
if (result > 0) {
;
}
pr_debug("Loading device into kernel!\n");
return 0;
}