我的目标是通过GCE入口过滤由nginx服务的Kubernetes Engine上部署的角度应用的IP地址访问。
但是在我的nginx上,remote_addr不对。
$ LB_IP是此处定义的IP:kubernetes.io/ingress.global-static-ip-name:app-angular
我在nginx上使用set_real_ip_from从X-Forwarded-For
设置ipset_real_ip_from $LB_IP;
real_ip_header X-Forwarded-For;
原始IP来自Google文档中预期的X-Forwarded-For标头:https://cloud.google.com/compute/docs/load-balancing/http/#components
我可以看到X-Forwarded-For包含$ CLIENT_IP但是remote_addr不正确,顺便说一下我的IP过滤器无效。有什么想法吗?
我的nginx日志:
10.40.40.40 - - [07 / Feb / 2018:11:29:48 +0000]" GET /styles.bundle.css HTTP / 1.1" 200 35908" http://MY_URL/home" " Mozilla / 5.0(Macintosh; Intel Mac OS X 10_13_3)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 64.0.3282.140 Safari / 537.36" " $ CLIENT_IP,$ LB_IP"
但我想:
$ CLIENT_IP - - [07 / Feb / 2018:11:29:48 +0000]" GET /styles.bundle.css HTTP / 1.1" 200 35908" http://MY_URL/home" " Mozilla / 5.0(Macintosh; Intel Mac OS X 10_13_3)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 64.0.3282.140 Safari / 537.36" " $ CLIENT_IP,$ LB_IP"
我的Ingress配置:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: app-angular
spec:
rules:
- host: MY_URL
http:
paths:
- backend:
serviceName: app-backend
servicePort: 80
我的后端配置:
apiVersion: v1
kind: Service
metadata:
name: app-backend
spec:
type: NodePort
selector:
app: app-angular
ports:
- port: 80
targetPort: 80
我的部署配置:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: app-angular
spec:
replicas: 2
revisionHistoryLimit: 2
template:
metadata:
labels:
app: app-angular
tier: frontend
spec:
containers:
- name: app-angular
image: gcr.io/MY_PROJECT/app-angular:MY_TAG
imagePullPolicy: Always
ports:
- containerPort: 80
我的nginx配置:
server {
listen 80;
root /usr/share/nginx/html;
location / {
set_real_ip_from $LB_IP;
real_ip_header X-Forwarded-For;
allow 130.211.0.0/22; #Google IP
allow $CLIENT_IP; # FILTERED IP
allow 10.0.0.0/8; #internal network
deny all;
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
}
}
有什么想法吗?
答案 0 :(得分:0)
您提供的链接专门针对GCP负载均衡器。 至于nginx Load Balancer,您应该考虑将ExternalTrafficPolicy annotation添加到NodePort服务以保留客户端IP。
我还发现一个类似的问题可以追溯到2017年中期,这表明certain versions of the nginx controller存在问题,请确保您使用的图像仍然没有此问题。
最后,您可能需要添加use-proxy-protocol: "true" with the configuration ConfigMap,因为您使用的入口充当使用代理的HTTP(S)负载均衡器。
答案 1 :(得分:0)
我们在HTTP GCLB ingress
前面使用nginx ingress
。要让RealIP
工作,我添加了
kind: ConfigMap
apiVersion: v1
metadata:
name: ingress-nginx
labels:
k8s-addon: ingress-nginx.addons.k8s.io
data:
##
## Google Infra Blocks needed
## 130.211.0.0/22,35.191.0.0/16
##
## Google Cloud Load Balancer
## GCLB-IP/32
proxy-real-ip-cidr: 130.211.0.0/22,35.191.0.0/16,[YOUR-GCLB-IP]/32
这允许nginx
信任来自Google基础架构的X-Forwarded-For
。
答案 2 :(得分:0)
他们是两个解决方案(gcbirzan帮助我解决GCP问题):
1)使用来自IP地址范围的良好IPS更新我的nginx配置:
IP地址范围可在此处找到:https://console.cloud.google.com/networking/networks/list。 您只需为区域或所有需要的区域添加set_real_ip_from即可。 不要忘记on_ip_recursive on;
server {
listen 80;
root /usr/share/nginx/html;
location / {
set_real_ip_from 10.128.0.0/20;
...
real_ip_header X-Forwarded-For;
real_ip_recursive on;
allow 130.211.0.0/22; #Google IP
allow $CLIENT_IP; # FILTERED IP
allow 10.0.0.0/8; #internal network
deny all;
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
}
}
2)使用以下内容更新我的后端配置:
externalTrafficPolicy:Local
apiVersion: v1
kind: Service
metadata:
name: app-backend
spec:
type: NodePort
selector:
app: app-angular
ports:
- port: 80
targetPort: 80
externalTrafficPolicy: Local
更新nginx配置:
现在$ remote_addr中显示的IP将使用您的客户端请求和Google Infra IPS的负载均衡器IP设置:130.211.0.0/22,35.191.0.0/16
不要忘记on_ip_recursive on;
server {
listen 80;
root /usr/share/nginx/html;
location / {
set_real_ip_from $LB_IP;
set_real_ip_from 130.211.0.0/22;
set_real_ip_from 35.191.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
allow 130.211.0.0/22; #Google IP
allow 35.191.0.0/16; #Google IP
allow $CLIENT_IP; # FILTERED IP
allow 10.0.0.0/8; #internal network
deny all;
index index.html index.htm;
try_files $uri $uri/ /index.html =404;
}
}