У меня есть установка Triple-O OpenStack (Liberty), в которой даже «общедоступная» сеть находится в частной среде (10.24.7.0/ 24 сеть). Единственный способ получить доступ к этой сети - через хост-шлюз. Я хочу сделать Horizon доступным из Интернета с помощью обратного прокси. Из соображений безопасности все внешние коммуникации должны быть зашифрованы через HTTPS. com загружает index.html, где можно загрузить сертификат ЦС, использованный для подписи сертификата сервера.
sub_filter 'http: // $ host' 'https: // $ host';
) и другой, заменяющей IP-адрес конечной точки OpenStack ( sub_filter ' http://10.24.7.9 '' https: // $ host ';
)
Horizon позволяет пользователю подключаться к последовательной консоли экземпляра через NoVNC, встроенный в Horizon . NoVNC использует веб-сокеты для установления двунаправленного TCP-соединения между браузером и физическим хостом, на котором работает экземпляр. интерфейс, к которому нельзя получить доступ напрямую из браузера ИЛИ что соединение отклонено программным обеспечением NoVNC из-за несоответствия между настроенным адресом сервера / именем хоста ("общедоступный") и адресом в запросе (имя прокси / IP). Оба эти предположения являются предположениями. ssl_certificate /etc/nginx/certs/gateway.example.com.crt;
ssl_certificate_key /etc/nginx/certs/gateway.example.com.key;
ssl_dhparam /etc/nginx/certs/dh.pem;
ssl_protocols TLSv1.2 TLSv1.1;
ssl_ciphers AES256+EECDH:AES128+EECDH:!aNULL:!eNULL:!ECDSA:!SHA:!DSS;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
server { # http
server_name gateway.example.com localhost 1.2.3.4;
listen *:80;
root /usr/share/nginx/html;
location / {
index index.html;
}
location ~ ^/dashboard {
return 302 `https://$host$request_uri`;
}
location ~ ^/console {
return 302 `https://$host:6080$request_uri`;
}
location ~ ^/websockify {
return 302 `https://$host:6080$request_uri`;
}
}
server { # https
server_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_version 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-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
}
}
server { # https on port 6080 for novnc
server_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_version 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-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_connect_timeout 90;
# proxy_send_timeout 90;
# proxy_read_timeout 90;
}
}
Есть ли у кого-нибудь рабочая конфигурация для такого рода установки? Я хотел бы придерживаться Nginx, но могу внести изменения в Apache или любое другое программное обеспечение, которое может предоставить решение.
Edit: разъяснено использование CA, добавлены подозрения относительно сбоя соединения NoVNC
Мне также удалось решить первую проблему. Причина такого странного поведения была вызвана тем, что обратный прокси-сервер отбросил часть запроса (все, что стоит за?). Это опять же было вызвано неверно настроенными строками proxy_pass.
Решением было удалить / $ uri
из обеих строк proxy_pass в файле конфигурации (подробности см. http://nginx.org/ ru / docs / http / ngx_http_proxy_module.html # proxy_pass ).
Это рабочее решение:
ssl_certificate /etc/nginx/certs/gateway.example.com.crt;
ssl_certificate_key /etc/nginx/certs/gateway.example.com.key;
ssl_dhparam /etc/nginx/certs/dh.pem;
ssl_protocols TLSv1.2 TLSv1.1;
ssl_ciphers AES256+EECDH:AES128+EECDH:!aNULL:!eNULL:!ECDSA:!SHA:!DSS;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
server { # http
server_name gateway.example.com localhost 1.2.3.4;
listen *:80;
root /usr/share/nginx/html;
location / {
index index.html;
}
location ~ ^/dashboard {
return 302 `https://$host$request_uri`;
}
location ~ ^/console {
return 302 `https://$host:6080$request_uri`;
}
location ~ ^/websockify {
return 302 `https://$host:6080$request_uri`;
}
}
server { # https
server_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_version 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-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
}
}
server { # https on port 6080 for novnc
server_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_version 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-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_connect_timeout 90;
# proxy_send_timeout 90;
# proxy_read_timeout 90;
}
}
Мне удалось решить вторую проблему (ошибка 1006), изменив некоторые параметры конфигурации. Поскольку другая проблема все еще сохраняется, я не могу подтвердить, что консоль NoVNC работает из пользовательского интерфейса Horizon, но когда я вызываю URL-адрес NoVNC напрямую, я получаю соединение и могу взаимодействовать с экземпляром.
Это рабочее решение до сих пор:
ssl_certificate /etc/nginx/certs/gateway.example.com.crt;
ssl_certificate_key /etc/nginx/certs/gateway.example.com.key;
ssl_dhparam /etc/nginx/certs/dh.pem;
ssl_protocols TLSv1.2 TLSv1.1;
ssl_ciphers AES256+EECDH:AES128+EECDH:!aNULL:!eNULL:!ECDSA:!SHA:!DSS;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
server { # http
server_name gateway.example.com localhost 1.2.3.4;
listen *:80;
root /usr/share/nginx/html;
location / {
index index.html;
}
location ~ ^/dashboard {
return 302 `https://$host$request_uri`;
}
location ~ ^/console {
return 302 `https://$host:6080$request_uri`;
}
location ~ ^/websockify {
return 302 `https://$host:6080$request_uri`;
}
}
server { # https
server_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_version 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-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
}
}
server { # https on port 6080 for novnc
server_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_version 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-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_connect_timeout 90;
# proxy_send_timeout 90;
# proxy_read_timeout 90;
}
}
Изменения:
В обоих серверных блоках для портов 443 и 6080 я добавил proxy_set_header Origin http: // $ host;
. Не знаю точно, что это делает, но это решило мою проблему.
Это все еще оставляет меня с первой проблемой.
Я наткнулся на это пока я тоже боролся с этим некоторое время. И это мне очень помогло. Однако nginx не любит кавычки вокруг http: // $ host и т. Д. Когда вы их удаляете, он работает. Например, для меня это рабочая конфигурация:
ssl_certificate /etc/ssl/cert.pem;
ssl_certificate_key /etc/ssl/cert.key;
ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!EXP:!LOW:!MEDIUM;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
server { # http
server_name openstack.example.com;
listen *:80;
location / {
return 302 https://$host$request_uri;
}
location ~ ^/console {
return 302 https://$host:6080$request_uri;
}
location ~ ^/websockify {
return 302 https://$host:6080$request_uri;
}
}
server { # https
server_name openstack.example.com;
listen *:443;
ssl on;
location / {
sub_filter 'http://192.168.0.200:6080' 'https://$host:6080';
sub_filter 'http://$host:6080' 'https://$host:6080';
sub_filter_last_modified on;
sub_filter_once off;
sub_filter_types *;
proxy_pass http://192.168.0.200;
proxy_request_buffering off;
proxy_http_version 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-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
}
}
server { # https on port 6080 for novnc
server_name openstack.example.com;
listen *:6080;
ssl on;
location / {
proxy_pass http://192.168.0.200:6080;
proxy_request_buffering off;
proxy_http_version 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-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
}
}
Я отправляю это, потому что, возможно, кто-то ищет обновленный ответ.