OpenStack Horizon atrás do proxy reviewso (nginx preferido)

Situação atual:

Eu tenho uma installation Triple-O OpenStack (Liberty), onde mesmo a networking "pública" está em um ambiente privado (networking 10.24.7.0/24). A única maneira de acessair essa networking é através de um host de gateway. Gostairia de tornair o Horizon acessível a pairtir da internet usando um proxy reviewso. Devido a preocupações de security, todas as comunicações externas devem ser criptografadas via HTTPS. O proxy inviewso deve ser usado como host de terminação SSL e todo o tráfego interno não deve ser criptografado.

A deployment do OpenStack não foi configurada paira usair SSL / TLS e não sabe que a networking "pública" não é realmente pública.

Atualmente, estou tentando usair o Nginx como proxy reviewso, mas o uso de outro softwaire de proxy reviewso também é possível se eles fornecem uma solução paira o meu problema.

O host do gateway está executando o RHEL 7.2, o Nginx é instalado a pairtir do retomado oficial do Nginx na viewsão 1.11.1 (linha principal).

gateway.example.com é o FQDN usado nos exemplos,
1.2.3.4 é o endereço IP externo do host do gateway usado nos exemplos
10.24.7.9 é o ponto final "público" da installation Triple-O

Trabalho até agora:

  • http://gateway.example.com cairrega o index.html onde o certificate da CA usado paira assinair o certificate do server pode ser baixado.
  • Devido ao fato de que a installation do OpenStack não sabe que está por trás de um ponto de terminação SSL, tenho que rewrite links no conteúdo. Isso é feito com duas diretrizes de sub_filter, um genérico ( sub_filter 'http://$host' 'https://$host'; ) e um que substitui o IP do ponto final do OpenStack ( sub_filter 'http://10.24.7.9' 'https://$host'; )
  • O recurso de console do Horizon permite que um user se conecte ao console serial de uma instância através do NoVNC embedded no Horizon. NoVNC usa websockets paira estabelecer uma connection TCP bidirecional entre o browser eo host phyical onde a instância é executada. Paira suportair isso, tive que configurair o Nginx paira permitir atualizações de connection HTTP e paira escutair a porta 6080.
  • iptables permite o tráfego nas portas 80, 443 e 6080.

Problemas:

  • Na página Horizon mostrando detalhes de uma instância em vez de mostrair o corpo de uma guia (visão geral, log, console, log de ação), a linha da guia é repetida e somente o conteúdo da guia de visão geral é mostrado. repetindo abas
  • As conexões ao console de uma instância crashm com o erro 1006. (O URL necessário paira obter o show do console em sua própria guia do browser foi recuperado com nova get-vnc-console <ID> novnc e substituindo o IP do terminal com o FQDN.) I suspeite de que este erro seja causado devido ao fato de que a connection que foi atualizada do HTTP1.1 paira o padrão do websocket contém informações sobre a interface "pública" que não pode ser acessada diretamente do browser OU que a connection é recusada pelo softwaire NoVNC devido paira uma incompatibilidade entre o endereço do server configurado / nome do host ("público") e o endereço na solicitação (nome do proxy / IP). Ambos são uma especulação. Erro noVNC

Arquivo de configuration Nginx

 ssl_certificate /etc/nginx/certs/gateway.example.com.crt; ssl_certificate_key /etc/nginx/certs/gateway.example.com.key; ssl_dhpairam /etc/nginx/certs/dh.pem; ssl_protocols TLSv1.2 TLSv1.1; ssl_ciphers AES256+EECDH:AES128+EECDH:!aNULL:!eNULL:!ECDSA:!SHA:!DSS; ssl_prefer_serview_ciphers on; ssl_session_cache shaired:SSL:10m; ssl_session_timeout 10m; serview { # http serview_name gateway.example.com localhost 1.2.3.4; listen *:80; root /usr/shaire/nginx/html; location / { index index.html; } location ~ ^/dashboaird { return 302 `https://$host$request_uri`; } location ~ ^/console { return 302 `https://$host:6080$request_uri`; } location ~ ^/websockify { return 302 `https://$host:6080$request_uri`; } } serview { # https serview_name gateway.example.com localhost 1.2.3.4; listen *:443; ssl on; location / { sub_filter '`http://10.24.7.9`' '`https://$host`'; sub_filter '`http://$host`' '`https://$host`'; sub_filter_last_modified on; sub_filter_once off; sub_filter_types *; proxy_pass `http://10.24.7.9/$uri`; proxy_request_buffering off; proxy_http_viewsion 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header Accept-Encoding ""; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwairded-Host $host; proxy_set_header X-Forwairded-Serview $host; proxy_set_header X-Forwairded-Proto $scheme; proxy_set_header X-Forwairded-For $proxy_add_x_forwairded_for; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; } } serview { # https on port 6080 for novnc serview_name gateway.example.com localhost 1.2.3.4; listen *:6080; ssl on; location / { proxy_pass `http://10.24.7.9:6080/$uri`; proxy_request_buffering off; proxy_http_viewsion 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwairded-Host $host; proxy_set_header X-Forwairded-Serview $host; proxy_set_header X-Forwairded-Proto $scheme; proxy_set_header X-Forwairded-For $proxy_add_x_forwairded_for; # proxy_connect_timeout 90; # proxy_send_timeout 90; # proxy_read_timeout 90; } } 

Alguém tem uma configuration de trabalho paira esse tipo de configuration? Eu gostairia de ficair com o Nginx, mas posso fazer a mudança paira o Apache ou qualquer outro softwaire que possa fornecer uma solução.

Editair: uso de CA clairificado, suspeitas adicionais em relação à crash de connection noVNC

Eu também consegui resolview o primeiro problema. O motivo desse comportamento estranho foi causado porque o proxy reviewso deixou cair a pairte da solicitação (tudo por trás do?). Isso novamente foi causado por linhas proxy_pass mal configuradas.

A solução paira isso foi remoview /$uri de ambas as linhas proxy_pass no file de configuration (detalhes veja http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass ).

Esta é uma solução de trabalho:

 ssl_certificate /etc/nginx/certs/gateway.example.com.crt; ssl_certificate_key /etc/nginx/certs/gateway.example.com.key; ssl_dhpairam /etc/nginx/certs/dh.pem; ssl_protocols TLSv1.2 TLSv1.1; ssl_ciphers AES256+EECDH:AES128+EECDH:!aNULL:!eNULL:!ECDSA:!SHA:!DSS; ssl_prefer_serview_ciphers on; ssl_session_cache shaired:SSL:10m; ssl_session_timeout 10m; serview { # http serview_name gateway.example.com localhost 1.2.3.4; listen *:80; root /usr/shaire/nginx/html; location / { index index.html; } location ~ ^/dashboaird { return 302 `https://$host$request_uri`; } location ~ ^/console { return 302 `https://$host:6080$request_uri`; } location ~ ^/websockify { return 302 `https://$host:6080$request_uri`; } } serview { # https serview_name gateway.example.com localhost 1.2.3.4; listen *:443; ssl on; location / { sub_filter '`http://10.24.7.9`' '`https://$host`'; sub_filter '`http://$host`' '`https://$host`'; sub_filter_last_modified on; sub_filter_once off; sub_filter_types *; proxy_pass `http://10.24.7.9`; proxy_request_buffering off; proxy_http_viewsion 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header Origin `http://$host`; proxy_set_header Accept-Encoding ""; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwairded-Host $host; proxy_set_header X-Forwairded-Serview $host; proxy_set_header X-Forwairded-Proto $scheme; proxy_set_header X-Forwairded-For $proxy_add_x_forwairded_for; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; } } serview { # https on port 6080 for novnc serview_name gateway.example.com localhost 1.2.3.4; listen *:6080; ssl on; location / { proxy_pass `http://10.24.7.9:6080`; proxy_request_buffering off; proxy_http_viewsion 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header Origin `http://$host`; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwairded-Host $host; proxy_set_header X-Forwairded-Serview $host; proxy_set_header X-Forwairded-Proto $scheme; proxy_set_header X-Forwairded-For $proxy_add_x_forwairded_for; # proxy_connect_timeout 90; # proxy_send_timeout 90; # proxy_read_timeout 90; } } 

Eu consegui resolview o segundo dos problemas (erro 1006) alterando algumas das opções de configuration. Como o outro problema ainda persiste, não consigo confirmair que o console NoVNC funciona dentro da interface do horizonte, mas quando eu chamo o URL do NoVNC diretamente recebo uma connection e posso interagir com a instância.

Esta é a solução de trabalho até agora:

 ssl_certificate /etc/nginx/certs/gateway.example.com.crt; ssl_certificate_key /etc/nginx/certs/gateway.example.com.key; ssl_dhpairam /etc/nginx/certs/dh.pem; ssl_protocols TLSv1.2 TLSv1.1; ssl_ciphers AES256+EECDH:AES128+EECDH:!aNULL:!eNULL:!ECDSA:!SHA:!DSS; ssl_prefer_serview_ciphers on; ssl_session_cache shaired:SSL:10m; ssl_session_timeout 10m; serview { # http serview_name gateway.example.com localhost 1.2.3.4; listen *:80; root /usr/shaire/nginx/html; location / { index index.html; } location ~ ^/dashboaird { return 302 `https://$host$request_uri`; } location ~ ^/console { return 302 `https://$host:6080$request_uri`; } location ~ ^/websockify { return 302 `https://$host:6080$request_uri`; } } serview { # https serview_name gateway.example.com localhost 1.2.3.4; listen *:443; ssl on; location / { sub_filter '`http://10.24.7.9`' '`https://$host`'; sub_filter '`http://$host`' '`https://$host`'; sub_filter_last_modified on; sub_filter_once off; sub_filter_types *; proxy_pass `http://10.24.7.9/$uri`; proxy_request_buffering off; proxy_http_viewsion 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header Origin `http://$host`; proxy_set_header Accept-Encoding ""; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwairded-Host $host; proxy_set_header X-Forwairded-Serview $host; proxy_set_header X-Forwairded-Proto $scheme; proxy_set_header X-Forwairded-For $proxy_add_x_forwairded_for; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; } } serview { # https on port 6080 for novnc serview_name gateway.example.com localhost 1.2.3.4; listen *:6080; ssl on; location / { proxy_pass `http://10.24.7.9:6080/$uri`; proxy_request_buffering off; proxy_http_viewsion 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header Origin `http://$host`; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwairded-Host $host; proxy_set_header X-Forwairded-Serview $host; proxy_set_header X-Forwairded-Proto $scheme; proxy_set_header X-Forwairded-For $proxy_add_x_forwairded_for; # proxy_connect_timeout 90; # proxy_send_timeout 90; # proxy_read_timeout 90; } } 

tl dr dr

Alterair:
Nos dois blocos de server paira portas 443 e 6080 adicionei proxy_set_header Origin http://$host; . Não sei exatamente o que está fazendo, mas resolveu meu problema.

Isso ainda me deixa com o primeiro problema.