免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1852 | 回复: 6
打印 上一主题 下一主题

[网络子系统] 端口镜像,跪求高手指导 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-13 18:17 |只看该作者 |倒序浏览
    使用netfilter做端口镜像,比如:eth1镜像到eth0,要求将eth1收到的包以及发送的包都镜像到eth0

一:
   在NF_INET_PRE_ROUTING这个hook点挂钩子函数抓包,然后skb_clone一份包nskb,钩子函数中将nskb处理下,再调用dev_queue_xmit将nskb从eth0(修改nskb->dev)发出去。
    经验证,该做法完全OK,wireshark可以从eth0抓到eth1收到的包

二:
   在NF_INET_POST_ROUTING这个hook点挂钩子函数抓包,然后skb_clone一份包nskb,钩子函数中nskb通过ip_finish_output函数继续从eth0(修改nskb->dev)发出去。
   经验证,该做法完全OK,wireshark可以从eth0抓到eth1发送的包
注:ip_finish_output是通过kallsyms_lookup_name调出来用的

问题来了。当我分别使用上述两种做法进行抓包,可以做到:抓取eth1的发送包  或者  抓取eth1的收到包
当我将以上两个钩子函数放在一个ko里,挂两个钩子。我认为可以既抓到发送包,也抓到收包。
可是事实却是:两种包wireshark都抓不到了

当我将ko1(收)insmod,则wireshark能抓到包(收)。rmmod后,再insmod ko2(发),wireshark抓不到包了。要过一段时间(好几分钟)wireshark才能抓到包(发)
反之亦然

这中间不知道哪里出了问题。请大神指点指点

论坛徽章:
0
2 [报告]
发表于 2013-11-14 08:45 |只看该作者
没人理我
自己顶-->坐等专家解答
实在是想到乳头都爆了还是想不出什么原因

论坛徽章:
0
3 [报告]
发表于 2013-11-15 10:52 |只看该作者
昨天分析了下IP层和链路层之间的skb包流程。没发现啥有冲突的啊。有大神来瞅瞅不

论坛徽章:
0
4 [报告]
发表于 2013-11-16 19:35 |只看该作者
从逻辑上看,没有问题。

需要看你的代码了

论坛徽章:
0
5 [报告]
发表于 2013-11-20 10:48 |只看该作者
回复 4# GFree_Wind


    unsigned int rcv_func(unsigned int hooknum, struct sk_buff *skb, const struct net_device *in, const struct net_device *out ,int (*okfn)(struct sk_buff *))
    {
        if(is_ports(in))
       {
            nskb=skb_clone(skb,GFP_ATOMIC);
            if(!nskb)
                return NF_ACCEPT;
            mirror = dev_get_by_name(&init_net, dst);
            nskb->dev=mirror;
            dev_put(mirror);
            skb_push(nskb, nskb->mac_len);
            dev_queue_xmit(nskb);
       }
       return NF_ACCEPT;
    }

unsigned int send_func(...)
{
    if(is_ports(skb->dev)
    {
            nskb=skb_clone(skb,GFP_ATOMIC);
            if(!nskb)
                return NF_ACCEPT;
            mirror = dev_get_by_name(&init_net, dst);
            nskb->dev=mirror;
            dev_put(mirror);
            ip_finish_output(nskb);
    }
    return NF_ACCEPT;
}
以上两个函数分别是在NF_INET_PRE_ROUTING和NF_INET_POST_ROUTING两个netfilter的hook点挂的钩子函数
省略数据声明。其中is_ports判断是否是要监听的端口,如判断skb->dev是否是eth1。dst是要镜像到的端口名称,如"eth0"

论坛徽章:
0
6 [报告]
发表于 2013-11-21 16:32 |只看该作者
netif_receive_skb是驱动层将skb传送到内核的第一站。能不能直接在netif_receive_skb中,把端口eth1收到的数据包直接从eth0往外发送呢???

论坛徽章:
0
7 [报告]
发表于 2013-11-27 11:13 |只看该作者
回复 6# 237663598


    可以通过ingress qdisc而不同过netfilter

1. # tc qdisc add dev eth1 ingress
  2. # tc filter add dev eth1 parent ffff: \
          protocol ip u32 match u8 0 0 \
          action mirred egress mirror dev eth0
  3. # tc qdisc replace dev eth1 parent root prio
  4. # tc filter add dev eth1 parent 8002: \
          protocol ip u32 match u8 0 0 \
          action mirred egress mirror dev eth0
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP