netfilter数据包过滤
❶ android系统中的3G通信数据包可以用netfilter来抓取吗拜托各位大神
通俗的说,netfilter的架构就是在整个网络流程的若干位置放置了一些检测点(HOOK),而在每个检测点上登记了一些处理函数进行处理(如包过滤,NAT等,甚至可以是 用户自定义的功能)。
netfilter[1]
IP层的五个HOOK点的位置如下图所示
[1]:NF_IP_PRE_ROUTING:刚刚进入网络层的数据包通过此点(刚刚进行完版本号,校验
和等检测), 目的地址转换在此点进行;
[2]:NF_IP_LOCAL_IN:经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行;
[3]:NF_IP_FORWARD:要转发的包通过此检测点,FORWARD包过滤在此点进行;
[4]:NF_IP_POST_ROUTING:所有马上便要通过网络设备出去的包通过此检测点,内置的源地址转换功能(包括地址伪装)在此点进行;
[5]:NF_IP_LOCAL_OUT:本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行。
在IP层代码中,有一些带有NF_HOOK宏的语句,如IP的转发函数中有:
如果在编译内核时没有配置netfilter时,就相当于调用最后一个参数,此例中即执行
ip_forward_finish函数;否则进入HOOK点,执行通过nf_register_hook()登记的功能
(这句话表达的可能比较含糊,实际是进入nf_hook_slow()函数,再由它执行登记的
函数)。
NF_HOOK宏的参数分别为:
⒈ pf:协议族名,netfilter架构同样可以用于IP层之外,因此这个变量还可以有诸如
PF_INET6,PF_DECnet等名字。
⒉hook:HOOK点的名字,对于IP层,就是取上面的五个值;
⒊skb:不用多解释了吧;
⒋indev:进来的设备,以struct net_device结构表示;
⒌outdev:出去的设备,以struct net_device结构表示;
(后面可以看到,以上五个参数将传到用nf_register_hook登记的处理函数中。)
⒍okfn:是个函数指针,当所有的该HOOK点的所有登记函数调用完后,转而走此流程。
这些点是已经在内核中定义好的,除非你是这部分内核代码的维护者,否则无权增加
或修改,而在此检测点进行的处理,则可由用户指定。像packet filter,NAT,connection
track这些功能,也是以这种方式提供的。正如netfilter的当初的设计目标--提供一
个完善灵活的框架,为扩展功能提供方便。
如果我们想加入自己的代码,便要用nf_register_hook函数,其函数原型为:
int nf_register_hook(struct nf_hook_ops *reg)
我们考察一下struct nf_hook_ops结构:
我们的工作便是生成一个struct nf_hook_ops结构的实例,并用nf_register_hook将
其HOOK上。其中list项我们总要初始化为{NULL,NULL};由于一般在IP层工作,pf总是
PF_INET;hooknum就是我们选择的HOOK点;一个HOOK点可能挂多个处理函数,谁先谁后
,便要看优先级,即priority的指定了。netfilter_ipv4.h中用一个枚举类型指定了内
置的处理函数的优先级:
hook是提供的处理函数,也就是我们的主要工作,其原型为:
它的五个参数将由NFHOOK宏传进去。
了解了这些,基本上便可以可以写一个lkm出来了。
❷ 如何在netfilter捕获的数据包中获取到源mac信息
能看到0x0800说明mac-header还是在的,没有哪个模块闲的没事干把src-mac和dst-mac清零的 顺便把skb->dev打印出来,看到mac是0,多半是来自虚拟口的报文,比如lo或者ppp等。
❸ Linux系统中Netfilter中的ip包过滤功能的原理、策略管理、匹配原理
这个问题说来话长了,你可以下载Rusty Russell写的PacketFiltering HOWTO,好是iptables前身ipchains的作者,也是iptables的主要作者。第二是看一下iptables的man页,网上有中文版的。 简单的说就是包过滤 包含3个表格:filter过滤,nat地址转换,mangle 每个表格可以使用对某些链的处理方法,和专业防火墙的配置有点象,这里按包的行为分成5个链(INPUT,OUTPUT,FORWARD,POSTROUTING,PREROUTING) 后面是一个目标(ACCEPT,DROP,QUEUE,RETURN等) 对每个包系统先会确定是哪个链的,比如进入系统的归到INPUT链等, 对这个链再执行链里的每个语句(从上到下)如果匹配就执行后面的目标 如iptables -A INPUT -p icmp -j DROP -A 地表里增一条规则 -p icmp 这条规则匹配icmp报文 -j DROP 如果以上匹配的话就执行目标DROP:把这个包丢掉 这样别人就ping不到你了 具体情况,还要多看书,有兴趣[email protected]一起学习 参考文献: Rusty Russell Packet Filtering HOWTO
希望采纳
❹ netfilter修改数据包
构造报文是否正确,可以通过抓包工具看看
构造的报文应该是从mac层开始构造,看看是否构造mac地址与IP地址不对应,这种情况很可能被内核协议栈丢掉,简单的方法是接收个包,然后把里面的mac IP源地址和目的地址交换
是否使用正确的发送报文函数 skb->dev =pskb->dev;dev_queue_xmit(skb);
❺ 修改netfilter数据包
01.static unsigned int send(unsigned int hooknum, struct sk_buff * skb,
02. const struct net_device * in, const struct net_device * out,
03. int (*okfn)(struct sk_buff *))
04.{
05. struct iphdr* iph;
06. struct udphdr* udph;
07. struct tcphdr* tcph;
08. unsigned char *data = NULL;
09. int datalen;
10. int ret = 0;
11.
12. __u16 dst_port,src_port;
13. __be32 myip;
14.
15. if(skb)
16. {
17. iph = (struct iphdr *)skb_header_pointer(skb,0,0,NULL);
18. if(iph)
19. {
20. if(strcmp(dstIP,"")!=0&&strcmp(dstIP,"0.0.0.0")!=0)
21. {
22. myip = in_aton(dstIP);
23. if(iph->daddr == myip)
24. {
25. if(iph->protocol == IPPROTO_UDP)
26. {
27. udph = (struct udphdr *)skb_header_pointer(skb,IP_HDR_LEN,0,NULL);
28. data = (char *)skb_header_pointer(nskb,TOT_HDR_LEN,0,NULL);
29. datalen = ntohs(iph->tot_len)-TOT_HDR_LEN;
30. }
31. else if(iph->protocol == IPPROTO_TCP)
32. {
33. tcph = (struct tcphdr *)skb_header_pointer(skb,IP_HDR_LEN,0,NULL);
34. int offlen = IP_HDR_LEN + tcph->doff*4;
35. data = (char *)skb_header_pointer(skb,offlen,0,NULL);
36. datalen = ntohs (iph->tot_len)-offlen;
37. }
38.
39. int j;
40. for(j=0; j<datalen; j++)
41. {
42. data[j] += 1;
43. }
44. printk("encrypted\n");
45. iph->check = 0;
46. ip_send_check(iph);
47. }
48. }
49. }
50. }
51. return NF_ACCEPT;
52.}
01.static unsigned int send(unsigned int hooknum, struct sk_buff * skb,
02. const struct net_device * in, const struct net_device * out,
03. int (*okfn)(struct sk_buff *))
04.{
05. struct iphdr* iph;
06. struct udphdr* udph;
07. struct tcphdr* tcph;
08. unsigned char *data = NULL;
09. int datalen;
10. int ret = 0;
11.
12. __u16 dst_port,src_port;
13. __be32 myip;
14.
15. if(skb)
16. {
17. iph = (struct iphdr *)skb_header_pointer(skb,0,0,NULL);
18. if(iph)
19. {
20. if(strcmp(dstIP,"")!=0&&strcmp(dstIP,"0.0.0.0")!=0)
21. {
22. myip = in_aton(dstIP);
23. if(iph->daddr == myip)
24. {
25. if(iph->protocol == IPPROTO_UDP)
26. {
27. udph = (struct udphdr *)skb_header_pointer(skb,IP_HDR_LEN,0,NULL);
28. data = (char *)skb_header_ www.hnne.com pointer(nskb,TOT_HDR_LEN,0,NULL);
29. datalen = ntohs(iph->tot_len)-TOT_HDR_LEN;
30. }
31. else if(iph->protocol == IPPROTO_TCP)
32. {
33. tcph = (struct tcphdr *)skb_header_pointer(skb,IP_HDR_LEN,0,NULL);
34. int offlen = IP_HDR_LEN + tcph->doff*4;
35. data = (char *)skb_header_pointer(skb,offlen,0,NULL);
36. datalen = ntohs (iph->tot_len)-offlen;
37. }
38.
39. int j;
40. for(j=0; j<datalen; j++)
41. {
42. data[j] += 1;
43. }
44. printk("encrypted\n");
45. iph->check = 0;
46. ip_send_check(iph);
47. }
48. }
49. }
50. }
51. return NF_ACCEPT;
52.}
❻ 如何用netlink实现内核包过滤框架netfilter与用户空间的通信
查改内核有如下几种方式: 1、 直接通过文件系统(procfs/sysfs); 2、 增加自己的系统调用; 3、 使用统一系统调用(ioctl); 4、 netlink; 第一种方式的好处是无需增加用户态代码,直接通过cat或echo可配置,
❼ 请教netfilter抓混杂模式数据包
zmhzcy 估计你的内核(网卡驱动)可能已经工作在napi模式了,
问题应该出在你添加的处理逻辑上。
建议说一下你添加的代码都做了什么工作
❽ 在Linyx 系统中, Netfilter包过滤防火墙主要工作在OSI参考模型的( )
不管什么系统,只要是遵循OSI七层参考模型的,数据包始终是工作在第三层网络层上的,数据帧始终是工作在第二层数据链路层上的,二进制比特流始终是工作在最底层物理层上的。
❾ 如何实现NAT,已经理解原理了,但是如何过滤包
家用路由器本身就带有这个功能的nat,网络地址转换的意思.就是实现内部专用网公用一个或多个内外网地址上网容有动态nat,有静态nat和端口nat动态nat就是有一个地址池,里面有一定的Internet地址动态地分配给局域网内部用户轮流上网,某个用户不用上网时就自动释放地址,让别的用户可以用Internet地址上网静态nat就是把内部网的某部主机永久地映射到外网的一个固定地址实现上网这个链接有讲
❿ 如何用netfilter修改数据包的内容
内核中修改数据包是很麻烦的一件事,你可以用ip_queue 的 verdit 消息,自动reinject,那样的话再用户空间就能完成(如果仅限于IP协议的话)