Home | History | Annotate | Line # | Download | only in doc
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