Как использовать HAProxy с веб-сокетом RabbitMQ Web MQTT и добавить SSL / TLS? - PullRequest
1 голос
/ 28 марта 2020

Я изо всех сил пытаюсь заставить HAProxy работать с Web MQTT RabbitMQ (MQTT через Web Socket). Я пробовал некоторые конфигурации и учебные пособия, но безуспешно ( haproxy blog , BartKrol Github , s0urcec0de's Github ). Также попытался установить HAProxy и RabbitMQ с прокси-протоколом , но безуспешно.

Я действительно хочу использовать HAProxy на этом, но мне трудно с этим.

Я намерен использовать клиент Javascript Paho MQTT в браузере для подключения к брокеру RabbitMQ Web Socket MQTT, и между ними HAProxy будет шифровать соединения http / ws с предоставленными сертификатами TLS / SSL (также называемые разгрузкой SSL / TLS).

При попытке открыть защищенное соединение веб-сокета с помощью HAProxy браузер получает ответ HTTP / 1.1 503 Service Unavailable

Сервер RabbitMQ прослушивает незашифрованные соединения msott websocket на локальном хосте: 15675

HAProxy прослушивает ws.mydomain.io:3001

Это конфигурация HAProxy:

global
        log 127.0.0.1 local0

        defaults
                log global
                option httplog
                timeout client 5000s
                timeout connect 5000s
                timeout queue 5000s
                timeout server 5000s

frontend https
        bind *:3001 ssl crt /usr/local/etc/haproxy/mydomain.io.pem
        mode http
        log                     global
        backlog                 4096

        default_backend web_mqtt

backend web_mqtt
        mode http
        option forwardfor

        server ws_01 localhost:15675

Я пытался добиться такой же конфигурации с Nginx , и это успешно работал (конфигурация основана на их официальной документации) .

Nginx слушает ws.mydomai n.io:3000

  server {
    listen 3000 ssl;
    server_name ws.mydomain.io;

    ssl_certificate /home/tiago/Keys/mydomain/nginx/mydomain.io.crt;
    ssl_certificate_key /home/tiago/Keys/mydomain/nginx/mydomain.io.key;

    location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $host;

      proxy_pass http://ws-backend;

      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
    }
  }

  upstream ws-backend {
    # enable sticky session based on IP
    ip_hash;
    server localhost:15675;
  }

Конфигурация RabbitMQ (rabbitmq.conf):

log.connection.level = info
loopback_users.guest = false
listeners.tcp.default = 5672

# proxy_protocol = true

web_mqtt.tcp.port = 15675

Чего мне не хватает в конфигурации HAProxy?

Как можно Nginx запрос прокси и HAProxy нет?

Настройка:

  • Debian 10 x64
  • HAProxy 2.1.3
  • Javascript Paho MQTT Клиент 1.1.0
  • Nginx 1.14.2
  • RabbitMQ 3.8.3

Это ответ после попытки безопасного соединения через веб-сокет с Paho MQTT lib в Firefox:

GET
https://ws.mydomain.io:3001/ws
[HTTP/1.1 503 Service Unavailable 3027ms]

Request URL:https://ws.mydomain.io:3001/ws
Request method:GET
Remote address:127.0.0.1:3001
Status code:
503
Version:HTTP/1.1

Response headers (126 B)    
Raw headers
cache-control   
no-cache
connection  
close
content-length  
107
content-type    
text/html
Request headers (484 B) 
Raw headers
Accept  
*/*
Accept-Encoding 
gzip, deflate, br
Accept-Language 
en-US,en;q=0.5
Cache-Control   
no-cache
Connection  
keep-alive, Upgrade
Host    
ws.mydomain.io:3001
Origin  
http://localhost:8123
Pragma  
no-cache
Sec-WebSocket-Extensions    
permessage-deflate
Sec-WebSocket-Key   
XXXXXXXXXXXXXXXX==
Sec-WebSocket-Protocol  
mqtt
Sec-WebSocket-Version   
13
Upgrade 
websocket
User-Agent  
Mozilla/5.0 (X11; Linux x86_64…) Gecko/20100101 Firefox/68.0

Это firefox сообщение:

Firefox can’t establish a connection to the server at wss://ws.mydomain.io:3001/ws.

1 Ответ

0 голосов
/ 06 мая 2020

Была похожая проблема. Я не настолько знаком с haproxy, чтобы сказать вам, что вы сделали неправильно. Но я могу поделиться с вами моей конфигурацией, которая работает. Серверная часть be_mqtt_www никогда не используется, поэтому, возможно, в этом нет необходимости.

global
        log /dev/log    local0
        log /dev/log    local1 notice
        chroot /var/lib/haproxy
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user haproxy
        group haproxy
        daemon

        # Default SSL material locations
        ca-base <path_to_certs>
        crt-base <path_to_certs>

        # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        option  redispatch
        timeout connect 5000
        timeout client  50000
        timeout server  50000
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http


# proxy for ui
frontend ft_rabbitmq_https
        bind *:443 ssl crt <path_to_cert>
        mode http
        option httpclose
        option forwardfor
        option httpchk
        default_backend bk_rabbitmq_ui

backend bk_rabbitmq_ui
        server localhost 127.0.0.1:15672 check

# proxy for mqtt-tls
listen mqtt
        bind *:8883 ssl crt <path_to_cert>
        mode tcp
        option clitcpka
        timeout client 3h
        timeout server 3h
        option tcplog
        server localhost 127.0.0.1:1883 check

#proxy for tls-websockets
frontend fe_mqtt_wss
        bind *:9001 ssl crt <path_to_cert>
        mode http
        option http-server-close
        acl is_websocket hdr(Upgrade) -i WebSocket
        use_backend be_mqtt_ws if is_websocket
        default_backend be_mqtt_www

backend be_mqtt_ws
        timeout server 600s
        server localhost 127.0.0.1:15675/ws check

backend be_mqtt_www
        timeout server 600s
        server localhost 127.0.0.1:15675 check
...