Home | History | Annotate | Line # | Download | only in doc
TODO.npf revision 1.12
      1  1.12       gdt # $NetBSD: TODO.npf,v 1.12 2025/04/17 18:39:35 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.11       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.11       gdt # Features (not needing architectural changes)
    173  1.11       gdt 
    174  1.11       gdt ## Add an extension to support source routing / re-routing of packets.
    175  1.11       gdt 
    176  1.11       gdt See: http://mail-index.netbsd.org/tech-net/2014/05/19/msg004526.html 
    177  1.11       gdt 
    178  1.11       gdt ## support for ALTQ
    179  1.11       gdt 
    180  1.11       gdt Integration with ALTQ as an intermediate solution. In the long term,
    181  1.11       gdt we should implement a better QoS mechanism as part of NPF. Meanwhile,
    182  1.11       gdt NPF can integrate with ALTQ quite easily using the mbuf tags.
    183  1.11       gdt 
    184  1.12       gdt (Explain this more clearly.  It seems to be "use npf as a classifier
    185  1.12       gdt for ALTQ".)
    186  1.12       gdt 
    187  1.11       gdt ## Support for NAT64 i.e. the protocol translation. 
    188  1.11       gdt 
    189  1.11       gdt ## Implement ftp-proxy forward proxy support
    190  1.11       gdt 
    191  1.11       gdt (for active FTP client behind NAT).
    192  1.11       gdt     
    193  1.12       gdt ## MiniUPnP
    194  1.11       gdt 
    195  1.12       gdt Add support for MiniUPnP (see http://miniupnp.free.fr/ web page). 
    196  1.11       gdt 
    197  1.12       gdt ## add support for "with short"
    198  1.12       gdt 
    199  1.12       gdt ## implement "port-unr"
    200  1.11       gdt 
    201  1.12       gdt (Explain; this seems to be a rule keyword to return specific
    202  1.12       gdt unreachable types, but it's not clear if something more was intended.)
    203  1.11       gdt 
    204  1.11       gdt # Security
    205  1.11       gdt 
    206  1.12       gdt ## Extra measures to protect npf from SYN flood attacks.
    207  1.11       gdt 
    208  1.11       gdt E.g. accelerate connection expiration on low memory or after certain
    209  1.12       gdt threshold. The timeout can also be self-balancing.  This item is about
    210  1.12       gdt protecting npf state in situations where excessive SYNs arrive in
    211  1.12       gdt situations where a legitimate SYN should trigger a state entry.
    212  1.12       gdt 
    213  1.12       gdt ## Consider blind reset attacks (see RFC 5961).
    214  1.12       gdt 
    215  1.12       gdt This is about the situation when npf is doing stateful processing on a
    216  1.12       gdt TCP connection and only allowing packets matching the connection.
    217  1.12       gdt Extend the definition of a packet matching the connection to meet the
    218  1.12       gdt new rules in RFC5961, and perhaps generate the specified response
    219  1.12       gdt packets.
    220  1.11       gdt 
    221  1.12       gdt ## Consider experimentation to use bloom filters against certain DoS attacks.
    222  1.11       gdt 
    223  1.12       gdt (This needs much more clarity.)
    224  1.11       gdt 
    225  1.10       gdt # General
    226   1.1      maxv 
    227  1.12       gdt ## IPv4 options
    228  1.12       gdt 
    229  1.12       gdt Implement "block return-icmp in log final all with ipopts".
    230  1.12       gdt (Explain if this is more than "enable writing rules to match packets
    231  1.12       gdt with ip options".)
    232   1.2      maxv 
    233  1.12       gdt Consider defaulting to blocking options, with "allow-ip4opts" to
    234  1.12       gdt enable them.
    235  1.10       gdt 
    236  1.12       gdt ## IPv6 options
    237  1.10       gdt 
    238  1.12       gdt (Jointly with IPv4 options.)
    239  1.12       gdt 
    240  1.12       gdt Perhaps a limited set (IPPROTO_ROUTING, IPPROTO_HOPOPTS and
    241  1.12       gdt IPPROTO_DSTOPTS) by default, and "allow-ip6opts" to enable others.
    242  1.10       gdt 
    243  1.10       gdt ## add an ioctl, similar to PF's DIOCNATLOOK and IPF's SIOCGNATL
    244  1.10       gdt 
    245  1.10       gdt document it so that it can be added in third-party software, like:
    246  1.10       gdt    https://github.com/squid-cache/squid/blob/5b74111aff8948e869959113241adada0cd488c2/src/ip/Intercept.cc#L263
    247  1.10       gdt 
    248  1.12       gdt ## patch squid to support transparent-proxy with NPF.
    249  1.12       gdt 
    250  1.12       gdt (Likely, simply using the ioctl from the previous item.)
    251  1.12       gdt 
    252  1.10       gdt ## support IPv6 jumbograms
    253  1.10       gdt 
    254  1.12       gdt (Explain what is or is not supported now, and what needs to happen
    255  1.12       gdt differently.)
    256  1.12       gdt 
    257  1.10       gdt ## support large IPv6 options
    258  1.10       gdt 
    259  1.10       gdt as explained here:
    260   1.2      maxv        http://mail-index.netbsd.org/tech-net/2018/04/08/msg006786.html
    261  1.10       gdt But it's not a big problem - perhaps we don't care at all.
    262  1.10       gdt 
    263  1.10       gdt ## improve mss clamping
    264   1.5  sborrill 
    265  1.10       gdt as explained here:
    266   1.5  sborrill        http://mail-index.netbsd.org/tech-net/2017/01/15/msg006224.html
    267  1.11       gdt 
    268  1.11       gdt ## IPv6 reassembly
    269  1.11       gdt 
    270  1.11       gdt Investigate and fix the IPv6 reassembly (there is a memory leak).
    271  1.11       gdt 
    272  1.11       gdt ## nbuf_ensure_writable
    273  1.11       gdt 
    274  1.11       gdt Use nbuf_ensure_writable() where appropriate.
    275  1.11       gdt 
    276  1.11       gdt ## TCP FSM enhancement
    277  1.11       gdt 
    278  1.12       gdt Minor TCP FSM investigation: should it be not allowed to immediately
    279  1.12       gdt re-open the connection after RST or FIN?
    280  1.12       gdt 
    281  1.12       gdt (Explain what this means, how it relates to standards, and what the
    282  1.12       gdt concerns are.)
    283