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

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

我目前正在开发一种 IDS/IPS,它使用 NetFlow 数据来假设是否存在持续攻击。我买不起昂贵的 CISCO 路由器,所以我买了一个 LINKSYS 路由器,在上面安装了 DD-WRT。 DD-WRT 将 netflow v5 数据包发送到您的首选机器,因此它就像拥有一台 CISCO 路由器但更旧。基本上,只需花费 80 美元并进行一些微调,您就能获得值(value) 200-500 美元的路由器。 我已经设置了路由器,正在获取数据包,我什至使用了 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++。无论使用哪种编程语言,我最大的问题是如何读取这些数据包的内容,以便我可以得出其他模块所需的正确结论。

最佳答案

rFlow/NetFlow v5 数据包是二进制数据包布局,因此将它们视为文本时,嗯,不可读。

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

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

关于java - 读取 netflow/rflow (dd-wrt) 数据包内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5160414/

相关文章:

java - Jersey Bean 验证将 application/x-www-form-urlencoded 解释为 bean

c++ - 在 32 位环境中链接到 32 位共享目标文件会产生 ELFCLASS64 错误

android - Android 上是否可以进行数据包转发?

java - 如何使用Java nio在写操作期间检测磁盘已满?

java - 无法在 Google Cloud Endpoints 的 Endpoint 类中创建多个方法

java - JTabbedPane - 动态选项卡控件

c++ - 无法转换 double - new 运算符

c++ - 两个类的前向声明会导致构造函数中的循环依赖吗?

python - 使用 TCP 套接字发送/接收数据包

python - 如何使用 tun/tap 接口(interface)拆分数据包、隧道然后重新组装。 (类似于 MLPPP)