• Dumitru Ceara's avatar
    openvswitch: handle DNAT tuple collision · 8aa7b526
    Dumitru Ceara authored
    With multiple DNAT rules it's possible that after destination
    translation the resulting tuples collide.
    
    For example, two openvswitch flows:
    nw_dst=10.0.0.10,tp_dst=10, actions=ct(commit,table=2,nat(dst=20.0.0.1:20))
    nw_dst=10.0.0.20,tp_dst=10, actions=ct(commit,table=2,nat(dst=20.0.0.1:20))
    
    Assuming two TCP clients initiating the following connections:
    10.0.0.10:5000->10.0.0.10:10
    10.0.0.10:5000->10.0.0.20:10
    
    Both tuples would translate to 10.0.0.10:5000->20.0.0.1:20 causing
    nf_conntrack_confirm() to fail because of tuple collision.
    
    Netfilter handles this case by allocating a null binding for SNAT at
    egress by default.  Perform the same operation in openvswitch for DNAT
    if no explicit SNAT is requested by the user and allocate a null binding
    for SNAT for packets in the "original" direction.
    
    Reported-at: https://bugzilla.redhat.com/1877128Suggested-by: default avatarFlorian Westphal <fw@strlen.de>
    Fixes: 05752523 ("openvswitch: Interface with NAT.")
    Signed-off-by: default avatarDumitru Ceara <dceara@redhat.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    8aa7b526
conntrack.c 60.2 KB