• Julian Anastasov's avatar
    [PATCH] ipvs: ip_vs_ftp breaks connections using persistence · 17d6b7c8
    Julian Anastasov authored
    	ip_vs_ftp when loaded can create NAT connections with unknown
    client port for passive FTP. For such expectations we lookup with
    cport=0 on incoming packet but it matches the format of the persistence
    templates causing packets to other persistent virtual servers to be
    forwarded to real server without creating connection. Later the
    reply packets are treated as foreign and not SNAT-ed.
    
    	If the IPVS box serves both FTP and other services (eg. HTTP)
    for the time we wait for first packet for the FTP data connections with
    unknown client port (there can be many), other HTTP connections
    that have nothing common to the FTP conn break, i.e. HTTP client
    sends SYN to the virtual IP but the SYN+ACK is not NAT-ed properly
    in IPVS box and the client box returns RST to real server IP. I.e.
    the result can be 10% broken HTTP traffic if 10% of the time
    there are passive FTP connections in connecting state. It hurts
    only IPVS connections.
    
    	This patch changes the connection lookup for packets from
    clients:
    
    * introduce IP_VS_CONN_F_TEMPLATE connection flag to mark the
    connection as template
    * create new connection lookup function just for templates - ip_vs_ct_in_get
    * make sure ip_vs_conn_in_get hits only connections with
    IP_VS_CONN_F_NO_CPORT flag set when s_port is 0. By this way
    we avoid returning template when looking for cport=0 (ftp)
    Signed-off-by: default avatarJulian Anastasov <ja@ssi.bg>
    Signed-off-by: default avatarChris Wright <chrisw@osdl.org>
    17d6b7c8
ip_vs_conn.c 22.3 KB