Задний план
У меня есть проект GCP с двумя кластерами GKE: public-cluster
и private-cluster
. public-cluster
запускает шлюз API, который выполняет централизованную аутентификацию, ведение журнала, ограничение скорости и т. д. и перенаправляет запросы на серверные микросервисы, работающие на private-cluster
. Шлюз API построен с использованием Оцелот.
public-cluster
имеет выход в Интернет и использует ingress-nginx для предоставления общедоступного внешнего IP-адреса, который принимает трафик HTTP / s на портах 80/443.
Намерение для private-cluster
это может принимать трафик порта 80/443 только от public-cluster
. Мы не хотим, чтобы этот кластер был доступен откуда-либо еще, т.е. никаких прямых HTTP / s-запросов к private-cluster
либо изнутри VPC, либо извне, если трафик не из public-cluster
. Я открыл службы, работающие на private-cluster
используя внутренний балансировщик нагрузки, поэтому у каждой службы есть собственный внутренний IP-адрес. Шлюз API использует эти внутренние IP-адреса для перенаправления входящих запросов на внутренние микросервисы.
public-cluster
и private-cluster
находятся в разных подсетях в одном регионе в одном VPC.
Предполагаемую архитектуру можно увидеть здесь:
.
Эта проблема
Я пытаюсь создать правила брандмауэра, которые будут блокировать весь трафик на private-cluster
если это не исходит от public-cluster
, следующим образом:
private-cluster
(используя сетевой тег в качестве цели) и 0.0.0.0/0
в качестве диапазона IP-адресов источникаprivate-cluster
public-cluster
Если я подключусь по SSH к узлу внутри public-cluster
и запускать запросы curl к службе на private-cluster
(с использованием IP-адреса внутреннего балансировщика нагрузки службы) указанные выше правила брандмауэра правильно разрешают трафик. Однако, если я отправлю запросы с локального компьютера на public-cluster
API Gateway, правила брандмауэра блокируют трафик. Похоже, что в этом случае сетевой тег в правиле брандмауэра игнорируется.
Я пробовал несколько вещей, чтобы правила работали (все безуспешно), например:
public-cluster
внешний IP-адрес nginx в качестве исходного IP-адресаВопросы
Итак, мои вопросы:
public-cluster
разрешено через брандмауэр private-cluster
?Я заставил это работать, добавив правило брандмауэра, которое разрешает порты 80/443 из public-cluster
диапазон адресов pod'а в private-cluster
сетевые теги.
public-clusters
Диапазон адресов пода:gcloud container clusters describe public-cluster --zone europe-west2-a | grep clusterIpv4Cidr
--source-ranges=XX.XX.X.X/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
Для собственных кластеров vpc частные узлы кластера смогут взаимодействовать с каждым другим экземпляром на этом vpc, но не с любым местом назначения за пределами vpc. если вы хотите заблокировать даже внутри этого vpc, вы можете пометить узлы соответствующим образом и применить правила брандмауэра к vm с этими тегами.
Лучший способ - применить метки к узлам общедоступного кластера, а затем открыть порт в частном кластере, разрешая только данную метку. Все брандмауэры gcp могут быть основаны на метках, а не только на IP или классах.