• Kuniyuki Iwashima's avatar
    tcp: Refine SYN handling for PAWS. · ee05d90d
    Kuniyuki Iwashima authored
    Our Network Load Balancer (NLB) [0] has multiple nodes with different
    IP addresses, and each node forwards TCP flows from clients to backend
    targets.  NLB has an option to preserve the client's source IP address
    and port when routing packets to backend targets. [1]
    
    When a client connects to two different NLB nodes, they may select the
    same backend target.  Then, if the client has used the same source IP
    and port, the two flows at the backend side will have the same 4-tuple.
    
    While testing around such cases, I saw these sequences on the backend
    target.
    
    IP 10.0.0.215.60000 > 10.0.3.249.10000: Flags [S], seq 2819965599, win 62727, options [mss 8365,sackOK,TS val 1029816180 ecr 0,nop,wscale 7], length 0
    IP 10.0.3.249.10000 > 10.0.0.215.60000: Flags [S.], seq 3040695044, ack 2819965600, win 62643, options [mss 8961,sackOK,TS val 1224784076 ecr 1029816180,nop,wscale 7], length 0
    IP 10.0.0.215.60000 > 10.0.3.249.10000: Flags [.], ack 1, win 491, options [nop,nop,TS val 1029816181 ecr 1224784076], length 0
    IP 10.0.0.215.60000 > 10.0.3.249.10000: Flags [S], seq 2681819307, win 62727, options [mss 8365,sackOK,TS val 572088282 ecr 0,nop,wscale 7], length 0
    IP 10.0.3.249.10000 > 10.0.0.215.60000: Flags [.], ack 1, win 490, options [nop,nop,TS val 1224794914 ecr 1029816181,nop,nop,sack 1 {4156821004:4156821005}], length 0
    
    It seems to be working correctly, but the last ACK was generated by
    tcp_send_dupack() and PAWSEstab was increased.  This is because the
    second connection has a smaller timestamp than the first one.
    
    In this case, we should send a dup ACK in tcp_send_challenge_ack()
    to increase the correct counter and rate-limit it properly.
    
    Let's check the SYN flag after the PAWS tests to avoid adding unnecessary
    overhead for most packets.
    
    Link: https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html [0]
    Link: https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#client-ip-preservation [1]
    Signed-off-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
    Reviewed-by: default avatarJason Xing <kerneljasonxing@gmail.com>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ee05d90d
tcp_input.c 203 KB