Conexões SSL HAProxy 1.6 reseting

1

Eu tenho batido minha cabeça contra esse problema HAProxy por muito tempo, e espero que alguém tenha visto isso antes.

Aqui estão algumas informações:

  1. Nossas instâncias do HAP estão no AWS em três regiões
  2. O único tráfego que essas instâncias estão recebendo são de nossos clientes
  3. Cada um de nossos clientes tem uma instalação HAProxy que encaminha solicitações de seus usuários finais para nós em 80 e 443 a 1025 e 1026, respectivamente.
  4. Essas solicitações são encaminhadas pelo TCP usando o protocolo de proxy para nossas instâncias de HAP.
  5. Nossas instâncias de HAP, em seguida, SSL, definem a solicitação e as encaminham para nosso back-end na porta 80.
  6. Nosso roteamento é feito dentro do Route53 com verificações de integridade.
  7. Essas verificações de saúde marcarão como com falha para a instância, se a instância não falhar em responder no tempo, três vezes em 30 segundos. As verificações disparam cerca de 4 vezes por segundo.

Agora, para o problema: de vez em quando, esses servidores estão em handshakes SSL, fazendo com que o handshake seja redefinido (isso é encontrado em um tcpdump durante uma falha) e fazendo com que as verificações de integridade sejam interrompidas o suficiente para causar uma falha. Isso aconteceu cerca de 450 vezes no final de semana em 6 instâncias.

Memória e CPU não são espinhosas o suficiente para causar qualquer alarme, mesmo durante a suspensão do aperto de mão.

Aqui está a configuração para as instâncias do HAP:

# HAProxy Config
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
    log         127.0.0.1 local2

    pidfile     /var/run/haproxy.pid
    maxconn     30000
    user        haproxy
    group       haproxy
    daemon
    ssl-default-bind-options no-sslv3 no-tls-tickets
    tune.ssl.default-dh-param 2048

# turn on stats unix socket
#    stats socket /var/lib/haproxy/stats'

#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    retries                 3
    timeout http-request    5s
    timeout queue           1m
    timeout connect         31s
    timeout client          31s
    timeout server          31s
    maxconn                 15000

# Stats
    stats           enable
    stats uri           /haproxy?stats
    stats realm         Strictly\ Private
    stats auth          $StatsUser:$StatsPass

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------

frontend shared_incoming
    maxconn 15000
    timeout http-request 5s

#    Bind ports of incoming traffic
    bind *:1025 accept-proxy # http
    bind *:1026 accept-proxy ssl crt /path/to/default/ssl/cert.pem ssl crt /path/to/cert/folder/ # https
    bind *:1027 # Health checking port
    acl gs_texthtml url_reg \/gstext\.html    ## allow gs to do meta tag verififcation
    acl gs_user_agent hdr_sub(User-Agent) -i globalsign    ## allow gs to do meta tag verififcation

#      Add headers
    http-request set-header $Proxy-Header-Ip %[src]
    http-request set-header $Proxy-Header-Proto http if !{ ssl_fc }
    http-request set-header $Proxy-Header-Proto https if { ssl_fc }

#     Route traffic based on domain
    use_backend gs_verify if gs_texthtml or gs_user_agent    ## allow gs meta tag verification
    use_backend %[req.hdr(host),lower,map_dom(/path/to/map/file.map,unknown_domain)]

#     Drop unrecognized traffic
    default_backend unknown_domain

#---------------------------------------------------------------------
# Backends
#---------------------------------------------------------------------

backend server0  ## added to allow gs ssl meta tag verification
    reqrep ^GET\ /.*\ (HTTP/.*)    GET\ /GlobalSignVerification\ 
    server server0_http server0.domain.com:80/GlobalSignVerification/

backend server1
    server server1_http server1.domain.net:80

backend server2
    server server2_http server2.domain.net:80

backend server3
    server server3_http server3.domain.net:80

backend server4
    server server4_http server4.domain.net:80

backend server5
    server server5_http server5.domain.net:80

backend server6
    server server6_http server6.domain.net:80

backend server7
    server server7_http server7.domain.net:80

backend server8
    server server8_http server8.domain.net:80

backend server9
    server server9_http server9.domain.net:80

backend unknown_domain
    timeout connect 4s
    timeout server 4s
    errorfile 503 /etc/haproxy-shared/errors/404.html
    
por zpunches 21.03.2016 / 18:59

1 resposta

0

Se SSL estiver envolvido, eu daria uma olhada na sua piscina de entropia - talvez você tenha esgotado. Fique de olho em "cat / proc / sys / kernel / aleatório / entropy_avail" e veja se ele cai para 0ish quando você vê o problema.

(Ref: link )

Se for assim, você pode olhar para instalar o rngd para adicionar ao pool acima do que o kernel já faz.

    
por 21.03.2016 / 21:20