2017-04-07 1 views
0

Nous avons une architecture où plusieurs API sont présentes sur plusieurs hôtes. Chaque API se trouve derrière un ELB AWS. Nous voulons mettre en place un proxy qui acheminera les demandes basées sur l'URI vers l'ELB.Comportement/erreur bizarre essayant d'utiliser HAProxy pour transférer des requêtes aux ELB

Ce que je travaille à ce jour la plupart du temps, mais environ 3 sur 10 demandes aboutissent à l'erreur suivante (en utilisant cURL, mais le problème est pas cURL):

curl: (35) Unknown SSL protocol error in connection to test-router.versal.com:-9847 

J'ai le sentiment que la ELB est le coupable. Le SSL est terminé là.

Voici notre config HAProxy:

global 
    log 127.0.0.1 local0 
    log 127.0.0.1 local1 notice 
    maxconn 10240 
    user haproxy 
    group haproxy 
    daemon 
    debug 
    stats socket /var/run/haproxy.sock 
    log-send-hostname test-router.domain.com 
    description "HAProxy on test-router.domain.com" 

defaults 
    log  global 
    mode http 
    option httplog 
    option dontlognull 
    retries 3 
    option redispatch 
    option forwardfor 
    option httpclose 
    option dontlognull 
    option tcpka 
    maxconn 10240 
    timeout connect 10000ms 
    timeout client 600000ms 
    timeout server 600000ms 

frontend public 
    bind *:80 
    bind *:443 
    acl elb0 path_beg /elb0 
    acl elb1 path_beg /elb1 
    use_backend elb0 if elb0 
    use_backend elb1 if elb1 

    bind 0.0.0.0:443 ssl crt /etc/ssl/cert.pem no-sslv3 ciphers AES128+EECDH:AES128+EDH 

backend elb0 
    server server_vcat elb0.domain.com:443 ssl verify none 

backend elb1 
    server server_laapi elb1.domain.com:443 ssl verify none 

Répondre

1

Le SSL de boucle est pas terminé au ELB. Il est mis fin à HAProxy, dans votre configuration ...

bind 0.0.0.0:443 ssl crt /etc/ssl/cert.pem no-sslv3 ciphers AES128+EECDH:AES128+EDH 

... puis une toute autre session SSL est établie par HAProxy sur la connexion au ELB:

server ... ssl verify none 

Un problème SSL avec ELB ne pourrait pas être propagé à recourber à travers HAProxy dans cette configuration.

Le problème est dans la configuration de HAProxy, ici:

bind *:443 

Retirez cette ligne. C'est redondant (et incorrect).

Vous indiquez à HAProxy de se lier au port 443 deux fois: une fois en parlant SSL, et une fois en et non en parlant SSL. Donc, statistiquement, sur environ 50% de vos tentatives de connexion, curl trouve que HAProxy ne parle pas SSL sur le port 443 - il ne parle que HTTP, et curl ne peut pas (et ne devrait pas) gérer cela gracieusement. Je crois que cette configuration (erronée) n'est pas détectée par HAProxy, pas à cause d'un bug réel, mais plutôt à cause de la façon dont certaines choses sont implémentées dans les HAProxy internes, liées aux déploiements multi-processus et aux recharges à chaud, dans lesquelles Dans le cas contraire, HAProxy devrait être lié plusieurs fois au même socket.

+0

Bien sûr, c'est évident maintenant. La seule ligne que je n'ai jamais considérée. Merci beaucoup. Votre réponse est inestimable. –