Обратите внимание, это также было опубликовано в http://thread.gmane.org/gmane.comp.web.haproxy/27737
мы пытаемся настроить эту архитектуру:
ELB отправляет заголовки прокси, как описано в http://amzn.to/1YajEG3
HAproxy прослушивает SSL в 443
После того, как ELB настроен как протокол SSL + Proxy, мы попытались настроить HAProxy, добавив accept-proxy в привязку интерфейса HTTPS:
frontend https-in
mode http
# Note, I truncated this line because the maillist 80 chars limitations
bind :443 accept-proxy ssl crt \
/var/vcap/jobs/haproxy/config/cert.pem \
no-sslv3 ciphers ...
...
Но не получается: Received something which does not look like a PROXY
protocol header
.
Устранение неполадок Я обнаружил, что ELB отправляет заголовок PROXY ВНУТРИ потока SSL. Например, я запускаю openssl как сервер:
$ openssl s_server -accept 443 -cert cert.pem
...
ACCEPT
bad gethostbyaddr
-----BEGIN SSL SESSION PARAMETERS-----
MFUCAQECAgMDBAIAnwQABDBsAWD78V/tz9KhYw4R/kpL5YPBxfF1qcmzxlclNDuz
0KWw9aGojVogjtBkH/zZOLWhBgIEVyoquqIEAgIBLKQGBAQBAAAA
-----END SSL SESSION PARAMETERS-----
Shared
ciphers:...
CIPHER is DHE-RSA-AES256-GCM-SHA384
Secure Renegotiation IS supported
PROXY TCP4 80.194.77.90 192.168.6.14 39220 443
GET / HTTP/1.1
User-Agent: curl/7.35.0
Host: something.com
Accept: */*
Итак, я сделал "цепную" конфигурацию в haproxy, одну для завершения SSL с чистым TCP, а другую для "извлечения" прокси-протокола и выполнения преобразований HTTP:
listen https-in
mode tcp
bind :443 ssl crt /var/vcap/jobs/haproxy/config/cert.pem no-sslv3
ciphers ...
server http 127.0.0.1:8081
frontend http-in-from-ssl
mode http
bind :8081 accept-proxy
option httplog
option forwardfor
reqadd X-Forwarded-Proto:\ https
default_backend http-routers
И это работает !!!
Итак, мои вопросы:
Спасибо!
Вот информация для вашего вопроса 1, проверьте URL-адрес ниже.
Добыча в последнем ряду таблицы Балансировщик нагрузки TCP / SSL (вторая таблица). Это как раз ваш случай. И это прямо говорит
Не поддерживает заголовок протокола прокси.
Итак, на ваш вопрос 2 ответ отрицательный.
И мне очень жаль, что я не могу больше помочь по вашим вопросам 3 и 4. (На самом деле, исходя из моего опыта, для вопроса 4 я думаю, что ваш способ достаточно хорош. Может быть, моего опыта недостаточно; P)
Я тоже столкнулся с этой проблемой. Однако я использую nginx, а не HA-прокси на своих внутренних балансировщиках нагрузки.
Решение похоже, но я считаю, что стоит опубликовать:
#nginx.conf
user nginx;
worker_processes 1;
error_log /dev/stderr debug;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
stream {
upstream stream_backend {
server 127.0.0.1:500;
}
server{
listen 443 ssl;
proxy_pass stream_backend;
ssl_certificate /certs/local/public.crt;
ssl_certificate_key /certs/local/private.key;
ssl_protocols TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
}
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '[$host] $remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /dev/stdout main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 60;
#gzip on;
server {
listen 8000;
location /elb-status {
keepalive_timeout 0; # Disable HTTP keepalive
access_log off;
return 200;
}
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80 proxy_protocol;
server_name test-nginx.corp.com;
location / {
keepalive_timeout 0; # Disable HTTP keepalive
return 301 https://$host$request_uri;
}
}
upstream nginx-test-stack {
server 10.42.111.6:80;
}
server {
listen 127.0.0.1:500 proxy_protocol;
server_name test-nginx.corp.com;
real_ip_header proxy_protocol;
location / {
proxy_pass http://nginx-test-stack;
}
}
}
Это позволяет мне включить шифрование E2E для любых TCP-соединений. При необходимости я могу проксировать веб-сокеты или https или просто TCP