TODO.npf revision 1.15 1 1.15 gdt # $NetBSD: TODO.npf,v 1.15 2025/04/17 19:54:24 gdt Exp $
2 1.1 maxv
3 1.10 gdt # Meta
4 1.9 gdt
5 1.11 gdt This file intends to be the location for all work needing to be done
6 1.15 gdt for npf within NetBSD, except for bugs that are straightforward enough
7 1.15 gdt to live in gnats. The presence of an item does not imply that there
8 1.15 gdt is consensus that the item should be implemented.
9 1.1 maxv
10 1.11 gdt (The older TODO list, last modified in May, 2020:
11 1.10 gdt https://www.netbsd.org/~rmind/npf/__tasklist.html
12 1.11 gdt has been merged into this file.)
13 1.9 gdt
14 1.10 gdt ## Review all items to see if they are still relevant and correct.
15 1.1 maxv
16 1.14 gdt # Syncing
17 1.14 gdt
18 1.14 gdt ## from https://github.com/rmind/npf/
19 1.14 gdt
20 1.14 gdt Periodically, check this repo to see if there are changes/improvements
21 1.14 gdt that are not in NetBDS and which are appopriate, and merge them.
22 1.14 gdt
23 1.14 gdt ## to https://github.com/rmind/npf/
24 1.14 gdt
25 1.14 gdt Periodically, compare code between NetBSD and this repo, and file PRs
26 1.14 gdt for changes in NetBSD as appropriate, when there are not already PRs.
27 1.14 gdt
28 1.14 gdt ## Merge https://github.com/rmind/npf doc subdir
29 1.14 gdt
30 1.14 gdt rmind's repo has a doc directory. Some content is in man pages and
31 1.14 gdt thus available within NetBSD. Understand if there are things that
32 1.14 gdt aren't (likely), decide how to have them in NetBSD
33 1.14 gdt (/usr/share/doc/npf?) and add them.
34 1.14 gdt
35 1.10 gdt # Documentation
36 1.1 maxv
37 1.12 gdt ## Conversion Guides
38 1.1 maxv
39 1.12 gdt Add instructions for converting configuration for other packet filters
40 1.12 gdt to npf configuration.
41 1.12 gdt
42 1.12 gdt ## More Examples
43 1.12 gdt
44 1.14 gdt ## Man page nits
45 1.14 gdt
46 1.14 gdt ### npf.conf: rule group processing
47 1.14 gdt
48 1.14 gdt Explain if groups are processed in the same order as npf.conf.
49 1.14 gdt Explain what happens if a packet matches the group header, but does
50 1.14 gdt not match a rule in the group. Currently it is unclear exactly when
51 1.14 gdt the default group is run, and if multiple matching groups might run.
52 1.14 gdt
53 1.14 gdt ### npf.conf dynamic ruleset
54 1.14 gdt
55 1.14 gdt Dynamic rulesets are mentioned in npfctl, and blocklistd examples, but
56 1.14 gdt they are not explained in npf.conf. In addition to the basics, while
57 1.14 gdt it is not expected that these rules be treated as if they have the
58 1.14 gdt final flag, the code seems to do that.
59 1.14 gdt
60 1.12 gdt # NetBSD integration
61 1.12 gdt
62 1.12 gdt ## save/restore
63 1.12 gdt
64 1.12 gdt /etc/rc.d/npf lacks the ability to save and load state (stateful rules
65 1.12 gdt and NAT).
66 1.1 maxv
67 1.10 gdt # npfctl
68 1.1 maxv
69 1.10 gdt ## npfctl start does not load
70 1.1 maxv
71 1.10 gdt npfctl start does not load the configuration if not loaded.
72 1.10 gdt It is not clear you need to reload first. Or if it loads it should
73 1.10 gdt print the error messages. Or it should be called enable/disable since
74 1.10 gdt this is what it does. It does not "start" because like an engine with
75 1.10 gdt no fuel, an npf with no configuration does not do much.
76 1.1 maxv
77 1.12 gdt Alternatively: warn if there are no rules, or decide that npfctl
78 1.12 gdt behaves as documented.
79 1.12 gdt
80 1.10 gdt ## better error reporting
81 1.1 maxv
82 1.10 gdt although the framework checks the file for consistency, returning
83 1.10 gdt EINVAL for system failures is probably not good enough. For example if
84 1.10 gdt a module failed to autoload, it is probably an error and it should be
85 1.10 gdt reported differently?
86 1.1 maxv
87 1.12 gdt ## handle array variables in more places
88 1.1 maxv
89 1.12 gdt (Decide if this is just about npfctl or also about the kernel, and if
90 1.12 gdt the latter move it.)
91 1.1 maxv
92 1.11 gdt ## support variables and inline sets which contain both IPv4 and IPv6 addresses
93 1.11 gdt
94 1.11 gdt for example: $ext_if = { inet4(wm0), inet6(wm0) }
95 1.11 gdt
96 1.12 gdt (Decide if this is just about npfctl or also about the kernel, and if
97 1.12 gdt the latter move it.)
98 1.12 gdt
99 1.11 gdt ## support inline blocks with different types of data in the rule.
100 1.11 gdt
101 1.11 gdt This will require a clean-up of the type system in
102 1.11 gdt npfctl parser, since it is currently a bit of a mess. Examples:
103 1.11 gdt
104 1.11 gdt pass in from all to { inet4(wm0), $some_var, 10.0.0.1, }
105 1.11 gdt pass in final proto tcp to 172.28.1.2 port { 161, 162 }
106 1.11 gdt pass in final proto { tcp, udp } to 172.28.1.2 port 53
107 1.11 gdt
108 1.11 gdt [MOSTLY DONE?]
109 1.11 gdt
110 1.12 gdt (Decide if this is just about npfctl or also about the kernel, and if
111 1.12 gdt the latter move it.)
112 1.12 gdt
113 1.11 gdt ## npf show improvements
114 1.11 gdt
115 1.11 gdt Consistent `npfctl show' output with rule syntax. Difficult/messy
116 1.11 gdt because rules are compiled into the byte-code.
117 1.11 gdt
118 1.12 gdt Add examples of what is wrong.
119 1.12 gdt
120 1.12 gdt ## -D option to set variables
121 1.12 gdt
122 1.12 gdt Allow `npfctl -D varname=value` to set a variable, as if were defined
123 1.12 gdt in the config file. See pfctl(8).
124 1.12 gdt
125 1.11 gdt # Architectural changes
126 1.11 gdt
127 1.11 gdt ## Layer 2 filtering
128 1.11 gdt
129 1.11 gdt 1. All rules in NPF are added to a ruleset. At this moment, it is assumed
130 1.11 gdt that there is only one ruleset and all rules are processed at layer 3.
131 1.11 gdt One approach is to support another ruleset for layer 2 (or rather, have
132 1.11 gdt capability to specify the "starting layer").
133 1.11 gdt
134 1.11 gdt 2. One way to separate L2 and L3 rules could be by marking groups. In NPF,
135 1.11 gdt a group is just a rule (i.e. rules can be nested).
136 1.11 gdt
137 1.11 gdt 3. npfctl: update the parser such that the group would have an option for
138 1.11 gdt specifying a layer. See "group_opts" token in npf_parse.y file. Also,
139 1.11 gdt we may want to add support for "hwaddr <mac>" syntax or something.
140 1.11 gdt
141 1.11 gdt 4. npfctl_build_rule() code will need to distinguish groups/rules which
142 1.11 gdt were marked as layer 2, i.e. byte-code generation (npfctl_build_code()
143 1.11 gdt and the logic in it) needs to know that we are starting from Ethernet
144 1.11 gdt header and not IP header. Note: it needs to be passed to all nested
145 1.11 gdt rules, so basically take the option from the "current group".
146 1.11 gdt
147 1.11 gdt 5. For a start (i.e. less work to do), you can just add byte-code to parse
148 1.11 gdt Ethernet header and compare the MAC addresses. Just return "not supported"
149 1.11 gdt error for any other filter pattern.
150 1.11 gdt
151 1.11 gdt 6. libnpf: create a new ruleset for L2 and add all groups (and its nested
152 1.11 gdt rules) there. To keep it simpler, we can add npf_rule_setlayer() function
153 1.11 gdt and just handle this separation in libnpf rather than npfctl.
154 1.11 gdt
155 1.11 gdt 7. libnpf-kernel: currently, proplib dictionary has only one "ruleset" dict.
156 1.11 gdt This needs to be split into "ruleset-l3" and "ruleset-l2". Retrieve and
157 1.11 gdt construct a new ruleset in npfctl_reload(); it is simple, but disgusting
158 1.11 gdt proplib code. It is just re-using the existing code to handle another
159 1.11 gdt ruleset.
160 1.11 gdt
161 1.11 gdt 8. Kernel: add a new handler in npf_handler.c, e.g. npf_packet_l2handler()
162 1.11 gdt or something. Register it in npf_pfil_register() using Ethernet pfil
163 1.11 gdt hook. In the handler, call npf_ruleset_inspect() passing L2 ruleset.
164 1.11 gdt
165 1.11 gdt ## Consider single large BPF program
166 1.11 gdt
167 1.11 gdt Implement NPF rules as a single large BPF program, instead of
168 1.11 gdt providing BPF byte-code per each rule. In combination with BPF JIT
169 1.11 gdt compilation, such approach would significantly improve the performance
170 1.11 gdt of very large rulesets. Problems: BPF byte-code limitations; we can
171 1.11 gdt either extend the byte-code or workaround them.
172 1.11 gdt
173 1.11 gdt ## Multiple rule matching
174 1.11 gdt
175 1.11 gdt Multiple rule matching to call the rule-procedures or a suitable
176 1.11 gdt design alternative to that.
177 1.11 gdt
178 1.12 gdt (Explain what this means more clearly.)
179 1.12 gdt
180 1.11 gdt ## ipchains-like feature
181 1.11 gdt
182 1.11 gdt Implement ipchains-like feature to support nested rules and sharing of
183 1.11 gdt a rule group. NPF already supports nested rules. Unresolved questions
184 1.11 gdt are: 1) what kind of complexity of rule chains do we want to support,
185 1.11 gdt e.g. a directed graph with loop resolution or more strict hierarchy
186 1.11 gdt which does not allow jumping up the chain? 2) syntax in npf.conf file.
187 1.11 gdt
188 1.15 gdt ## Support for packets arriving at or departing the socket layer
189 1.15 gdt
190 1.15 gdt Similar to how one can do this in nftables, add a way to write a rule
191 1.15 gdt that will be applied to all packets being delivered to sockets, or
192 1.15 gdt really processed by the system as a host rather than simply forwarded.
193 1.15 gdt The point is to be able to express rules like "block connections to
194 1.15 gdt this machine's ssh daemon, but don't block ssh connections that are
195 1.15 gdt merely being routed", without having to match on addresses.
196 1.15 gdt
197 1.11 gdt ## redundancy and load balancing
198 1.11 gdt
199 1.11 gdt Redundancy and load balancing: initially, add state replication and
200 1.12 gdt replace in-kernel CARP/VRRP with a userlevel daemon.
201 1.12 gdt
202 1.12 gdt Check "Note: we probably want to eliminate proplib in NPF before doing
203 1.12 gdt this." and drop if proplib has in fact been eliminated.
204 1.11 gdt
205 1.13 gdt ## QoS
206 1.11 gdt
207 1.11 gdt QoS: rate limiting, traffic shaping, prioritising. Question: how much
208 1.11 gdt of this should be a part of the packet filter and how much of the
209 1.11 gdt network stack (merely involving some integration with the packet
210 1.11 gdt filters)?
211 1.11 gdt
212 1.12 gdt ## address/port and port in tables
213 1.11 gdt
214 1.12 gdt Tables currently contain addresses. Add support for address/port
215 1.12 gdt tuples, and ports.
216 1.11 gdt
217 1.13 gdt ## Separate mss clamping from normal rules
218 1.13 gdt
219 1.13 gdt Currently, mss clamping is a rule procedure and has to be specified on
220 1.13 gdt a matching rule. But, if there are both firewall rules and a desire
221 1.13 gdt to clamp, then one has to add clamping to all rules. This item is
222 1.13 gdt about having a way to express rules normally, and also say that
223 1.13 gdt clamping shouldhappen.
224 1.13 gdt
225 1.13 gdt http://mail-index.netbsd.org/tech-net/2017/01/15/msg006224.html
226 1.13 gdt
227 1.11 gdt # Features (not needing architectural changes)
228 1.11 gdt
229 1.13 gdt ## Add an extension for "route-to"
230 1.11 gdt
231 1.13 gdt The essence is to change the next hop of a packet if it matches a
232 1.13 gdt rule.
233 1.13 gdt
234 1.13 gdt http://mail-index.netbsd.org/tech-net/2014/05/19/msg004526.html
235 1.11 gdt
236 1.11 gdt ## support for ALTQ
237 1.11 gdt
238 1.13 gdt ALTQ is a QoS scheme, and it expects a way to classify packets so that
239 1.13 gdt different flows can be treated differently. Currently, ALTQ in NetBSD
240 1.13 gdt uses pf. (An earlier comment indicated a solution might involve mbuf
241 1.13 gdt tags.)
242 1.12 gdt
243 1.11 gdt ## Support for NAT64 i.e. the protocol translation.
244 1.11 gdt
245 1.12 gdt ## MiniUPnP
246 1.11 gdt
247 1.12 gdt Add support for MiniUPnP (see http://miniupnp.free.fr/ web page).
248 1.11 gdt
249 1.12 gdt ## add support for "with short"
250 1.12 gdt
251 1.13 gdt (Clarify: is this about dropping packets that are shorter than they
252 1.13 gdt should be? Why would the user choose?)
253 1.13 gdt
254 1.13 gdt ## Add specific kinds of ICMP unreachable
255 1.11 gdt
256 1.13 gdt Currently, rules are documented to allow returning `ICMP UNREACHABLE`
257 1.13 gdt given the keyword `return-icmp`. Probably this is ICMP Admin
258 1.13 gdt Prohibited, but this is not clear.
259 1.13 gdt
260 1.13 gdt This item is about different or additional keywords to allow the user
261 1.13 gdt to specify network, host, or port unreachable instead.
262 1.11 gdt
263 1.11 gdt # Security
264 1.11 gdt
265 1.12 gdt ## Extra measures to protect npf from SYN flood attacks.
266 1.11 gdt
267 1.11 gdt E.g. accelerate connection expiration on low memory or after certain
268 1.12 gdt threshold. The timeout can also be self-balancing. This item is about
269 1.12 gdt protecting npf state in situations where excessive SYNs arrive in
270 1.12 gdt situations where a legitimate SYN should trigger a state entry.
271 1.12 gdt
272 1.12 gdt ## Consider blind reset attacks (see RFC 5961).
273 1.12 gdt
274 1.12 gdt This is about the situation when npf is doing stateful processing on a
275 1.12 gdt TCP connection and only allowing packets matching the connection.
276 1.12 gdt Extend the definition of a packet matching the connection to meet the
277 1.12 gdt new rules in RFC5961, and perhaps generate the specified response
278 1.12 gdt packets.
279 1.11 gdt
280 1.14 gdt ## Add counters
281 1.14 gdt
282 1.14 gdt Add a hit counter to rules, or some other way so that the user can say
283 1.14 gdt "show me the list of rules and for each rules, how many times it was
284 1.14 gdt invoked". This is similar to ipfilter's `ipfstat -inh`.
285 1.14 gdt
286 1.10 gdt # General
287 1.1 maxv
288 1.12 gdt ## IPv4 options
289 1.12 gdt
290 1.12 gdt Implement "block return-icmp in log final all with ipopts".
291 1.12 gdt (Explain if this is more than "enable writing rules to match packets
292 1.12 gdt with ip options".)
293 1.2 maxv
294 1.12 gdt Consider defaulting to blocking options, with "allow-ip4opts" to
295 1.12 gdt enable them.
296 1.10 gdt
297 1.12 gdt ## IPv6 options
298 1.10 gdt
299 1.12 gdt (Jointly with IPv4 options.)
300 1.12 gdt
301 1.12 gdt Perhaps a limited set (IPPROTO_ROUTING, IPPROTO_HOPOPTS and
302 1.12 gdt IPPROTO_DSTOPTS) by default, and "allow-ip6opts" to enable others.
303 1.10 gdt
304 1.10 gdt ## add an ioctl, similar to PF's DIOCNATLOOK and IPF's SIOCGNATL
305 1.10 gdt
306 1.10 gdt document it so that it can be added in third-party software, like:
307 1.10 gdt https://github.com/squid-cache/squid/blob/5b74111aff8948e869959113241adada0cd488c2/src/ip/Intercept.cc#L263
308 1.10 gdt
309 1.13 gdt ### patch squid to support transparent-proxy with NPF.
310 1.12 gdt
311 1.12 gdt (Likely, simply using the ioctl from the previous item.)
312 1.12 gdt
313 1.10 gdt ## support IPv6 jumbograms
314 1.10 gdt
315 1.12 gdt (Explain what is or is not supported now, and what needs to happen
316 1.12 gdt differently.)
317 1.12 gdt
318 1.13 gdt ## IPv6 reassembly
319 1.13 gdt
320 1.13 gdt Investigate and fix the IPv6 reassembly (there is a memory leak).
321 1.13 gdt
322 1.13 gdt ## nbuf_ensure_writable
323 1.13 gdt
324 1.13 gdt Use nbuf_ensure_writable() where appropriate.
325 1.10 gdt
326 1.13 gdt # Low priority items
327 1.10 gdt
328 1.13 gdt These items are left in the list, but there's no reason to think
329 1.13 gdt anyone will address them any time soon, or that they are high enough
330 1.13 gdt priority that anyone should. They can of course be moved (up likely
331 1.13 gdt clarified if someeone, especially someone intending to work on them,
332 1.13 gdt doesn't see it that way. (Perhaps we should drop them, but for now
333 1.13 gdt they are parked.)
334 1.13 gdt
335 1.13 gdt ## NAT Application Level Gateways for FTP
336 1.13 gdt
337 1.13 gdt Generally, FTP is done in passive mode, so that the data connection is
338 1.13 gdt created by the client, and no particular support is needed in
339 1.13 gdt firewalls. This item is about creating an alg that allows the
340 1.13 gdt (regular, not passive mode) inbound connection from the server, based
341 1.13 gdt on watching the control connection.
342 1.5 sborrill
343 1.13 gdt (It is likely that there are almost no remaining uses of active FTP,
344 1.13 gdt and thus it is unlikely this would be implemented.)
345 1.11 gdt
346 1.13 gdt ## Consider experimentation to use bloom filters against certain DoS attacks.
347 1.11 gdt
348 1.13 gdt (This needs much more clarity.)
349 1.11 gdt
350 1.13 gdt ## support large IPv6 options
351 1.11 gdt
352 1.13 gdt as explained here:
353 1.13 gdt http://mail-index.netbsd.org/tech-net/2018/04/08/msg006786.html
354 1.13 gdt But it's not a big problem - perhaps we don't care at all.
355 1.11 gdt
356 1.11 gdt ## TCP FSM enhancement
357 1.11 gdt
358 1.12 gdt Minor TCP FSM investigation: should it be not allowed to immediately
359 1.12 gdt re-open the connection after RST or FIN?
360 1.12 gdt
361 1.12 gdt (Explain what this means, how it relates to standards, and what the
362 1.12 gdt concerns are.)
363