![](/img/trans.png)
[英]“x-real-ip” & “x-forwarded-for” headers always null on ec2+tomcat
[英]AWS - x-real-ip is ip of nginx-ingress-controller
我目前有以下问题。 我有一个后端位于 nginx-ingress 控制器后面,该控制器用作 aws 中的负载均衡器。 通常我应该通过标头 x-forwarded-for 或 x-real-ip 获取用户的真实 IP。 然而,在我的例子中,这个 ip 总是指向入口控制器的 ip。 我使用 terraform 来设置我的架构。
这是我目前的配置
resource "helm_release" "ingress_nginx" {
name = "ingress-nginx"
namespace = "ingress"
create_namespace = true
chart = "ingress-nginx"
version = "4.0.13"
repository = "https://kubernetes.github.io/ingress-nginx"
values = [
<<-EOF
controller:
service:
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
admissionWebhooks:
enabled: false
EOF
]
}
data "kubernetes_service" "ingress_nginx" {
metadata {
name = "ingress-nginx-controller"
namespace = helm_release.ingress_nginx.metadata[0].namespace
}
}
data "aws_lb" "ingress_nginx" {
name = regex(
"(^[^-]+)",
data.kubernetes_service.ingress_nginx.status[0].load_balancer[0].ingress[0].hostname
)[0]
}
output "lb" {
value = data.aws_lb.ingress_nginx.name
}`
有人知道如何修复此配置中的标头吗?
要在标头中获取真实 IP 地址,入口控制器和 NLB(网络负载均衡器)都需要使用代理协议。 为此,在 terraform 中,您需要使用proxy-protocol
选项配置入口控制器:
resource "helm_release" "ingress_nginx" {
name = "ingress-nginx"
namespace = "ingress"
create_namespace = true
chart = "ingress-nginx"
version = "4.0.13"
repository = "https://kubernetes.github.io/ingress-nginx"
values = [
<<-EOF
controller:
service:
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: nlb
config:
use-forwarded-headers: true
use-proxy-protocol: true
enable-real-ip: true
admissionWebhooks:
enabled: false
EOF
]
}
data "kubernetes_service" "ingress_nginx" {
metadata {
name = "ingress-nginx-controller"
namespace = helm_release.ingress_nginx.metadata[0].namespace
}
}
data "aws_lb" "ingress_nginx" {
name = regex(
"(^[^-]+)",
data.kubernetes_service.ingress_nginx.status[0].load_balancer[0].ingress[0].hostname
)[0]
}
output "lb" {
value = data.aws_lb.ingress_nginx.name
}
现在看来,目前似乎没有办法通过注解服务来让 NLB 使用proxy protocol
。
github中有一些问题提到以下注释可以解决它:
*service.beta.kubernetes.io/aws-load-balancer-type: "nlb-ip"*
和
*service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: "*"*
但是,这些对我不起作用。 因此,我通过执行以下操作通过 AWS 控制台手动启用了proxy protocol
:
AWS console
--> EC2
--> Target groups under load balancing
--> Select Target groups associated with your NLB
--> Attributes
--> Enable proxy protocol 2
我猜想在 terraform 中,最佳解决方案是显式创建具有正确目标组的网络负载均衡器,并将其与入口控制器服务相关联。
这样做,现在我得到了连接到入口控制器的客户端的正确 IP 地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.