Skip to content
  • Michal Kubeček's avatar
    netfilter: nf_ct_sctp: minimal multihoming support · d7ee3519
    Michal Kubeček authored
    
    
    Currently nf_conntrack_proto_sctp module handles only packets between
    primary addresses used to establish the connection. Any packets between
    secondary addresses are classified as invalid so that usual firewall
    configurations drop them. Allowing HEARTBEAT and HEARTBEAT-ACK chunks to
    establish a new conntrack would allow traffic between secondary
    addresses to pass through. A more sophisticated solution based on the
    addresses advertised in the initial handshake (and possibly also later
    dynamic address addition and removal) would be much harder to implement.
    Moreover, in general we cannot assume to always see the initial
    handshake as it can be routed through a different path.
    
    The patch adds two new conntrack states:
    
      SCTP_CONNTRACK_HEARTBEAT_SENT  - a HEARTBEAT chunk seen but not acked
      SCTP_CONNTRACK_HEARTBEAT_ACKED - a HEARTBEAT acked by HEARTBEAT-ACK
    
    State transition rules:
    
    - HEARTBEAT_SENT responds to usual chunks the same way as NONE (so that
      the behaviour changes as little as possible)
    - HEARTBEAT_ACKED responds to usual chunks the same way as ESTABLISHED
      does, except the resulting state is HEARTBEAT_ACKED rather than
      ESTABLISHED
    - previously existing states except NONE are preserved when HEARTBEAT or
      HEARTBEAT-ACK is seen
    - NONE (in the initial direction) changes to HEARTBEAT_SENT on HEARTBEAT
      and to CLOSED on HEARTBEAT-ACK
    - HEARTBEAT_SENT changes to HEARTBEAT_ACKED on HEARTBEAT-ACK in the
      reply direction
    - HEARTBEAT_SENT and HEARTBEAT_ACKED are preserved on HEARTBEAT and
      HEARTBEAT-ACK otherwise
    
    Normally, vtag is set from the INIT chunk for the reply direction and
    from the INIT-ACK chunk for the originating direction (i.e. each of
    these defines vtag value for the opposite direction). For secondary
    conntracks, we can't rely on seeing INIT/INIT-ACK and even if we have
    seen them, we would need to connect two different conntracks. Therefore
    simplified logic is applied: vtag of first packet in each direction
    (HEARTBEAT in the originating and HEARTBEAT-ACK in reply direction) is
    saved and all following packets in that direction are compared with this
    saved value. While INIT and INIT-ACK define vtag for the opposite
    direction, vtags extracted from HEARTBEAT and HEARTBEAT-ACK are always
    for their direction.
    
    Default timeout values for new states are
    
      HEARTBEAT_SENT: 30 seconds (default hb_interval)
      HEARTBEAT_ACKED: 210 seconds (hb_interval * path_max_retry + max_rto)
    
    (We cannot expect to see the shutdown sequence so that, unlike
    ESTABLISHED, the HEARTBEAT_ACKED timeout shouldn't be too long.)
    
    Signed-off-by: default avatarMichal Kubecek <mkubecek@suse.cz>
    Signed-off-by: default avatarPablo Neira Ayuso <pablo@netfilter.org>
    d7ee3519