• Florian Westphal's avatar
    netfilter: nat: switch to new rhlist interface · 7223ecd4
    Florian Westphal authored
    I got offlist bug report about failing connections and high cpu usage.
    This happens because we hit 'elasticity' checks in rhashtable that
    refuses bucket list exceeding 16 entries.
    
    The nat bysrc hash unfortunately needs to insert distinct objects that
    share same key and are identical (have same source tuple), this cannot
    be avoided.
    
    Switch to the rhlist interface which is designed for this.
    
    The nulls_base is removed here, I don't think its needed:
    
    A (unlikely) false positive results in unneeded port clash resolution,
    a false negative results in packet drop during conntrack confirmation,
    when we try to insert the duplicate into main conntrack hash table.
    
    Tested by adding multiple ip addresses to host, then adding
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    
    ... and then creating multiple connections, from same source port but
    different addresses:
    
    for i in $(seq 2000 2032);do nc -p 1234 192.168.7.1 $i > /dev/null  & done
    
    (all of these then get hashed to same bysource slot)
    
    Then, to test that nat conflict resultion is working:
    
    nc -s 10.0.0.1 -p 1234 192.168.7.1 2000
    nc -s 10.0.0.2 -p 1234 192.168.7.1 2000
    
    tcp  .. src=10.0.0.1 dst=192.168.7.1 sport=1234 dport=2000 src=192.168.7.1 dst=192.168.7.10 sport=2000 dport=1024 [ASSURED]
    tcp  .. src=10.0.0.2 dst=192.168.7.1 sport=1234 dport=2000 src=192.168.7.1 dst=192.168.7.10 sport=2000 dport=1025 [ASSURED]
    tcp  .. src=192.168.7.10 dst=192.168.7.1 sport=1234 dport=2000 src=192.168.7.1 dst=192.168.7.10 sport=2000 dport=1234 [ASSURED]
    tcp  .. src=192.168.7.10 dst=192.168.7.1 sport=1234 dport=2001 src=192.168.7.1 dst=192.168.7.10 sport=2001 dport=1234 [ASSURED]
    [..]
    
    -> nat altered source ports to 1024 and 1025, respectively.
    This can also be confirmed on destination host which shows
    ESTAB      0      0   192.168.7.1:2000      192.168.7.10:1024
    ESTAB      0      0   192.168.7.1:2000      192.168.7.10:1025
    ESTAB      0      0   192.168.7.1:2000      192.168.7.10:1234
    
    Cc: Herbert Xu <herbert@gondor.apana.org.au>
    Fixes: 870190a9 ("netfilter: nat: convert nat bysrc hash to rhashtable")
    Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    7223ecd4
nf_nat_core.c 24.1 KB