Skip to content
  • Florian Westphal's avatar
    netfilter: nf_nat: add nat type hooks to nat core · 9971a514
    Florian Westphal authored
    
    
    Currently the packet rewrite and instantiation of nat NULL bindings
    happens from the protocol specific nat backend.
    
    Invocation occurs either via ip(6)table_nat or the nf_tables nat chain type.
    
    Invocation looks like this (simplified):
    NF_HOOK()
       |
       `---iptable_nat
    	 |
    	 `---> nf_nat_l3proto_ipv4 -> nf_nat_packet
    	               |
              new packet? pass skb though iptables nat chain
                           |
    		       `---> iptable_nat: ipt_do_table
    
    In nft case, this looks the same (nft_chain_nat_ipv4 instead of
    iptable_nat).
    
    This is a problem for two reasons:
    1. Can't use iptables nat and nf_tables nat at the same time,
       as the first user adds a nat binding (nf_nat_l3proto_ipv4 adds a
       NULL binding if do_table() did not find a matching nat rule so we
       can detect post-nat tuple collisions).
    2. If you use e.g. nft_masq, snat, redir, etc. uses must also register
       an empty base chain so that the nat core gets called fro NF_HOOK()
       to do the reverse translation, which is neither obvious nor user
       friendly.
    
    After this change, the base hook gets registered not from iptable_nat or
    nftables nat hooks, but from the l3 nat core.
    
    iptables/nft nat base hooks get registered with the nat core instead:
    
    NF_HOOK()
       |
       `---> nf_nat_l3proto_ipv4 -> nf_nat_packet
    		|
             new packet? pass skb through iptables/nftables nat chains
                    |
    		+-> iptables_nat: ipt_do_table
    	        +-> nft nat chain x
    	        `-> nft nat chain y
    
    The nat core deals with null bindings and reverse translation.
    When no mapping exists, it calls the registered nat lookup hooks until
    one creates a new mapping.
    If both iptables and nftables nat hooks exist, the first matching
    one is used (i.e., higher priority wins).
    
    Also, nft users do not need to create empty nat hooks anymore,
    nat core always registers the base hooks that take care of reverse/reply
    translation.
    
    Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    9971a514