读取netflow / rflow(dd-wrt)数据包内容

时间:2011-03-01 21:13:10

标签: java c++ packet packet-capture cisco-ios

我目前正在开发一种IDS / IPS,它使用NetFlow数据来判断是否存在持续攻击。我买不起昂贵的CISCO路由器,所以我买了一台安装了DD-WRT的LINKSYS路由器。 DD-WRT将netflow v5数据包发送到您首选的计算机,因此它就像拥有CISCO路由器但更旧。基本上你得到200美元到500美元的路由器80美元和一点点调整。 我已经设置了路由器,我正在获取数据包,我甚至使用DD-WRT提供的工具来捕获rFlow(他们这样命名,但它的netflow v5)并且一切正常。

我的应用程序必须在内部完成所有操作,这意味着我需要捕获rflow数据包,读取它们并根据我的读数绘制假设。 我开始在JAVA中开发并设置一个UDP守护进程来监听2055(用于接收rflow数据包的端口)。一切都很好,我收到的数据包,但当我尝试查看内容时,我得到一些奇怪的字符,就像我从内存中倾倒东西。

这是我设置守护程序和读取数据的代码。

try {
            serverSocket = new DatagramSocket(2055);
            while (true) {
                DatagramPacket receivedPacket = new DatagramPacket(received, received.length);
                serverSocket.receive(receivedPacket);
                ByteArrayInputStream byteIn = new ByteArrayInputStream(receivedPacket.getData(),0,receivedPacket.getLength());
                DataInputStream in = new DataInputStream(byteIn);
                String input = "";
                while( (input = in.readLine()) != null) {
                    System.out.println(input + "\n");
                }
                Inet4Address from = (Inet4Address) receivedPacket.getAddress();
                System.out.println("FROM: " + from + "\nDATA: " + data[4]);
            }
        } catch (SocketException ex) {
            System.out.println(ex.getMessage());
        }

我找到了一个名为jflow的库..但是没有源代码所以我对使用它持怀疑态度。我想知道是否有人可以告诉我如何才能真正读取发送给我的数据包的内容。由于我处于开发的早期阶段,我不一定会使用JAVA,我可以选择C ++。我最大的问题是,无论编程语言是如何读取这些数据包的内容,以便我可以得出我需要的其他模块的正确结论。

1 个答案:

答案 0 :(得分:1)

rFlow / NetFlow v5数据包是一个二进制数据包布局,所以它们看起来像文本一样,很难显示。

v5数据包的数据包格式是已知的,可以通过谷歌搜索找到。 This似乎是一个很好的参考。

请注意,dd-wrt上的rFlow守护程序有一个长期存在的错误,它没有正确填写输入或输出接口字段。