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