免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: kimguobin
打印 上一主题 下一主题

关于netfilter中5个垂钓点的疑问! [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-04-28 10:37 |只看该作者
原帖由 fangjuntan 于 2008-4-23 20:22 发表
我的毕业设计也是防火墙,你做的是什么方向??

我做是基于NETFILTER的防火墙,
既然做的都是同一个题目,那就一起探讨探讨吧!

[ 本帖最后由 kimguobin 于 2008-4-28 16:30 编辑 ]

论坛徽章:
0
22 [报告]
发表于 2008-04-28 11:07 |只看该作者
原帖由 sesame0816 于 2008-4-23 20:50 发表
端口从skb->data中读才正确,否则就会有问题,我以前遇到过:

http://bbs.chinaunix.net/thread-1059245-1-1.html


谢谢提醒,我去试试!再次感谢!!!
有人能解释下为什么直接用tcp_hdr(sk)不能正确获取吗??

[ 本帖最后由 kimguobin 于 2008-4-28 11:10 编辑 ]

论坛徽章:
0
23 [报告]
发表于 2008-04-28 11:14 |只看该作者
原帖由 kimguobin 于 2008-4-28 11:07 发表


谢谢提醒,我去试试!再次感谢!!!
有人能解释下为什么直接用tcp_hdr(sk)不能正确获取吗??

我没这么用过,一向都是从 iphdr 开始自己算得来的,iphdr 就是 skb->data,因为 netfilter 工作在网络层
我想是不是这样,如果数据包处理还没有到 L4,那么 tcp_hdr 应该是得不到数据的,但具体没试验过
你说得到的数据不正确,那么能否看一下得到的是什么,在数据包里是那部分内容
如果得到的内容在数据包中,证明层次处理上出现了问题,若得到的数据根本不在数据包里,那可能是其他低级错误了

论坛徽章:
0
24 [报告]
发表于 2008-04-28 15:39 |只看该作者

回复 #23 platinum 的帖子

如果数据包没有到达L4,使用struct tcphdr *tcph = (struct tcphdr*)tcp_hdr(sk)的时候tcph里的内容是不是NULL呢?当我读取里面的source,dest的时候不是NULL,里面是错误的信息,端口号对不上,
我改成 struct tcphdr *tcph = (struct tcphdr *)(sk->transport_header)之后变化如下,如:我用浏览器访问网页应该是HTTP协议,抓输出的包源端口号应该是80,但实际测到的不是80端口而是一个莫名其妙的端口,目的端口却是80,使用FTP协议的时候目的端口是21,而源端口很乱,
tcp_hdr()函数
return skb->head+skb->transport_header;

论坛徽章:
0
25 [报告]
发表于 2008-04-28 15:51 |只看该作者
用 skb->data + ((struct iphdr *)skb->data)->ihl * 4 作为 tcp 头试试呢?

论坛徽章:
0
26 [报告]
发表于 2008-04-28 16:16 |只看该作者
原帖由 platinum 于 2008-4-28 15:51 发表
用 skb->data + ((struct iphdr *)skb->data)->ihl * 4 作为 tcp 头试试呢?


试了下,结果还是一样, 真是太奇怪了,或许真的是哪出了低级错误,源端口总是在5位数上!!而目的端口显示的是源端口,

论坛徽章:
0
27 [报告]
发表于 2008-04-28 16:36 |只看该作者
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/netdevice.h>
#include <linux/icmp.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/if_ether.h>
#include <linux/netfilter_ipv4.h>

MODULE_LICENSE("GPL");

static unsigned int OUT_FILTER_NF_IP_POST_ROUTING(unsigned int hooknum,struct sk_buff **skb,const struct net_device *in,const struct net_device *out,int(*okfn)(struct sk_buff *))
{
        struct sk_buff *sk=skb_copy(skb,1);
        struct ethhdr *ethh = eth_hdr(sk);
        unsigned char *s_mac=ethh->h_source;
        unsigned char *d_mac=ethh->h_dest;
        struct iphdr *iph = (struct iphdr*)ip_hdr(sk);
        if(iph->protocol==6)
        {
                struct tcphdr *tcph = (struct tcphdr *)(sk->data+((struct iphdr *)sk->data)->ihl*4);
                printk("A  TCP packet OUT\nMAC=%02X:%02X:%02X:%02X:%02X:%02X ---> %02X:%02X:%02X:%02X:%02X:%02X\nIP=%d.%d.%d.%d ---> %d.%d.%d.%d\nPort=%d ---> %d",s_mac[0],s_mac[1],s_mac[2],s_mac[3],s_mac[4],s_mac[5],d_mac[0],d_mac[1],d_mac[2],d_mac[3],d_mac[4],d_mac[5],NIPQUAD(iph->saddr),NIPQUAD(iph->daddr),ntohs(tcph->source),ntohs(tcph->dest));
        }
        if(iph->protocol==17)
        {
                struct udphdr *udph = (struct udphdr *)(sk->data+((struct iphdr *)sk->data)->ihl*4);       
                printk("A  UDP packet OUT\nMAC=%02X:%02X:%02X:%02X:%02X:%02X ---> %02X:%02X:%02X:%02X:%02X:%02X\nIP=%d.%d.%d.%d ---> %d.%d.%d.%d\nPort=%d ---> %d ",s_mac[0],s_mac[1],s_mac[2],s_mac[3],s_mac[4],s_mac[5],d_mac[0],d_mac[1],d_mac[2],d_mac[3],d_mac[4],d_mac[5],NIPQUAD(iph->saddr),NIPQUAD(iph->daddr),ntohs(udph->source),ntohs(udph->dest));
        }
        return NF_ACCEPT;       
       
}

static struct nf_hook_ops out_net={
.list = {NULL,NULL},
.hook = OUT_FILTER_NF_IP_POST_ROUTING,
.pf = PF_INET,
.hooknum = NF_IP_LOCAL_OUT,
.owner = THIS_MODULE,
.priority = NF_IP_PRI_FIRST,
};

static void kim_init_net(void)
{
nf_register_hook(&out_net);
}
static void kim_cleanup_net(void)
{
nf_unregister_hook(&out_net);
}

module_init(kim_init_net);
module_exit(kim_cleanup_net);


这是源代码,不知道有没有低级错误,
下面是MAKE文件
ifneq ($(KERNELRELEASE),)
        obj-m := out_packet_filter.o
else
        KERNELDIR ?= /lib/modules/$(shell uname -r)/build
        PWD  := $(shell pwd)
default:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
不知道在别的电脑上运行是不是也这样。
ubuntu 8.04 LTS           2.6.24.16-generic

[ 本帖最后由 kimguobin 于 2008-4-28 16:42 编辑 ]

论坛徽章:
0
28 [报告]
发表于 2008-04-28 16:54 |只看该作者
打印 TCP 端口部分的代码没有看到,有没有利用 ntohs  宏做网络字节序调整?

论坛徽章:
0
29 [报告]
发表于 2008-04-28 17:55 |只看该作者
原帖由 platinum 于 2008-4-28 16:54 发表
打印 TCP 端口部分的代码没有看到,有没有利用 ntohs  宏做网络字节序调整?


printk("A  TCP packet OUT\nMAC=%02X:%02X:%02X:%02X:%02X:%02X ---> %02X:%02X:%02X:%02X:%02X:%02X\nIP=%d.%d.%d.%d ---> %d.%d.%d.%d\nPort=%d ---> %d",s_mac[0],s_mac[1],s_mac[2],s_mac[3],s_mac[4],s_mac[5],d_mac[0],d_mac[1],d_mac[2],d_mac[3],d_mac[4],d_mac[5],NIPQUAD(iph->saddr),NIPQUAD(iph->daddr),ntohs(tcph->source),ntohs(tcph->dest));

最后两个就是打印TCP端口的    ntohs(tcph->source),ntohs(tcph->dest)
用  NTOHS做了调整!

论坛徽章:
0
30 [报告]
发表于 2008-04-28 18:43 |只看该作者
晕,用 FireFox 浏览器看不到你的东西,太长了,下面也没有进度条……

struct tcphdr *tcph = (struct tcphdr *)(sk->data+((struct iphdr *)sk->data)->ihl*4);
换成
struct tcphdr *tcph = (struct tcphdr *)((void *)sk->data+((struct iphdr *)sk->data)->ihl*4);
试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP