package net.decix.jipfix.randomizer;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.util.List;
import net.decix.jipfix.header.DataRecord;
import net.decix.jipfix.header.L2IPDataRecord;
import net.decix.jipfix.header.MessageHeader;
import net.decix.jipfix.header.SetHeader;
import net.decix.randomizer.SimpleIPv4AddressRandomizer;
import net.decix.randomizer.SimpleIPv6AddressRandomizer;
import net.decix.util.HeaderParseException;
import net.decix.util.Utility;
import org.pcap4j.core.NotOpenException;
import org.pcap4j.core.PacketListener;
import org.pcap4j.core.PcapHandle;
import org.pcap4j.core.PcapNativeException;
import org.pcap4j.core.Pcaps;
import org.pcap4j.packet.Packet;
import org.pcap4j.packet.UdpPacket;
public class PCAPSimpleIPRandomizer {
private static final String PCAP_FILE_READ = "/Users/tking/Downloads/ipfix-all-routers-2014-12-18.pcap";
private static final String FILE_WRITE = "/Users/tking/Downloads/meta_simple.txt";
public static void main(String[] args) throws PcapNativeException, NotOpenException, InterruptedException, IOException {
final PcapHandle pcapHandleReadOffline = Pcaps.openOffline(PCAP_FILE_READ);
final FileWriter fw = new FileWriter(new File(FILE_WRITE));
PacketListener packetListener = new PacketListener() {
SimpleIPv4AddressRandomizer ipV4randomizer = new SimpleIPv4AddressRandomizer();
SimpleIPv6AddressRandomizer ipV6randomizer = new SimpleIPv6AddressRandomizer();
public void gotPacket(Packet fullPacket) {
long timestampInts = pcapHandleReadOffline.getTimestampInts();
int timestampMicros = pcapHandleReadOffline.getTimestampMicros();
UdpPacket udpPacket = fullPacket.get(UdpPacket.class);
fullPacket.getHeader();
if (udpPacket == null) return;
byte[] rawUpdPacketBytes = udpPacket.getRawData();
byte[] onlyIPFIXbytes = new byte[rawUpdPacketBytes.length - 8];
System.arraycopy(rawUpdPacketBytes, 8, onlyIPFIXbytes, 0, rawUpdPacketBytes.length - 8);
try {
MessageHeader messageHeader = MessageHeader.parse(onlyIPFIXbytes);
List<SetHeader> setHeaders = messageHeader.getSetHeaders();
for (SetHeader currentSetHeader : setHeaders) {
for (DataRecord currentDataRecord : currentSetHeader.getDataRecords()) {
try {
boolean foundIPv6 = false;
boolean foundIPv4 = false;
if (currentDataRecord instanceof L2IPDataRecord) {
L2IPDataRecord l2IPDataRecord = (L2IPDataRecord) currentDataRecord;
if (Utility.isConfigured(l2IPDataRecord.getSourceIPv4Address())) {
foundIPv4 = true;
}
if (Utility.isConfigured(l2IPDataRecord.getDestinationIPv4Address())) {
foundIPv4 = true;
}
if (Utility.isConfigured(l2IPDataRecord.getSourceIPv6Address())) {
foundIPv6 = true;
}
if (Utility.isConfigured(l2IPDataRecord.getDestinationIPv6Address())) {
foundIPv6 = true;
}
Inet4Address realDestinationIpv4 = l2IPDataRecord.getDestinationIPv4Address();
Inet4Address realSourceIpv4 = l2IPDataRecord.getSourceIPv4Address();
Inet6Address realDestinationIpv6 = l2IPDataRecord.getDestinationIPv6Address();
Inet6Address realSourceIpv6 = l2IPDataRecord.getSourceIPv6Address();
Inet4Address fakeDestinationIpv4 = null;
Inet4Address fakeSourceIpv4 = null;
Inet6Address fakeDestinationIpv6 = null;
Inet6Address fakeSourceIpv6 = null;
if (foundIPv4) {
fakeDestinationIpv4 = (Inet4Address) ipV4randomizer.randomize(realDestinationIpv4);
fakeSourceIpv4 = (Inet4Address) ipV4randomizer.randomize(realSourceIpv4);
fw.write(timestampInts + "." + timestampMicros + " " + fakeSourceIpv4.getHostAddress() + " " + fakeDestinationIpv4.getHostAddress() + " " + (l2IPDataRecord.getOctetDeltaCount()/l2IPDataRecord.getPacketDeltaCount()) + "\n");
}
if (foundIPv6) {
fakeSourceIpv6 = (Inet6Address) ipV6randomizer.randomize(realSourceIpv6);
fakeDestinationIpv6 = (Inet6Address) ipV6randomizer.randomize(realDestinationIpv6);
fw.write(timestampInts + "." + timestampMicros + " " + fakeSourceIpv6.getHostAddress() + " " + fakeDestinationIpv6.getHostAddress() + " " + (l2IPDataRecord.getOctetDeltaCount()/l2IPDataRecord.getPacketDeltaCount()) + "\n");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (HeaderParseException e) {
e.printStackTrace();
}
}
};
pcapHandleReadOffline.loop(-1, packetListener);
pcapHandleReadOffline.close();
fw.close();
}
}