Я пытаюсь создать минимальный модуль ядра для регистрации сетевых пакетов, используя netfilter
ловушки.Я хочу проверить, установлено ли / подтверждено ли конкретное соединение в обоих направлениях, например, что будет отображать conntrack
.
Я получаю информацию о conntrack для каждого буфера сокета, и я хотел бы знать,состояние каждого буфера.Функция nf_ct_get(const struct sk_buff *skb, enum ip_conntrack_info *ctinfo)
принимает перечисление conntrack info, которое имеет член connection established
.Есть ли способ получить эту информацию из информационной переменной conntrack.Или я должен просто использовать функцию 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;
}