未从入口控制器获取源 IP

时间:2021-06-02 12:24:48

标签: nginx amazon-elb amazon-eks nginx-ingress

我们已经设置了 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 的文章,但在我们的案例中没有用。

1 个答案:

答案 0 :(得分:0)

入口控制器 nginx.conf 也设置了 proxy_set_header X-Real-IP $remote_addr; 指令。我在 ingress 中添加了以下注释并且它起作用了。

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>;