Как можно перенаправить с HTTP на HTTPS, если IAP настроен с помощью балансировщиков нагрузки GCP?

Как можно перенаправить с HTTP на HTTPS, если IAP настроен с помощью балансировщиков нагрузки GCP?

В настоящее время у меня есть веб-сайт, размещенный на Google Compute Engine, который аутентифицирован с помощью Identity-Aware-Proxy, который находится за балансировщиком нагрузки. Все это отлично работает через https, но я хотел убедиться, что http перенаправляет на https, так как в настоящее время он просто отвечает 404.

Итак, я последовалhttps://cloud.google.com/load-balancing/docs/https/setting-up-http-https-redirectкоторый говорит вам о необходимости настроить второй балансировщик нагрузки для перенаправления http-трафика на https.

Однако проблема в том, что после выполнения этих инструкций, когда я перехожу наhttp://my-website.comЯ получаю следующую ошибку:

Ошибка 403 (Запрещено)!!1

  1. Это ошибка.

У вашего клиента нет разрешения на получение URL / с этого сервера. Это все, что мы знаем.

Хотя балансировщик нагрузки http настроен с 301 - Moved Permanently Full path Redirect, на вкладке сети инструментов разработчика браузера нет никакого редиректа, который происходит. Он просто сразу отвечает 403. URL также остается со схемой http://.


Подводя итог, вот как выглядит моя установка:

Внешний балансировщик нагрузки HTTPS

  • Фронтенд — HTTPS, статический IP, только HTTPS
  • Бэкэнд — Identity-Aware-Proxy (аутентификация электронной почты через Identity Platform) -> группа экземпляров Compute Engine

Внешний балансировщик нагрузки HTTP

  • Фронтенд — HTTP, статический IP (то же, что и балансировщик нагрузки HTTPS выше)
  • Бэкэнд - Нет
  • Правила хоста и пути:
    • Режим:Расширенное правило хоста и пути (перенаправление URL, перезапись URL)
    • Действие:Перенаправить клиента на другой хост/путь
    • Перенаправление хоста: https://my-website.com
    • Значение пути:*
    • Код ответа перенаправления:301 - Перемещено навсегда
    • HTTPS-перенаправление:Включено

Буду очень признателен за любые идеи, как это исправить и не получать ошибку 403!

решение1

То, как вы описалипохоже, у вас проблема с url-mapпотому что вы можете получить доступ к httpверсии своего сайта.

Чтобы быть абсолютно уверенным, дважды проверьте (илисоздавать новое) url-map с gcloudкомандой:

gcloud compute url-maps describe web-map-http

creationTimestamp: '2020-12-02T03:18:27.053-08:00'
defaultUrlRedirect:
  httpsRedirect: true
  redirectResponseCode: MOVED_PERMANENTLY_DEFAULT
fingerprint: KU2hPu1ao=
id: '50586028237895404'
kind: compute#urlMap
name: web-map-http
selfLink: https://www.googleapis.com/compute/v1/projects/xxxxx/global/urlMaps/web-map-http

Когда ваша карта URL будет готова, создайте целевой прокси-сервер:

gcloud compute target-http-proxies create http-lb-proxy \
   --url-map=web-map-http \
   --global

результат:

gcloud compute target-http-proxies describe http-lb-proxy
creationTimestamp: '2020-12-02T03:19:39.090-08:00'
fingerprint: lgJkIY8E=
id: '3781119498457764'
kind: compute#targetHttpProxy
name: http-lb-proxy
selfLink: https://www.googleapis.com/compute/v1/projects/xxxx/global/targetHttpProxies/http-lb-proxy
urlMap: https://www.googleapis.com/compute/v1/projects/xxxx/global/urlMaps/web-map-http

и правило пересылки:

gcloud compute forwarding-rules create http-content-rule \
   --address=lb-ipv4-1 \ # Same IP address used for HTTPS load balancer
   --global \
   --target-http-proxy=http-lb-proxy \
   --ports=80

что должно выглядеть так:

gcloud compute forwarding-rules describe http-content-rule --global
IPAddress: 34.107.123.141
IPProtocol: TCP
creationTimestamp: '2020-12-02T03:22:38.132-08:00'
description: ''
fingerprint: L1vA0Ik9Y=
id: '888330202637841'
kind: compute#forwardingRule
loadBalancingScheme: EXTERNAL
name: http-content-rule
networkTier: PREMIUM
portRange: 80-80
selfLink: https://www.googleapis.com/compute/v1/projects/xxxx/global/forwardingRules/http-content-rule
target: https://www.googleapis.com/compute/v1/projects/xxxx/global/targetHttpProxies/http-lb-proxy

Убедитесь, что вы используете один и тот же публичный IP для HTTP и HTTPS LB. Проверьте правила брандмауэра, не блокируется ли входящий трафик.

Если вы все сделаете правильно, вы должны получить тот же curlрезультат, что представлен в примере.

Связанный контент