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