Skip to content

Commit 1ed8ff6

Browse files
mikemiles-devmikemiles-dev
and
mikemiles-dev
authored
fix(Can now parse enterprise fields in non options templates for IPFIX.) (#107)
Co-authored-by: mikemiles-dev <[email protected]>
1 parent 02285a4 commit 1ed8ff6

14 files changed

+300
-22
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "netflow_parser"
33
description = "Parser for Netflow Cisco V5, V7, V9, IPFIX"
4-
version = "0.5.1"
4+
version = "0.5.2"
55
edition = "2021"
66
authors = ["[email protected]"]
77
license = "MIT OR Apache-2.0"

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ if let NetflowPacket::V5(v5) = NetflowParser::default()
150150

151151
Parse the data ('&[u8]' as any other versions. The parser (NetflowParser) holds onto already parsed templates, so you can just send a header/data flowset combo and it will use the cached templates.) To see cached templates simply use the parser for the correct version (v9_parser for v9, ipfix_parser for IPFix.)
152152

153+
**IPFIx Note:** We only parse sequence number and domain id, it is up to you if you wish to validate it.
154+
153155
```rust
154156
use netflow_parser::NetflowParser;
155157
let parser = NetflowParser::default();
@@ -178,3 +180,11 @@ or
178180
or
179181

180182
```cargo run --example netflow_udp_listener_tokio```
183+
184+
## Support My Work
185+
186+
If you find my work helpful, consider supporting me!
187+
188+
[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/michaelmileusnich)
189+
190+
[![GitHub Sponsors](https://img.shields.io/badge/sponsor-30363D?style=for-the-badge&logo=GitHub-Sponsors&logoColor=#EA4AAA)](https://github.com/sponsors/mikemiles-dev)

RELEASES.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# 0.5.2
2+
* Can now parse enterprise fields in non options templates for IPFIX.
3+
14
# 0.5.1
25
* Reworked NetflowParseError. Added a Partial Type.
36
* Added ability to parse only `allowed_versions`.

SECURITY.md

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,5 @@
44

55
| Version | Supported |
66
|---------| ------------------ |
7-
| 0.5.1 | :white_check_mark: |
8-
| 0.5.0 | :white_check_mark: |
9-
| 0.4.9 | :white_check_mark: |
10-
| 0.4.8 | :white_check_mark: |
11-
| 0.4.7 | :white_check_mark: |
12-
| 0.4.6 | :white_check_mark: |
13-
| 0.4.5 | :white_check_mark: |
14-
| 0.4.4 | :white_check_mark: |
15-
| 0.4.3 | :white_check_mark: |
16-
| 0.4.2 | :white_check_mark: |
7+
| >0.4.1 | :white_check_mark: |
178
| <0.4.1 | Not Supported |

src/lib.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,9 @@
150150
//! ## V9/IPFix notes:
151151
//!
152152
//! Parse the data (`&[u8]` as any other versions. The parser (NetflowParser) holds onto already parsed templates, so you can just send a header/data flowset combo, and it will use the cached templates.) To see cached templates simply use the parser for the correct version (v9_parser for v9, ipfix_parser for IPFix.)
153+
//!
154+
//! **IPFIx Note:** We only parse sequence number and domain id, it is up to you if you wish to validate it.
155+
//!
153156
//! ```rust
154157
//! use netflow_parser::NetflowParser;
155158
//! let parser = NetflowParser::default();
@@ -176,6 +179,14 @@
176179
//! or
177180
//!
178181
//! ```cargo run --example netflow_udp_listener_tokio```
182+
//!
183+
//! ## Support My Work
184+
//!
185+
//! If you find my work helpful, consider supporting me!
186+
//!
187+
//! [![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/michaelmileusnich)
188+
//!
189+
//! [![GitHub Sponsors](https://img.shields.io/badge/sponsor-30363D?style=for-the-badge&logo=GitHub-Sponsors&logoColor=#EA4AAA)](https://github.com/sponsors/mikemiles-dev)
179190
180191
pub mod netflow_common;
181192
pub mod protocol;

src/snapshots/netflow_parser__tests__base_tests__it_doesnt_parse_0_length_fields_ipfix.snap

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,4 +103,3 @@ expression: "NetflowParser::default().parse_bytes(&packet)"
103103
- 2
104104
- 3
105105
- 4
106-
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
---
2+
source: src/tests.rs
3+
expression: "NetflowParser::default().parse_bytes(&packet)"
4+
---
5+
- IPFix:
6+
header:
7+
version: 10
8+
length: 42
9+
export_time: 1670052913
10+
sequence_number: 0
11+
observation_domain_id: 0
12+
flowsets:
13+
- header:
14+
header_id: 2
15+
length: 26
16+
body:
17+
templates:
18+
template_id: 260
19+
field_count: 2
20+
fields:
21+
- field_type_number: 32871
22+
field_type: Unknown
23+
field_length: 65535
24+
enterprise_number: 407732327
25+
- field_type_number: 65535
26+
field_type: Unknown
27+
field_length: 0
28+
enterprise_number: 407732544
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
---
2+
source: src/tests.rs
3+
expression: result
4+
---
5+
- IPFix:
6+
header:
7+
version: 10
8+
length: 116
9+
export_time: 1480450135
10+
sequence_number: 3791
11+
observation_domain_id: 0
12+
flowsets:
13+
- header:
14+
header_id: 2
15+
length: 100
16+
body:
17+
templates:
18+
template_id: 307
19+
field_count: 23
20+
fields:
21+
- field_type_number: 8
22+
field_type: SourceIpv4address
23+
field_length: 4
24+
- field_type_number: 12
25+
field_type: DestinationIpv4address
26+
field_length: 4
27+
- field_type_number: 5
28+
field_type: IpClassOfService
29+
field_length: 1
30+
- field_type_number: 4
31+
field_type: ProtocolIdentifier
32+
field_length: 1
33+
- field_type_number: 7
34+
field_type: SourceTransportPort
35+
field_length: 2
36+
- field_type_number: 11
37+
field_type: DestinationTransportPort
38+
field_length: 2
39+
- field_type_number: 32
40+
field_type: IcmpTypeCodeIpv4
41+
field_length: 2
42+
- field_type_number: 10
43+
field_type: IngressInterface
44+
field_length: 4
45+
- field_type_number: 16
46+
field_type: BgpSourceAsNumber
47+
field_length: 4
48+
- field_type_number: 17
49+
field_type: BgpDestinationAsNumber
50+
field_length: 4
51+
- field_type_number: 18
52+
field_type: BgpNextHopIpv4address
53+
field_length: 4
54+
- field_type_number: 14
55+
field_type: EgressInterface
56+
field_length: 4
57+
- field_type_number: 1
58+
field_type: OctetDeltaCount
59+
field_length: 4
60+
- field_type_number: 2
61+
field_type: PacketDeltaCount
62+
field_length: 4
63+
- field_type_number: 22
64+
field_type: FlowStartSysUpTime
65+
field_length: 4
66+
- field_type_number: 21
67+
field_type: FlowEndSysUpTime
68+
field_length: 4
69+
- field_type_number: 15
70+
field_type: IpNextHopIpv4address
71+
field_length: 4
72+
- field_type_number: 9
73+
field_type: SourceIpv4prefixLength
74+
field_length: 1
75+
- field_type_number: 13
76+
field_type: DestinationIpv4prefixLength
77+
field_length: 1
78+
- field_type_number: 6
79+
field_type: TcpControlBits
80+
field_length: 1
81+
- field_type_number: 60
82+
field_type: IpVersion
83+
field_length: 1
84+
- field_type_number: 152
85+
field_type: FlowStartMilliseconds
86+
field_length: 8
87+
- field_type_number: 153
88+
field_type: FlowEndMilliseconds
89+
field_length: 8
90+
- IPFix:
91+
header:
92+
version: 10
93+
length: 96
94+
export_time: 1480450137
95+
sequence_number: 3812
96+
observation_domain_id: 0
97+
flowsets:
98+
- header:
99+
header_id: 307
100+
length: 80
101+
body:
102+
data:
103+
data_fields:
104+
- 0:
105+
- SourceIpv4address
106+
- Ip4Addr: 70.1.115.1
107+
1:
108+
- DestinationIpv4address
109+
- Ip4Addr: 50.0.71.1
110+
2:
111+
- IpClassOfService
112+
- DataNumber: 0
113+
3:
114+
- ProtocolIdentifier
115+
- DataNumber: 61
116+
4:
117+
- SourceTransportPort
118+
- DataNumber: 0
119+
5:
120+
- DestinationTransportPort
121+
- DataNumber: 0
122+
6:
123+
- IcmpTypeCodeIpv4
124+
- DataNumber: 0
125+
7:
126+
- IngressInterface
127+
- DataNumber: 827
128+
8:
129+
- BgpSourceAsNumber
130+
- DataNumber: 2
131+
9:
132+
- BgpDestinationAsNumber
133+
- DataNumber: 3
134+
10:
135+
- BgpNextHopIpv4address
136+
- Ip4Addr: 204.42.110.101
137+
11:
138+
- EgressInterface
139+
- DataNumber: 854
140+
12:
141+
- OctetDeltaCount
142+
- DataNumber: 1312
143+
13:
144+
- PacketDeltaCount
145+
- DataNumber: 9
146+
14:
147+
- FlowStartSysUpTime
148+
- DataNumber: 3019441902
149+
15:
150+
- FlowEndSysUpTime
151+
- DataNumber: 3019616060
152+
16:
153+
- IpNextHopIpv4address
154+
- Ip4Addr: 204.42.110.189
155+
17:
156+
- SourceIpv4prefixLength
157+
- DataNumber: 24
158+
18:
159+
- DestinationIpv4prefixLength
160+
- DataNumber: 24
161+
19:
162+
- TcpControlBits
163+
- DataNumber: 0
164+
20:
165+
- IpVersion
166+
- DataNumber: 4
167+
21:
168+
- FlowStartMilliseconds
169+
- Duration:
170+
secs: 1480449931
171+
nanos: 519000000
172+
22:
173+
- FlowEndMilliseconds
174+
- Duration:
175+
secs: 1480450105
176+
nanos: 677000000
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
---
2+
source: src/tests.rs
3+
expression: result
4+
---
5+
- IPFix:
6+
header:
7+
version: 10
8+
length: 40
9+
export_time: 1480450135
10+
sequence_number: 3791
11+
observation_domain_id: 0
12+
flowsets:
13+
- header:
14+
header_id: 3
15+
length: 24
16+
body:
17+
options_templates:
18+
template_id: 308
19+
field_count: 3
20+
scope_field_count: 1
21+
fields:
22+
- field_type_number: 32773
23+
field_type: IpClassOfService
24+
field_length: 2
25+
- field_type_number: 32804
26+
field_type: FlowActiveTimeout
27+
field_length: 2
28+
- field_type_number: 32805
29+
field_type: FlowIdleTimeout
30+
field_length: 2

src/snapshots/netflow_parser__tests__base_tests__it_parses_ipfix_with_no_template_fields_raises_error.snap

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,3 @@ expression: parser.parse_bytes(&packet)
5959
- 0
6060
- 1
6161
- 1
62-

src/snapshots/netflow_parser__tests__base_tests__it_parses_v5_incomplete.snap

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,3 @@ expression: "NetflowParser::default().parse_bytes(&packet)"
2323
- 1
2424
- 1
2525
- 1
26-

src/tests.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,4 +405,35 @@ mod base_tests {
405405
];
406406
assert_yaml_snapshot!(NetflowParser::default().parse_bytes(&packet));
407407
}
408+
409+
#[test]
410+
fn it_parses_ipfix_enterprise_bit_in_non_options_template() {
411+
let packet = [
412+
0, 10, 0, 42, 99, 138, 252, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 26, 1, 4, 0, 2,
413+
128, 103, 255, 255, 24, 77, 128, 103, 255, 255, 0, 0, 24, 77, 129, 64, 0, 4, 0, 0,
414+
24, 77,
415+
];
416+
assert_yaml_snapshot!(NetflowParser::default().parse_bytes(&packet));
417+
}
418+
419+
#[test]
420+
fn it_parses_ipfix_scappy_example() {
421+
let hex_template = r#"000a0074583de05700000ecf00000000000200640133001700080004000c0004000500010004000100070002000b000200200002000a0004001000040011000400120004000e000400010004000200040016000400150004000f000400090001000d000100060001003c00010098000800990008"#;
422+
let packet = hex::decode(hex_template).unwrap();
423+
let mut parser = NetflowParser::default();
424+
let mut result = parser.parse_bytes(&packet);
425+
let hex_data = r#"000a0060583de05900000ee400000000013300504601730132004701003d0000000000000000033b0000000200000003cc2a6e65000003560000052000000009b3f906eeb3fbaf3ccc2a6ebd1818000400000158b1b138ff00000158b1b3e14d"#;
426+
let packet = hex::decode(hex_data).unwrap();
427+
result.append(&mut parser.parse_bytes(&packet));
428+
assert_yaml_snapshot!(result);
429+
}
430+
431+
#[test]
432+
fn it_parses_ipfix_scappy_example_options_template() {
433+
let hex_template = r#"000a0028583de05700000ecf00000000000300180134000300010005000200240002002500020000"#;
434+
let packet = hex::decode(hex_template).unwrap();
435+
let mut parser = NetflowParser::default();
436+
let result = parser.parse_bytes(&packet);
437+
assert_yaml_snapshot!(result);
438+
}
408439
}

0 commit comments

Comments
 (0)