nginx - 没有从入口控制器获取源 IP
问题描述
我们已经设置了 EKS 集群来部署应用程序。流量的流向是Nginx->LB->IngressController->Application。其中 nginx 是 L7 代理。我们设置了以下参数以在标头中转发源 IP。
location ~* /example/version/test {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://second.example.com;
}
请求被转发到我们与入口控制器一起设置的 AWS CLB。在入口控制器配置映射中,我们添加了这些参数以从 X-Forwarded-For/X-Real-IP 中提取源 IP。
proxy-real-ip-cidr: <VPC CIDR>
use-forward-headers: "true"
当请求到达 pod 时,它会在 X-Real-IP 和 X-Forwarded-For 标头中显示 EKS 节点 IP 地址。我又添加了一个自定义标头“ip-test”来测试转发的标头,如下所示。
location ~* /example/version/test {
proxy_set_header X-Real-IP $remote_addr;
add_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header 'ip-test' $remote_addr;
proxy_pass http://second.example.com;
}
令人惊讶的是,此标头显示实际源 IP,但 X-forwarded-For 和 X-Real-IP 仅显示节点 IP。我阅读了许多人建议添加externalTrafficPolicy: Local但在我们的案例中不起作用的文章。
解决方案
入口控制器 nginx.conf 也在设置proxy_set_header X-Real-IP $remote_addr;
指令。我在入口中添加了下面的注释并且它起作用了。
nginx.ingress.kubernetes.io/configuration-snippet: |
real_ip_header X-Real-IP;
real_ip_recursive on;
set_real_ip_from <VPC CIDR>;
set_real_ip_from <PROXY IP>;
推荐阅读
- java - 如何使用 java.sql.Timestamp 减去日期
- django - 通过电子邮件 django 发送 HTML 模板
- jsf - 当文本文件有前导空格时,上传文件 ricefaces 失败
- java - 如何为瑞典帐号生成 IBAN
- jquery - 需要有关 jquery ajax 的建议
- python - 使用 Excel 或 Python 求解器自动安排解决方案
- javafx - JavaFX TableView 数据格式化
- cql - 在 CQL 中查询日期
- oracle - 如何从 Amazon RDS 导出和导入架构 Oracle
- javascript - 如何使用 javascript 中的 moment.js / Date 将 EST 时间数据转换为本地时间