📄 netfilter
字号:
any problems,send mails to lysindybear@sina.com.cn
相关文件
/net/core/netfilter.c
/net/ipv4/netfilter/ip_queue.c
目前看来,最主要的TCP/IP协议的开始就是ip_queue.c中的init函数,
通过nfnl = netlink_kernel_create(NETLINK_FIREWALL, netlink_receive_user_sk);这一行程序
产生了一个全局的struct sock结构,并且这个sock结构中的protinfo(协议信息)中的netlink_opt中的
data_ready函数被设置成为netlink_receive_user_sk,
而netlink_receive_user_sk则从sk中摘下一个sk_buff结构,送到netlink_receive_user_skb中去处理
static void netlink_receive_user_sk(struct sock *sk, int len)
{
do {
struct sk_buff *skb;
if (rtnl_shlock_nowait())
return;
while ((skb = skb_dequeue(&sk->receive_queue)) != NULL) {
netlink_receive_user_skb(skb);
kfree_skb(skb);
}
up(&rtnl_sem);
} while (nfnl && nfnl->receive_queue.qlen);
}
******************使用方法***************************************
在init_module中使用nf_register_hook(&ip_vs_in_ops)注册一个接口函数集合,
例如下面的函数集合
static struct nf_hook_ops ip_vs_in_ops = {
{ NULL, NULL },
packet_in, PF_INET, NF_IP_LOCAL_IN, 100
};
对其中的packet_in函数进行具体的操作,
static unsigned int packet_in(unsigned int hooknum,
struct sk_buff **skb_p,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *))
这个函数中穿进来的sk_buff就是数据包,我们可以对他进行各种操作
系统一共定义了几种截取点
#define NF_IP_PRE_ROUTING 0
#define NF_IP_LOCAL_IN 1
#define NF_IP_FORWARD 2
#define NF_IP_LOCAL_OUT 3
#define NF_IP_POST_ROUTING 4
他们的作用顺序是NF_IP_PRE_ROUTING在最前面,她可以截取所有的IP包,然后按照IP包的方向分为
LOCAL和FORWARD,如果是送到本地机的IP包,就走NF_IP_LOCAL_IN这条路,然后经过NF_IP_LOCAL_OUT
到NF_IP_POST_ROUTING,如果IP包是被转发到别的机器上,就走NF_IP_FORWARD这条路,到NF_IP_POST_ROUTING
所有的路径都要汇集到NF_IP_POST_ROUTING这一点上。
*****************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -