Предпосылки
У меня есть проект GCP с двумя кластерами GKE: public-cluster
и частный кластер
. public-cluster
запускает шлюз API, который выполняет централизованную аутентификацию, ведение журнала, ограничение скорости и т. Д. И перенаправляет запросы к внутренним микросервисам, работающим на частном кластере
. Шлюз API построен с использованием Ocelot .
public-cluster
имеет выход в Интернет и использует ingress-nginx для предоставления общедоступного внешнего IP-адреса, который принимает трафик HTTP / s на портах 80/443 .
Назначение частного кластера
состоит в том, что он может принимать только трафик порта 80/443 от общедоступного кластера
. Мы не хотим, чтобы этот кластер был доступен откуда-либо еще, т. Е. Никаких прямых HTTP / s-запросов к частному кластеру
ни изнутри VPC, ни извне, если только трафик не из общедоступного кластера
. Я показал службы, работающие в частном кластере
, с использованием внутреннего балансировщика нагрузки , поэтому каждая служба имеет свой собственный внутренний IP-адрес. Шлюз API использует эти внутренние IP-адреса для перенаправления входящих запросов к внутренним микросервисам.
public-cluster
и private-cluster
находятся в разных подсетях в одном регионе в одном VPC.
] Предполагаемую архитектуру можно увидеть здесь:
.
Проблема
Я пытаюсь создать правила брандмауэра, которые будут блокировать весь трафик в частный кластер
, если только он не исходит от public-cluster
следующим образом:
частный кластер
(с использованием сетевого тега в качестве цели) и 0,0 .0.0 / 0
в качестве диапазона IP-адресов источника private-cluster
public-cluster
Если я использую SSH на узле в public- cluster
и запросы fire curl к службе в частном кластере
(с использованием IP-адреса внутреннего балансировщика нагрузки службы), приведенные выше правила брандмауэра правильно разрешают трафик. Однако, если я отправляю запросы с локального компьютера на public-cluster
API-шлюз, правила брандмауэра блокируют трафик. Похоже, что в этом случае сетевой тег в правиле брандмауэра игнорируется.
Я пробовал несколько вещей, чтобы правила заработали (все безуспешно), например:
общедоступного кластера
в качестве исходного IP-адреса Вопросы
Итак, мои вопросы:
публичном кластере
, разрешались через брандмауэр на private-cluster
? Я заставил это работать, добавив правило брандмауэра, которое разрешает порты 80/443 из диапазона адресов модуля public-cluster
в private-cluster
.
общедоступных кластеров
: gcloud container clusters describe public-cluster --zone europe-west2-a | grep clusterIpv4Cidr
- source-range = XX.XX.XX / XX
с диапазоном адресов модуля): gcloud compute firewall-rules create allow-public-cluster-to-private-cluster \
--direction=INGRESS \
--priority=1000 \
--network=custom-vpc \
--action=ALLOW \
--rules=tcp:80,tcp:443 \
--source-ranges=XX.XX.X.X/XX \
--target-tags=private-cluster
Лучший способ - применить метки к узлам общедоступного кластера, а затем открыть порт в частном кластере, разрешая только данную метку.Все межсетевые экраны gcp могут быть основаны на метках, а не только на IP или классах.
Для собственных кластеров vpc узлы частного кластера смогут взаимодействовать с любым другим экземпляром на этом vpc, но не с любым пункт назначения за пределами vpc. если вы хотите заблокировать даже внутри этого vpc, вы можете пометить узлы соответствующим образом и применить правила брандмауэра к vm с этими тегами.