Angular CLI Proxy: перенаправить незащищенный локальный веб-сокет на защищенный удаленный веб-сокет - PullRequest
1 голос
/ 15 февраля 2020

Я пытаюсь установить sh соединение MQTT через Websockets через обратный прокси. Можно ли настроить прокси CLI Angular для пересылки запросов на ws://localhost:4200/mqtt на wss://mqtt.example.com/mqtt?

Я пробовал несколько конфигураций и, похоже, не могу его получить Работа. Вот что у меня есть в proxy.conf.json:

"/mqtt/*": {
  "target": "wss://mqtt.example.com/",
  "secure": false,
  "ws": true,
  "changeOrigin": true,
  "logLevel": "debug"
}

Я пробовал различные комбинации, используя secure и / или changeOrigin в качестве истинного или ложного, и я никогда не смог соединиться.

Использование "secure": false, "ws": true, "changeOrigin": true, или "secure": true, "ws": true, "changeOrigin": true, Я всегда получаю:

Ошибка при рукопожатии WebSocket: Неожиданный код ответа: 502

Обновление

Я изменил определение прокси, чтобы пропустить параметр changeOrigin и добавил /mqtt к цели:

"/mqtt": {
  "target": "wss://mqtt.example.com/mqtt",
  "secure": false,
  "ws": true,
  "logLevel": "debug"
},

Теперь получим другое сообщение об ошибке:

Ошибка при рукопожатии WebSocket: неожиданный код ответа: 404

Моя проблема в том, что я не вижу точного запроса, который CLI Angular отправляет на удаленный сервер, я уже установил от logLevel до debug, но это не дает никакого полезного вывода для диагностики проблемы. Было бы очень полезно отладить это, если бы я мог видеть точный запрос, который прокси-сервер делает к удаленному серверу.

Обновление 2

Определенно нет необходимости включать /mqtt в цели, потому что тогда я получаю /mqtt/mqtt в последнем запросе, который делает прокси.

Дальнейшая отладка Я обнаружил следующее сообщение об ошибке в моем входном контроллере Kubernetes:

восходящее преждевременно закрытое соединение при чтении заголовка ответа из восходящего потока,

Однако, когда я подключаюсь напрямую к защищенной веб-розетке с помощью локального MQTT-клиента (MqttBox), тогда соединение работает, поэтому Я все еще думаю, что это не проблема с вышестоящей конфигурацией, но что-то введено в прокси-соединение.

Обновление 3

Когда я просматриваю логи брокера mosquitto, я продолжайте видеть следующий вывод:

1581786178: Ошибка сокета на клиенте, отключение.

Также Мне интересно, может ли моя проблема быть вызвана тем, что часть соединения проходит через TLS, поэтому цепочка соединений выглядит следующим образом:

Browser/Client 
  -- WS/HTTP --> Angular CLI Proxy (localhost:4200) 
  -- WSS/HTTPS --> Ingress Controller (mqtt.example.com:443)
  -- WS/HTTP --> MQTT Broker (port 9001)

Проверка трафика c через tcpdump -vvvs 1500 - -i any port 9001 Мне удалось извлечь следующий заголовок:

GET /mqtt HTTP/1.1
Host: mqtt.example.com
Upgrade: websocket
Connection: upgrade
X-Request-ID: [...]
X-Real-IP: [...]
X-Forwarded-For: [...]
X-Forwarded-Host: [...]
X-Forwarded-Port: 443
X-Forwarded-Proto: https
X-Original-URI: /mqtt
X-Scheme: https
sec-websocket-protocol: mqtt
sec-websocket-extensions: permessage-deflate; client_max_window_bits
sec-websocket-key: [...]
accept-language: en-US,en;q=0.9
accept-encoding: gzip, deflate, br
sec-websocket-version: 13
origin: chrome-extension://[...]
user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36
cache-control: no-cache
pragma: no-cache

Обновление 4

Я исследовал это дальше. Когда я отключаю TLS на контроллере Kubernetes Ingress и вся цепочка связывается незащищенно, у меня нет проблем, и я могу прокси-соединение через Websocket через Angular CLI. Однако, как только я включаю TLS, я сталкиваюсь с ошибками, которые я описал выше. Итак, подведем итог, следующие три созвездия работают нормально:

# whole chain unsecured (WORKS OK):
Browser/Client 
  -- WS/HTTP --> Angular CLI Proxy (localhost:4200) 
  -- WS/HTTP --> Ingress Controller (mqtt.example.com:443)
  -- WS/HTTP --> MQTT Broker (port 9001)

# wss to public eclipse mqtt broker (WORKS OK):
Browser/Client
  -- WS/HTTP --> Angular CLI Proxy (localhost:4200) 
  -- WSS/HTTPS --> MQTT Broker (mqtt.eclipse.org:443)

# secured connection directly from browser/client to broker (WORKS OK):
Browser/Client
  -- WSS/HTTPS --> Ingress Controller (mqtt.example.com:443)
  -- WS/HTTP --> MQTT Broker (port 9001)

1 Ответ

1 голос
/ 15 февраля 2020

Это возможно; следующий конфиг работает с тестовым сервером eclipse :

"/wss": {
    "target": "https://mqtt.eclipse.org:443/mqtt",
    "secure": false,
    "ws": true
},

примечание: Оба https://mqtt.eclipse.org:443/mqtt и wss://mqtt.eclipse.org:443/mqtt работают нормально.

С этой конфигурацией я могу подключиться (и подписаться / опубликовать sh et c), используя Paho JS MQTT Client :

paho js mqtt client screenshot

Я не уверен, что не так с вашей конфигурацией, но подозреваю, что "target": "wss://mqtt.example.com/" должно быть "target": "wss://mqtt.example.com/mqtt" (но это может быть просто из-за того, как вы анонимизировали данные?). Надеюсь, что попытка сделать это с тестовым сервером укажет вам правильное направление (я полагаю, вы проверили, что прокси работает со стандартной страницей http).

...