Skip to content

Commit b3869bc

Browse files
committed
Implement nokia NAT logging. See #533
1 parent f0a5f6f commit b3869bc

19 files changed

+3704
-3570
lines changed

man/nfdump.1

+8
Original file line numberDiff line numberDiff line change
@@ -1853,6 +1853,14 @@ NAT pool block end
18531853
NAT pool block step
18541854
.It Cm %pbsize
18551855
NAT pool block size
1856+
.It Cm %flid
1857+
Flow ID
1858+
.It Cm %isid
1859+
Nokia NAT in service ID
1860+
.It Cm %osid
1861+
Nokia NAT out service ID
1862+
.It Cm %nats
1863+
Nokia NAT string
18561864
.Pp
18571865
.It Nprobe formats
18581866
.It Cm %cl

src/inline/nffile_inline.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ static inline int MapRecordHandle(recordHandle_t *handle, recordHeaderV3_t *reco
7373
if (nselCommon) {
7474
genericFlow->msecFirst = nselCommon->msecEvent;
7575
} else {
76-
EXnelCommon_t *nelCommon = (EXnelCommon_t *)handle->extensionList[EXnelCommonID];
77-
if (nelCommon) genericFlow->msecFirst = nelCommon->msecEvent;
76+
EXnatCommon_t *natCommon = (EXnatCommon_t *)handle->extensionList[EXnatCommonID];
77+
if (natCommon) genericFlow->msecFirst = natCommon->msecEvent;
7878
}
7979
}
8080
return 1;

src/libnfdump/filter/grammar.y

+2-2
Original file line numberDiff line numberDiff line change
@@ -1170,7 +1170,7 @@ static int AddNATString(char *event, char *natStr) {
11701170
natEventInfo();
11711171
return -1;
11721172
}
1173-
return NewElement(EXnelCommonID, OFFnatEvent, SIZEnatEvent, eventNum, CMP_EQ, FUNC_NONE, NULLPtr);
1173+
return NewElement(EXnatCommonID, OFFnatEvent, SIZEnatEvent, eventNum, CMP_EQ, FUNC_NONE, NULLPtr);
11741174
}
11751175

11761176
yyerror("Invalid NAT type: %s", event);
@@ -1185,7 +1185,7 @@ static int AddNAT(char *event, uint16_t comp, uint64_t number) {
11851185
yyerror("NAT event: %llu out of range\n", number);
11861186
return -1;
11871187
}
1188-
return NewElement(EXnelCommonID, OFFnatEvent, SIZEnatEvent, number, comp, FUNC_NONE, NULLPtr);
1188+
return NewElement(EXnatCommonID, OFFnatEvent, SIZEnatEvent, number, comp, FUNC_NONE, NULLPtr);
11891189
}
11901190

11911191
return -1;

src/libnffile/conf/nfdump.conf.dist

+6-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,12 @@
2222
# define any new format
2323
# fmt.newformat = "%ts ...."
2424
fmt.geolong = "%ts %td %pr %sc %gsap -> %dc %gdap %flg %pkt %byt %fl"
25-
fmt.pfline = "fmt:%ts %pfact %pfrea %pfdir on %pfifn %pfrule %pr %sap -> %dap %pkt %byt"
25+
26+
# Nokia NAT
27+
fmt.nokia = "%ts %te %flid %pr %sap -> %dap %isid %osid %nats"
28+
29+
# OpenBSD pf logs
30+
fmt.pflog = "%ts %pfact %pfrea %pfdir on %pfifn %pfrule %pr %sap -> %dap %pkt %byt"
2631

2732
# geodb
2833
# if you use maxmind DB to geo-locate IPs - see geolookup(1)

src/libnffile/nfxV3.h

+48-33
Original file line numberDiff line numberDiff line change
@@ -481,35 +481,22 @@ typedef struct EXnselUser_s {
481481
} EXnselUser_t;
482482
#define EXnselUserSize (sizeof(EXnselUser_t) + sizeof(elementHeader_t))
483483

484-
// NEL
485-
typedef struct EXnelCommon_s {
486-
#define EXnelCommonID 25
484+
// NAT event logging
485+
typedef struct EXnatCommon_s {
486+
#define EXnatCommonID 25
487487
uint64_t msecEvent; // NF_F_EVENT_TIME_MSEC(323)
488488
uint32_t natPoolID; // NF_N_NATPOOL_ID(283)
489489
uint8_t natEvent; // NAT_EVENT(230)
490490
uint8_t fill1;
491491
uint16_t fill2;
492-
#define OFFnelMsecEvent offsetof(EXnelCommon_t, msecEvent)
493-
#define SIZEnelMsecEvent MemberSize(EXnelCommon_t, msecEvent)
494-
#define OFFnatPoolID offsetof(EXnelCommon_t, natPoolID)
495-
#define SIZEnatPoolID MemberSize(EXnelCommon_t, natPoolID)
496-
#define OFFnatEvent offsetof(EXnelCommon_t, natEvent)
497-
#define SIZEnatEvent MemberSize(EXnelCommon_t, natEvent)
498-
} EXnelCommon_t;
499-
#define EXnelCommonSize (sizeof(EXnelCommon_t) + sizeof(elementHeader_t))
500-
501-
// comapt record includes vrf fields
502-
// no longer used, but old data may exist
503-
typedef struct EXnelCommonCompat_s {
504-
uint64_t msecEvent; // NF_F_EVENT_TIME_MSEC(323)
505-
uint32_t egressVrf; // NF_N_EGRESS_VRFID(235)
506-
uint32_t ingressVrf; // NF_N_INGRESS_VRFID(234)
507-
uint32_t natPoolID; // NF_N_NATPOOL_ID(283)
508-
uint8_t natEvent; // NAT_EVENT(230)
509-
uint8_t fill1;
510-
uint16_t fill2;
511-
} EXnelCommonCompat_t;
512-
#define EXnelCommonCompatSize (sizeof(EXnelCommonCompat_t) + sizeof(elementHeader_t))
492+
#define OFFnelMsecEvent offsetof(EXnatCommon_t, msecEvent)
493+
#define SIZEnelMsecEvent MemberSize(EXnatCommon_t, msecEvent)
494+
#define OFFnatPoolID offsetof(EXnatCommon_t, natPoolID)
495+
#define SIZEnatPoolID MemberSize(EXnatCommon_t, natPoolID)
496+
#define OFFnatEvent offsetof(EXnatCommon_t, natEvent)
497+
#define SIZEnatEvent MemberSize(EXnatCommon_t, natEvent)
498+
} EXnatCommon_t;
499+
#define EXnatCommonSize (sizeof(EXnatCommon_t) + sizeof(elementHeader_t))
513500

514501
typedef struct EXnatPortBlock_s {
515502
#define EXnatPortBlockID 26
@@ -672,8 +659,35 @@ typedef struct EXlayer2_s {
672659
} EXlayer2_t;
673660
#define EXlayer2Size (sizeof(EXlayer2_t) + sizeof(elementHeader_t))
674661

662+
typedef struct EXflowId_s {
663+
#define EXflowIdID 39
664+
uint64_t flowId; // IPFIX_flowId
665+
#define OFFflowId offsetof(EXflowId_t, flowId)
666+
#define SIZEflowId MemberSize(EXflowId_t, flowId)
667+
} EXflowId_t;
668+
#define EXflowIdSize (sizeof(EXflowId_t) + sizeof(elementHeader_t))
669+
670+
typedef struct EXnokiaNat_s {
671+
#define EXnokiaNatID 40
672+
uint16_t inServiceID;
673+
uint16_t outServiceID;
674+
#define OFFinServiceID offsetof(EXnokiaNat_t, inServiceID)
675+
#define SIZEinServiceID MemberSize(EXnokiaNat_t, inServiceID)
676+
#define OFFoutServiceID offsetof(EXnokiaNat_t, outServiceID)
677+
#define SIZEoutServiceID MemberSize(EXnokiaNat_t, outServiceID)
678+
} EXnokiaNat_t;
679+
#define EXnokiaNatSize (sizeof(EXnokiaNat_t) + sizeof(elementHeader_t))
680+
681+
typedef struct EXnokiaNatString_s {
682+
#define EXnokiaNatStringID 41
683+
char natSubString[4];
684+
#define OFFnatSubString offsetof(EXnokiaNatString_t, natSubString)
685+
#define SIZEnatSubString VARLENGTH
686+
} EXnokiaNatString_t;
687+
#define EXnokiaNatStringSize (sizeof(EXnokiaNatString_t) + sizeof(elementHeader_t))
688+
675689
// max possible elements
676-
#define MAXEXTENSIONS 39
690+
#define MAXEXTENSIONS 42
677691

678692
// push a fixed length extension to the v3 record
679693
// h v3 record header
@@ -734,14 +748,15 @@ static const struct extensionTable_s {
734748
uint32_t size; // number of bytes incl. header, 0xFFFF for dyn length
735749
char *name; // name of extension
736750
} extensionTable[] = {
737-
{0, 0, "ExNull"}, EXTENSION(EXgenericFlow), EXTENSION(EXipv4Flow), EXTENSION(EXipv6Flow), EXTENSION(EXflowMisc),
738-
EXTENSION(EXcntFlow), EXTENSION(EXvLan), EXTENSION(EXasRouting), EXTENSION(EXbgpNextHopV4), EXTENSION(EXbgpNextHopV6),
739-
EXTENSION(EXipNextHopV4), EXTENSION(EXipNextHopV6), EXTENSION(EXipReceivedV4), EXTENSION(EXipReceivedV6), EXTENSION(EXmplsLabel),
740-
EXTENSION(EXmacAddr), EXTENSION(EXasAdjacent), EXTENSION(EXlatency), EXTENSION(EXsamplerInfo), EXTENSION(EXnselCommon),
741-
EXTENSION(EXnatXlateIPv4), EXTENSION(EXnatXlateIPv6), EXTENSION(EXnatXlatePort), EXTENSION(EXnselAcl), EXTENSION(EXnselUser),
742-
EXTENSION(EXnelCommon), EXTENSION(EXnatPortBlock), EXTENSION(EXnbarApp), EXTENSION(EXlabel), EXTENSION(EXinPayload),
743-
EXTENSION(EXoutPayload), EXTENSION(EXtunIPv4), EXTENSION(EXtunIPv6), EXTENSION(EXobservation), EXTENSION(EXinmonMeta),
744-
EXTENSION(EXinmonFrame), EXTENSION(EXvrf), EXTENSION(EXpfinfo), EXTENSION(EXlayer2)};
751+
{0, 0, "EXnull"}, EXTENSION(EXgenericFlow), EXTENSION(EXipv4Flow), EXTENSION(EXipv6Flow), EXTENSION(EXflowMisc),
752+
EXTENSION(EXcntFlow), EXTENSION(EXvLan), EXTENSION(EXasRouting), EXTENSION(EXbgpNextHopV4), EXTENSION(EXbgpNextHopV6),
753+
EXTENSION(EXipNextHopV4), EXTENSION(EXipNextHopV6), EXTENSION(EXipReceivedV4), EXTENSION(EXipReceivedV6), EXTENSION(EXmplsLabel),
754+
EXTENSION(EXmacAddr), EXTENSION(EXasAdjacent), EXTENSION(EXlatency), EXTENSION(EXsamplerInfo), EXTENSION(EXnselCommon),
755+
EXTENSION(EXnatXlateIPv4), EXTENSION(EXnatXlateIPv6), EXTENSION(EXnatXlatePort), EXTENSION(EXnselAcl), EXTENSION(EXnselUser),
756+
EXTENSION(EXnatCommon), EXTENSION(EXnatPortBlock), EXTENSION(EXnbarApp), EXTENSION(EXlabel), EXTENSION(EXinPayload),
757+
EXTENSION(EXoutPayload), EXTENSION(EXtunIPv4), EXTENSION(EXtunIPv6), EXTENSION(EXobservation), EXTENSION(EXinmonMeta),
758+
EXTENSION(EXinmonFrame), EXTENSION(EXvrf), EXTENSION(EXpfinfo), EXTENSION(EXlayer2), EXTENSION(EXflowId),
759+
EXTENSION(EXnokiaNat), EXTENSION(EXnokiaNatString)};
745760

746761
typedef struct record_map_s {
747762
recordHeaderV3_t *recordHeader;

src/libnffile/vcs_track.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
#define __VCS_TRACK_H__
33
//THIS FILE IS AUTO GENERATED
44
//DO NOT TRACK THIS FILE WITH THE VCS
5-
#define VCS_TRACK_DATE "2024-06-01 15:41:05 +0200"
6-
#define VCS_TRACK_HASH "1619a60"
5+
#define VCS_TRACK_DATE "2024-06-02 11:22:32 +0200"
6+
#define VCS_TRACK_HASH "f0a5f6f"
77
#endif

src/netflow/ipfix.c

+11-5
Original file line numberDiff line numberDiff line change
@@ -221,14 +221,15 @@ static const struct ipfixTranslationMap_s {
221221
{IPFIX_INGRESS_VRFID, SIZEingressVrf, NumberCopy, EXvrfID, OFFingressVrf, STACK_NONE, "ingress VRF ID"},
222222
{IPFIX_EGRESS_VRFID, SIZEegressVrf, NumberCopy, EXvrfID, OFFegressVrf, STACK_NONE, "egress VRF ID"},
223223
// NAT
224-
{IPFIX_observationTimeMilliseconds, SIZEmsecEvent, NumberCopy, EXnelCommonID, OFFmsecEvent, STACK_MSEC, "msec time event"},
225-
{IPFIX_natEvent, SIZEnatEvent, NumberCopy, EXnelCommonID, OFFnatEvent, STACK_NONE, "NAT event"},
224+
{IPFIX_observationTimeMilliseconds, SIZEmsecEvent, NumberCopy, EXnatCommonID, OFFmsecEvent, STACK_MSEC, "msec time event"},
225+
{IPFIX_natEvent, SIZEnatEvent, NumberCopy, EXnatCommonID, OFFnatEvent, STACK_NONE, "NAT event"},
226226
{IPFIX_postNATSourceIPv4Address, SIZExlateSrc4Addr, NumberCopy, EXnatXlateIPv4ID, OFFxlateSrc4Addr, STACK_NONE, "xlate src addr"},
227227
{IPFIX_postNATDestinationIPv4Address, SIZExlateDst4Addr, NumberCopy, EXnatXlateIPv4ID, OFFxlateDst4Addr, STACK_NONE, "xlate dst addr"},
228228
{IPFIX_postNAPTSourceTransportPort, SIZExlateSrcPort, NumberCopy, EXnatXlatePortID, OFFxlateSrcPort, STACK_NONE, "xlate src port"},
229229
{IPFIX_postNAPTDestinationTransportPort, SIZExlateDstPort, NumberCopy, EXnatXlatePortID, OFFxlateDstPort, STACK_NONE, "xlate dst port"},
230+
{IPFIX_flowId, SIZEflowId, NumberCopy, EXflowIdID, OFFflowId, STACK_NONE, "flow ID"},
230231
// cgNAT
231-
{IPFIX_NATPOOL_ID, SIZEnatPoolID, NumberCopy, EXnelCommonID, OFFnatPoolID, STACK_NONE, "nat pool ID"},
232+
{IPFIX_NATPOOL_ID, SIZEnatPoolID, NumberCopy, EXnatCommonID, OFFnatPoolID, STACK_NONE, "nat pool ID"},
232233
{IPFIX_PORT_BLOCK_START, SIZEnelblockStart, NumberCopy, EXnatPortBlockID, OFFnelblockStart, STACK_NONE, "NAT block start"},
233234
{IPFIX_PORT_BLOCK_END, SIZEnelblockEnd, NumberCopy, EXnatPortBlockID, OFFnelblockEnd, STACK_NONE, "NAT block end"},
234235
{IPFIX_PORT_BLOCK_STEP, SIZEnelblockStep, NumberCopy, EXnatPortBlockID, OFFnelblockStep, STACK_NONE, "NAT block step"},
@@ -239,8 +240,13 @@ static const struct ipfixTranslationMap_s {
239240
{IPFIX_dataLinkFrameSection, SIZEpacket, ByteCopy, EXinmonFrameID, OFFpacket, STACK_NONE, "inmon packet content"},
240241

241242
// payload
242-
{LOCAL_inPayload, VARLENGTH, NumberCopy, EXinPayloadID, 0, STACK_NONE, "in payload"},
243-
{LOCAL_outPayload, VARLENGTH, NumberCopy, EXoutPayloadID, 0, STACK_NONE, "out payload"},
243+
{LOCAL_inPayload, VARLENGTH, ByteCopy, EXinPayloadID, 0, STACK_NONE, "in payload"},
244+
{LOCAL_outPayload, VARLENGTH, ByteCopy, EXoutPayloadID, 0, STACK_NONE, "out payload"},
245+
246+
// Nokia
247+
{NOKIA_InsideServiceId, SIZEinServiceID, NumberCopy, EXnokiaNatID, OFFinServiceID, STACK_NONE, "Nokia inside service ID"},
248+
{NOKIA_OutsideServiceId, SIZEoutServiceID, NumberCopy, EXnokiaNatID, OFFoutServiceID, STACK_NONE, "Nokia outside service ID"},
249+
{NOKIA_NatSubString, SIZEnatSubString, ByteCopy, EXnokiaNatStringID, OFFnatSubString, STACK_NONE, "Nokia nat substring"},
244250

245251
// End of table
246252
{0, 0, 0, 0, 0, STACK_NONE, NULL},

src/netflow/ipfix.h

+1
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@ typedef struct ipfix_template_elements_e_s {
277277
#define IPFIX_flowEndReason 136
278278
#define IPFIX_observationPointId 138
279279
#define IPFIX_icmpTypeCodeIPv6 139
280+
#define IPFIX_flowId 148
280281
#define IPFIX_observationDomainId 149
281282
#define IPFIX_flowStartSeconds 150
282283
#define IPFIX_flowEndSeconds 151

src/netflow/netflow_v9.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,8 @@ static const struct v9TranslationMap_s {
235235
{NF_N_EGRESS_VRFID, SIZEegressVrf, NumberCopy, EXvrfID, OFFegressVrf, STACK_NONE, "egress VRF ID"},
236236

237237
// NEL
238-
{NF_N_NAT_EVENT, SIZEnatEvent, NumberCopy, EXnelCommonID, OFFnatEvent, STACK_NONE, "NAT event"},
239-
{NF_N_NATPOOL_ID, SIZEnatPoolID, NumberCopy, EXnelCommonID, OFFnatPoolID, STACK_NONE, "nat pool ID"},
238+
{NF_N_NAT_EVENT, SIZEnatEvent, NumberCopy, EXnatCommonID, OFFnatEvent, STACK_NONE, "NAT event"},
239+
{NF_N_NATPOOL_ID, SIZEnatPoolID, NumberCopy, EXnatCommonID, OFFnatPoolID, STACK_NONE, "nat pool ID"},
240240
{NF_F_XLATE_PORT_BLOCK_START, SIZEnelblockStart, NumberCopy, EXnatPortBlockID, OFFnelblockStart, STACK_NONE, "NAT block start"},
241241
{NF_F_XLATE_PORT_BLOCK_END, SIZEnelblockEnd, NumberCopy, EXnatPortBlockID, OFFnelblockEnd, STACK_NONE, "NAT block end"},
242242
{NF_F_XLATE_PORT_BLOCK_STEP, SIZEnelblockStep, NumberCopy, EXnatPortBlockID, OFFnelblockStep, STACK_NONE, "NAT block step"},
@@ -1267,9 +1267,9 @@ static inline void Process_v9_data(exporterDomain_t *exporter, void *data_flowse
12671267
}
12681268
SetFlag(recordHeaderV3->flags, V3_FLAG_EVENT);
12691269
}
1270-
EXnelCommon_t *nelCommon = sequencer->offsetCache[EXnelCommonID];
1271-
if (nelCommon) {
1272-
nelCommon->msecEvent = stack[STACK_MSEC];
1270+
EXnatCommon_t *natCommon = sequencer->offsetCache[EXnatCommonID];
1271+
if (natCommon) {
1272+
natCommon->msecEvent = stack[STACK_MSEC];
12731273
if (genericFlow) {
12741274
genericFlow->msecFirst = stack[STACK_MSEC];
12751275
genericFlow->msecLast = stack[STACK_MSEC];

src/nfdump/compat_1_6_x/convert.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -386,8 +386,8 @@ static inline int ConvertRecordV2(common_record_t *commonRecord, dataBlock_t *da
386386
} break;
387387
case EX_NEL_COMMON: {
388388
tpl_ext_46_t *tpl = (tpl_ext_46_t *)p;
389-
PushExtension(recordHeader, EXnelCommon, nelCommon);
390-
nelCommon->natEvent = tpl->nat_event;
389+
PushExtension(recordHeader, EXnatCommon, natCommon);
390+
natCommon->natEvent = tpl->nat_event;
391391
PushExtension(recordHeader, EXvrf, vrf);
392392
vrf->egressVrf = tpl->egress_vrfid;
393393
vrf->ingressVrf = tpl->ingress_vrfid;

src/nfdump/nfstat.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ static struct StatParameter_s {
197197
{"opid", "Obs PointID", {EXobservationID, OFFpointID, SIZEpointID, 0}, IS_HEXNUMBER, NULL},
198198
{"event", " Event", {EXnselCommonID, OFFfwEvent, SIZEfwEvent, 0}, IS_EVENT, NULL},
199199
{"xevent", " Event", {EXnselCommonID, OFFfwXevent, SIZEfwXevent, 0}, IS_NUMBER, NULL},
200-
{"nat", "NAT Event", {EXnelCommonID, OFFnatEvent, SIZEnatEvent, 0}, IS_EVENT, NULL},
200+
{"nat", "NAT Event", {EXnatCommonID, OFFnatEvent, SIZEnatEvent, 0}, IS_EVENT, NULL},
201201
{"xsrcip", "X-Src IP Addr", {EXnatXlateIPv4ID, OFFxlateSrc4Addr, SIZExlateSrc4Addr, AF_INET}, IS_IPADDR, NULL},
202202
{"xsrcip", NULL, {EXnatXlateIPv6ID, OFFxlateSrc6Addr, SIZExlateSrc6Addr, AF_INET6}, IS_IPADDR, NULL},
203203
{"xdstip", "X-Dst IP Addr", {EXnatXlateIPv4ID, OFFxlateDst4Addr, SIZExlateDst4Addr, AF_INET}, IS_IPADDR, NULL},

0 commit comments

Comments
 (0)