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