使用MySQL读取Netflow数据包内容

时间:2014-06-03 13:57:20

标签: java mysql packet netflow

我正在开发一个软件,它从我拥有的虚拟机中捕获通过我的防火墙(5.4 OpenBSD虚拟机)的每个udp数据包,并将数据包保存在MySQL数据库中。

我的代码基本上是:

try
{
DatagramSocket serverSocket = new DatagramSocket(9876);        
byte[] receiveData = new byte [1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String sentence = new String(receivePacket.getData());
InetAddress IPAddress = receivePacket.getAddress();
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "INSERT INTO tabela_netflow (fluxo) values (?)";
PreparedStatement statement = conn.prepareStatement(sql);
statement.setBytes(1,receivePacket.getData());
int row = statement.executeUpdate();
if (row > 0) 
{
   System.out.println("Packet saved:" +receivePacket.getData());
}

} catch (SQLException ex) 
{
   ex.printStackTrace();
}

代码运行得很好,我的问题是,当我尝试查看保存在数据库中的内容时,有很多奇怪的字符,因为它是二进制的(我认为),我无法读取它以获得我需要的信息(流量记录格式,可以被发送here

我的表非常简单:有2列,代码(int,自动增量)和另一列,fluxo(varbinary(10000))。 这是我在MySQL Workbench上单击“编辑器中的打开值”时看到的内容: Packet Content

2 个答案:

答案 0 :(得分:0)

NetFlow 5数据报非常紧凑:每个字段只是一个数字。最好在代码中解析出来并将带注释的字符串写入数据库或为NetFlow数据报中的每个字段添加数据库字段。

解析很简单:您只需计算字节数并将其解释为整数或字符,具体取决于字段。

编辑:格式在这里:Cisco Flow Record formats它们列出字节偏移量,所以如果你想要dOctets(根据你所描述的那样),取有效载荷的字节20-24并将它们转换为整数

答案 1 :(得分:0)

您可以使用以下符号将无符号字节转换为和

public static int unsignedByteToInt(byte b) {
    return (int) b & 0xFF;
}

这将返回字节的Integer值。但是,您正在寻找字节[0-1]正确的值?你将总结这些值,这是一个非常快速(并且可能是这样做的可怕方式):

public static int unsignedByteToInt(byte[] b, int offset, int len) {
    int r = 0;
    for(int i = 0; i < len; i++){
        r += unsignedByteToInt(b[offset+i]);// the method shown earlier
    }
    return r;
}

给定一个DatagramPacket,您可以调用:

int version = unsignedByteToInt(receivedDatagramPacketPacket.getData(), 0,2);

以下是Strings的两种方法(顺便说一句,我没有测试过这些方法: - \):

public static String byteToHex(byte b){
    int i = b & 0xFF;
    return Integer.toHexString(i);
}

public static String byteToHex(byte[] b, int offset, int len){
    String r = "";
    for(int i = 0; i < len; i++){
        r += byteToHex(b[offset+i]);
    }
    return r;
}
祝你好运:)