我在设置仅对某些特定IP开放的入口时遇到麻烦,检查了文档,尝试了很多工作,并且源外的IP仍在访问。那是使用nginx的阿尔卑斯山上的Zabbix Web界面,在节点端口80上设置服务,然后使用入口在GCP上设置负载均衡器,一切正常,Web界面运行良好,但是如何使它可访问仅适用于所需的IP? 我的防火墙规则还可以,并且只能通过负载均衡器IP访问
此外,我有一个用于此部署的特定名称空间。
集群版本1.11.5-gke.5
编辑,我正在使用GKE标准入口GLBC
我的模板是可配置的,如下所示,有人可以帮助我了解丢失的内容:
apiVersion: v1
kind: ReplicationController
metadata:
name: zabbix-web
namespace: zabbix-prod
labels:
app: zabbix
tier: frontend
spec:
replicas: 1
template:
metadata:
labels:
name: zabbix-web
app: zabbix
spec:
volumes:
- name: cloudsql-instance-credentials
secret:
defaultMode: 420
secretName: cloudsql-instance-credentials
containers:
- command:
- /cloud_sql_proxy
- -instances=<conection>
- -credential_file=/secrets/cloudsql/credentials.json
image: gcr.io/cloudsql-docker/gce-proxy:1.11
imagePullPolicy: IfNotPresent
name: cloudsql-proxy
resources: {}
securityContext:
allowPrivilegeEscalation: false
runAsUser: 2
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /secrets/cloudsql
name: credentials
readOnly: true
- name: zabbix-web
image: zabbix/zabbix-web-nginx-mysql:alpine-3.2-latest
ports:
- containerPort: 80
env:
- name: MYSQL_USER
valueFrom:
secretKeyRef:
key: <user>
name: <user>
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
key: <pass>
name: <pass>
- name: DB_SERVER_HOST
value: 127.0.0.1
- name: MYSQL_DATABASE
value: <db>
- name: ZBX_SERVER_HOST
value: <db>
readinessProbe:
failureThreshold: 3
httpGet:
path: /index.php
port: 80
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
name: "zabbix-web-service"
namespace: "zabbix-prod"
labels:
app: zabbix
spec:
ports:
- port: 80
targetPort: 80
selector:
name: "zabbix-web"
type: "NodePort"
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: zabbix-web-ingress
namespace: zabbix-prod
annotations:
ingress.kubernetes.io/service.spec.externalTrafficPolicy: local
ingress.kubernetes.io/whitelist-source-range: <xxx.xxx.xxx.xxx/32>
spec:
tls:
- secretName: <tls-cert>
backend:
serviceName: zabbix-web-service
servicePort: 80
答案 0 :(得分:0)
AFAIK,您不能通过GLBC或GCP L7 Load Balancer itself来限制IP地址。请注意,在撰写本文时,GLBC也在进行中。
ingress.kubernetes.io/whitelist-source-range
很好用,但是当您使用类似nginx ingress controller之类的东西时,因为nginx本身是can restrict IP addresses。
限制/将IP地址列入白名单的一般方法是使用VPC Firewall Rules(似乎您已经在做)。本质上,您可以将IP地址限制/添加到运行K8s节点的网络的白名单中。
答案 1 :(得分:0)
实现目标的最佳选择之一是使用防火墙规则,因为您不能通过Global LB或GCP L7 LB本身来限制IP地址。但是,如果您在 Kubernetes 群集上使用 Ingress ,则可以采用另一种选择,即可以基于专用IP地址限制对应用程序的访问。
一个可能的用例是您具有开发设置,并且不想让所有人都可以使用所有精美的新功能,尤其是竞争对手。在这种情况下,可以使用 IP白名单 来限制访问。
这可以通过通过ingress.kubernetes.io/whitelist-source-range
注释指定允许的客户端IP源范围来完成。
该值为逗号分隔的CIDR块列表。
例如:
10.0.0.0/24, 1.1.1.1/32.
请获取更多信息here。
答案 2 :(得分:0)
对于像我一样通过Google偶然发现此问题的任何人,现在都有解决方案。您可以通过BackendConfig
Kubernetes API中的cloud.google.com
结合GCE CloudArmor策略来实现。
https://cloud.google.com/kubernetes-engine/docs/how-to/cloud-armor-backendconfig
答案 3 :(得分:0)
您可以通过configuring Ingress and Cloud Armour将IP列入白名单:
切换到项目:
gcloud config set project $PROJECT
创建策略:
gcloud compute security-policies create $POLICY_NAME --description "whitelisting"
将默认策略更改为拒绝:
gcloud compute security-policies rules update 2147483647 --action=deny-403 \
--security-policy $POLICY_NAME
要以比默认白名单低的优先级将要白名单的所有IP:
gcloud compute security-policies rules create 2 \
--action allow \
--security-policy $POLICY_NAME \
--description "allow friends" \
--src-ip-ranges "93.184.17.0/24,151.101.1.69/32"
每个范围最多十个。
请注意,您需要有效的CIDR范围,为此您可以使用CIDR to IP Range -> IP Range to CIDR。
按以下方式查看策略:
gcloud compute security-policies describe $POLICY_NAME
要丢弃条目:
gcloud compute security-policies rules delete $PRIORITY --security-policy $POLICY_NAME
或完整的政策:
gcloud compute security-policies delete $POLICY_NAME
为此策略创建一个BackendConfig:
# File backendconfig.yaml:
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
namespace: <namespace>
name: <name>
spec:
securityPolicy:
name: $POLICY_NAME
$ kubectl apply -f backendconfig.yaml
backendconfig.cloud.google.com/backendconfig-name created
将BackendConfig添加到Service:
metadata:
namespace: <namespace>
name: <service-name>
labels:
app: my-app
annotations:
cloud.google.com/backend-config: '{"ports": {"80":"backendconfig-name"}}'
spec:
type: NodePort
selector:
app: hello-app
ports:
- port: 80
protocol: TCP
targetPort: 8080
使用正确的选择器,并将服务的接收端口指向之前创建的BackendConfig。
现在,Cloud Armor会将策略添加到GKE服务中。
在https://console.cloud.google.com/net-security/securitypolicies中可见(选择$PROJECT
后)。