HAProxy route https SNI e http na mesma porta

6

Eu tenho um HTTPS de roteamento HAProxy sem terminação usando o SNI.

A configuração é semelhante à seguinte:

frontend ft_ssl_vip
  bind 0.0.0.0:5000
  mode tcp
  option tcplog

  tcp-request inspect-delay 5s
  tcp-request content accept if { req.ssl_hello_type 1 }

  default_backend bk_ssl_default

# Using SNI to take routing decision
backend bk_ssl_default
  mode tcp

  acl application_1 req.ssl_sni -i foo.example.com
  acl application_2 req.ssl_sni -i bar.example.com

  use-server server1 if application_1
  use-server server2 if application_2
  use-server server3 if !application_1 !application_2

  option ssl-hello-chk
  server server1 127.0.0.1:777
  server server2 127.0.0.1:778
  server server3 127.0.0.1:779

Também preciso rotear o tráfego HTTP pela mesma porta (5000).

Como posso modificar minha configuração para acomodar HTTP e HTTPS via SNI sem a terminação na mesma porta?

editar

Eu cheguei mais perto. O roteamento HTTPS parece estar funcionando, mas o HTTP backend acl não está correspondendo ao domínio por algum motivo.

Aqui é onde eu estou:

frontend app
  bind 0.0.0.0:5000
  mode tcp
  option tcplog

  tcp-request inspect-delay 5s
  tcp-request content accept if HTTP
  tcp-request content accept if { req.ssl_hello_type 1 }


  use_backend testing_http if HTTP

  default_backend testing_https



backend testing_https
  mode tcp

  acl app_2 req.ssl_sni -i foo.bar.com

  use-server server2 if app_2
  use-server default if !app_2

  server server2 127.0.0.1:777
  server default 127.0.0.1:443



backend testing_http
  mode http

  acl app_2 hdr(host) -i foo.bar.com

  use-server server2 if app_2
  use-server default if !app_2

  server server2 127.0.0.1:777
  server default 127.0.0.1:80
    
por user319862 12.09.2014 / 20:03

1 resposta

8

Eu estou postando uma resposta para a minha própria pergunta, porque eu consegui juntar algo e essa pergunta não parece ter nenhum interesse. Se aparecer em uma pesquisa no google, isso deve ajudar alguém.

O seguinte parece funcionar para mim até agora:

frontend app
  bind 0.0.0.0:5000
  mode tcp
  option tcplog

  tcp-request inspect-delay 5s
  tcp-request content accept if HTTP
  tcp-request content accept if { req.ssl_hello_type 1 }


  use_backend testing_http if HTTP

  default_backend testing_https



backend testing_https
  mode tcp

  acl app_2 req.ssl_sni -i foo.bar.com

  use-server server2 if app_2
  use-server default if !app_2

  server server2 127.0.0.1:777
  server default serverfault.com:443



backend testing_http
  mode http

  acl app_2 hdr_dom(host) -i foo.bar.com

  use-server server2 if app_2
  use-server default if !app_2

  server server2 127.0.0.1:777
  server default www.example.com:80

As partes importantes a serem compreendidas - o frontend verifica se a solicitação é HTTP. Se não for, ele verifica se é uma solicitação SNI. Caso contrário, não aceita.

A outra parte que me enganou foi o host correspondente no backend http. Era importante usar a correspondência de domínio com hdr_dom em vez de hdr para que uma porta especificada manualmente na string não quebrasse a acl.

A parte mais difícil é que o modo tcp no front end não tem logging útil para http. E como o backend http não pode registrar, você não recebe nenhuma informação http.

    
por 12.09.2014 / 22:01

Tags