• Florian Westphal's avatar
    netfilter: conntrack: re-init state for retransmitted syn-ack · 82b72cb9
    Florian Westphal authored
    TCP conntrack assumes that a syn-ack retransmit is identical to the
    previous syn-ack.  This isn't correct and causes stuck 3whs in some more
    esoteric scenarios.  tcpdump to illustrate the problem:
    
     client > server: Flags [S] seq 1365731894, win 29200, [mss 1460,sackOK,TS val 2083035583 ecr 0,wscale 7]
     server > client: Flags [S.] seq 145824453, ack 643160523, win 65535, [mss 8952,wscale 5,TS val 3215367629 ecr 2082921663]
    
    Note the invalid/outdated synack ack number.
    Conntrack marks this syn-ack as out-of-window/invalid, but it did
    initialize the reply direction parameters based on this packets content.
    
     client > server: Flags [S] seq 1365731894, win 29200, [mss 1460,sackOK,TS val 2083036623 ecr 0,wscale 7]
    
    ... retransmit...
    
     server > client: Flags [S.], seq 145824453, ack 643160523, win 65535, [mss 8952,wscale 5,TS val 3215368644 ecr 2082921663]
    
    and another bogus synack. This repeats, then client re-uses for a new
    attempt:
    
    client > server: Flags [S], seq 2375731741, win 29200, [mss 1460,sackOK,TS val 2083100223 ecr 0,wscale 7]
    server > client: Flags [S.], seq 145824453, ack 643160523, win 65535, [mss 8952,wscale 5,TS val 3215430754 ecr 2082921663]
    
    ... but still gets a invalid syn-ack.
    
    This repeats until:
    
     server > client: Flags [S.], seq 145824453, ack 643160523, win 65535, [mss 8952,wscale 5,TS val 3215437785 ecr 2082921663]
     server > client: Flags [R.], seq 145824454, ack 643160523, win 65535, [mss 8952,wscale 5,TS val 3215443451 ecr 2082921663]
     client > server: Flags [S], seq 2375731741, win 29200, [mss 1460,sackOK,TS val 2083115583 ecr 0,wscale 7]
     server > client: Flags [S.], seq 162602410, ack 2375731742, win 65535, [mss 8952,wscale 5,TS val 3215445754 ecr 2083115583]
    
    This syn-ack has the correct ack number, but conntrack flags it as
    invalid: The internal state was created from the first syn-ack seen
    so the sequence number of the syn-ack is treated as being outside of
    the announced window.
    
    Don't assume that retransmitted syn-ack is identical to previous one.
    Treat it like the first syn-ack and reinit state.
    Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
    Acked-by: default avatarJozsef Kadlecsik <kadlec@netfilter.org>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    82b72cb9
nf_conntrack_proto_tcp.c 46.5 KB