參考資訊:
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