驅動程式 - Linux Device Driver (LDD) - 使用範例 - C/C++ (Debian) - Netfilter Hooking



參考資訊:
https://github.com/jdaeman/example/blob/master/netfilter.c

main.c

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/netfilter.h>
#include <linux/netfilter_arp.h>
#include <linux/skbuff.h> 
#include <linux/ip.h>
#include <linux/if_ether.h>

struct nf_hook_ops hook;

unsigned int hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
{
	struct iphdr *ip = ip_hdr(skb);
	struct ethhdr *eth = eth_hdr(skb);

	printk("caller: %s\n", current->comm);
	printk("mac: %pM\n", eth->h_source);
	printk("ip protocol: %d\n", ip->protocol);
	printk("%pI4 -> %pI4\n", &ip->saddr, &ip->daddr);

	return NF_ACCEPT;
}

int ldd_init(void)
{
	hook.hook = hook_func;
	hook.hooknum = NF_INET_POST_ROUTING;
	hook.pf = NFPROTO_INET;

	nf_register_net_hook(&init_net, &hook);
	return 0;
}

void ldd_exit(void)
{
	nf_unregister_net_hook(&init_net, &hook);
}

module_init(ldd_init);
module_exit(ldd_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Steward Fu");
MODULE_DESCRIPTION("Linux Driver");

完成

$ sudo dmesg
    [ 5010.031240] caller: k3s-server
    [ 5010.031242] mac: ff:ff:ff:a8:82:82
    [ 5010.031244] ip protocol: 6
    [ 5010.031245] 127.0.0.1 -> 127.0.0.1