|
1 | | -use crate::networking::types::ip_collection::IpCollection; |
| 1 | +use ipnet::IpNet; |
2 | 2 | use std::net::IpAddr; |
3 | 3 |
|
4 | 4 | pub struct Bogon { |
5 | | - pub range: IpCollection, |
| 5 | + pub ranges: Vec<IpNet>, |
6 | 6 | pub description: &'static str, |
7 | 7 | } |
8 | 8 |
|
9 | 9 | // IPv4 bogons |
10 | 10 |
|
11 | 11 | static THIS_NETWORK: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
12 | | - range: IpCollection::new("0.0.0.0-0.255.255.255").unwrap(), |
| 12 | + ranges: vec!["0.0.0.0/8".parse().unwrap()], |
13 | 13 | description: "\"this\" network", |
14 | 14 | }); |
15 | 15 |
|
16 | 16 | static PRIVATE_USE: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
17 | | - range: IpCollection::new( |
18 | | - "10.0.0.0-10.255.255.255, 172.16.0.0-172.31.255.255, 192.168.0.0-192.168.255.255", |
19 | | - ) |
20 | | - .unwrap(), |
| 17 | + ranges: vec![ |
| 18 | + "10.0.0.0/8".parse().unwrap(), |
| 19 | + "172.16.0.0/12".parse().unwrap(), |
| 20 | + "192.168.0.0/16".parse().unwrap(), |
| 21 | + ], |
21 | 22 | description: "private-use", |
22 | 23 | }); |
23 | 24 |
|
24 | 25 | static CARRIER_GRADE: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
25 | | - range: IpCollection::new("100.64.0.0-100.127.255.255").unwrap(), |
| 26 | + ranges: vec!["100.64.0.0/10".parse().unwrap()], |
26 | 27 | description: "carrier-grade NAT", |
27 | 28 | }); |
28 | 29 |
|
29 | 30 | static LOOPBACK: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
30 | | - range: IpCollection::new("127.0.0.0-127.255.255.255").unwrap(), |
| 31 | + ranges: vec!["127.0.0.0/8".parse().unwrap()], |
31 | 32 | description: "loopback", |
32 | 33 | }); |
33 | 34 |
|
34 | 35 | static LINK_LOCAL: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
35 | | - range: IpCollection::new("169.254.0.0-169.254.255.255").unwrap(), |
| 36 | + ranges: vec!["169.254.0.0/16".parse().unwrap()], |
36 | 37 | description: "link local", |
37 | 38 | }); |
38 | 39 |
|
39 | 40 | static IETF_PROTOCOL: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
40 | | - range: IpCollection::new("192.0.0.0-192.0.0.255").unwrap(), |
| 41 | + ranges: vec!["192.0.0.0/24".parse().unwrap()], |
41 | 42 | description: "IETF protocol assignments", |
42 | 43 | }); |
43 | 44 |
|
44 | 45 | static TEST_NET_1: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
45 | | - range: IpCollection::new("192.0.2.0-192.0.2.255").unwrap(), |
| 46 | + ranges: vec!["192.0.2.0/24".parse().unwrap()], |
46 | 47 | description: "TEST-NET-1", |
47 | 48 | }); |
48 | 49 |
|
49 | 50 | static NETWORK_INTERCONNECT: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
50 | | - range: IpCollection::new("198.18.0.0-198.19.255.255").unwrap(), |
| 51 | + ranges: vec!["198.18.0.0/15".parse().unwrap()], |
51 | 52 | description: "network interconnect device benchmark testing", |
52 | 53 | }); |
53 | 54 |
|
54 | 55 | static TEST_NET_2: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
55 | | - range: IpCollection::new("198.51.100.0-198.51.100.255").unwrap(), |
| 56 | + ranges: vec!["198.51.100.0/24".parse().unwrap()], |
56 | 57 | description: "TEST-NET-2", |
57 | 58 | }); |
58 | 59 |
|
59 | 60 | static TEST_NET_3: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
60 | | - range: IpCollection::new("203.0.113.0-203.0.113.255").unwrap(), |
| 61 | + ranges: vec!["203.0.113.0/24".parse().unwrap()], |
61 | 62 | description: "TEST-NET-3", |
62 | 63 | }); |
63 | 64 |
|
64 | 65 | static MULTICAST: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
65 | | - range: IpCollection::new("224.0.0.0-239.255.255.255").unwrap(), |
| 66 | + ranges: vec!["224.0.0.0/4".parse().unwrap()], |
66 | 67 | description: "multicast", |
67 | 68 | }); |
68 | 69 |
|
69 | 70 | static FUTURE_USE: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
70 | | - range: IpCollection::new("240.0.0.0-255.255.255.255").unwrap(), |
| 71 | + ranges: vec!["240.0.0.0/4".parse().unwrap()], |
71 | 72 | description: "future use", |
72 | 73 | }); |
73 | 74 |
|
74 | 75 | // IPv6 bogons |
75 | 76 |
|
76 | 77 | static NODE_SCOPE_UNSPECIFIED: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
77 | | - range: IpCollection::new("::").unwrap(), |
| 78 | + ranges: vec!["::/128".parse().unwrap()], |
78 | 79 | description: "node-scope unicast unspecified", |
79 | 80 | }); |
80 | 81 |
|
81 | 82 | static NODE_SCOPE_LOOPBACK: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
82 | | - range: IpCollection::new("::1").unwrap(), |
| 83 | + ranges: vec!["::1/128".parse().unwrap()], |
83 | 84 | description: "node-scope unicast loopback", |
84 | 85 | }); |
85 | 86 |
|
86 | 87 | static IPV4_MAPPED: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
87 | | - range: IpCollection::new("::ffff:0.0.0.0-::ffff:255.255.255.255").unwrap(), |
| 88 | + ranges: vec!["::ffff:0.0.0.0/96".parse().unwrap()], |
88 | 89 | description: "IPv4-mapped", |
89 | 90 | }); |
90 | 91 |
|
91 | 92 | static IPV4_COMPATIBLE: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
92 | | - range: IpCollection::new("::-::255.255.255.255").unwrap(), |
| 93 | + ranges: vec!["::/96".parse().unwrap()], |
93 | 94 | description: "IPv4-compatible", |
94 | 95 | }); |
95 | 96 |
|
96 | 97 | static REMOTELY_TRIGGERED: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
97 | | - range: IpCollection::new("100::-100::ffff:ffff:ffff:ffff").unwrap(), |
| 98 | + ranges: vec!["100::/64".parse().unwrap()], |
98 | 99 | description: "remotely triggered black hole", |
99 | 100 | }); |
100 | 101 |
|
101 | 102 | static ORCHID: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
102 | | - range: IpCollection::new("2001:10::-2001:1f:ffff:ffff:ffff:ffff:ffff:ffff").unwrap(), |
| 103 | + ranges: vec!["2001:10::/28".parse().unwrap()], |
103 | 104 | description: "ORCHID", |
104 | 105 | }); |
105 | 106 |
|
106 | | -static DOCUMENTATION_PREFIX: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| { |
107 | | - Bogon { |
108 | | - range: IpCollection::new("2001:db8::-2001:db8:ffff:ffff:ffff:ffff:ffff:ffff, 3fff::-3fff:fff:ffff:ffff:ffff:ffff:ffff:ffff") |
109 | | - .unwrap(), |
| 107 | +static DOCUMENTATION_PREFIX: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
| 108 | + ranges: vec![ |
| 109 | + "2001:db8::/32".parse().unwrap(), |
| 110 | + "3fff::/20".parse().unwrap(), |
| 111 | + ], |
110 | 112 | description: "documentation prefix", |
111 | | -} |
112 | 113 | }); |
113 | 114 |
|
114 | 115 | static ULA: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
115 | | - range: IpCollection::new("fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff").unwrap(), |
| 116 | + ranges: vec!["fc00::/7".parse().unwrap()], |
116 | 117 | description: "ULA", |
117 | 118 | }); |
118 | 119 |
|
119 | 120 | static LINK_LOCAL_UNICAST: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
120 | | - range: IpCollection::new("fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff").unwrap(), |
| 121 | + ranges: vec!["fe80::/10".parse().unwrap()], |
121 | 122 | description: "link-local unicast", |
122 | 123 | }); |
123 | 124 |
|
124 | 125 | static SITE_LOCAL_UNICAST: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
125 | | - range: IpCollection::new("fec0::-feff:ffff:ffff:ffff:ffff:ffff:ffff:ffff").unwrap(), |
| 126 | + ranges: vec!["fec0::/10".parse().unwrap()], |
126 | 127 | description: "site-local unicast", |
127 | 128 | }); |
128 | 129 |
|
129 | 130 | static MULTICAST_V6: std::sync::LazyLock<Bogon> = std::sync::LazyLock::new(|| Bogon { |
130 | | - range: IpCollection::new("ff00::-ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff").unwrap(), |
| 131 | + ranges: vec!["ff00::/8".parse().unwrap()], |
131 | 132 | description: "multicast v6", |
132 | 133 | }); |
133 | 134 |
|
@@ -163,7 +164,7 @@ static BOGONS: std::sync::LazyLock<Vec<&'static Bogon>> = std::sync::LazyLock::n |
163 | 164 |
|
164 | 165 | pub fn is_bogon(address: &IpAddr) -> Option<&'static str> { |
165 | 166 | for bogon in BOGONS.iter() { |
166 | | - if bogon.range.contains(address) { |
| 167 | + if bogon.ranges.iter().any(|net| net.contains(address)) { |
167 | 168 | return Some(bogon.description); |
168 | 169 | } |
169 | 170 | } |
|
0 commit comments