【问题标题】:RemoteIpAddress in K8S Cluster is always the ingress IPK8S 集群中的 RemoteIpAddress 始终是入口 IP
【发布时间】:2020-09-22 13:26:38
【问题描述】:

我有一个在本地裸机 Kubernetes 集群中运行的 ASP.NET Core webapi。没有外部负载均衡器,我使用的是 NGINX 入口。

我想获取用户的 IP 地址,并在 .NET 代码中使用 HttpContext.Connection.RemoteIpAddress

不幸的是,这是获取 nginx 入口的 IP 地址(可能是给定命名空间的控制器)...

::ffff:10.244.1.85

执行反向 DNS 查找可将其解析为...

10-244-1-85.ingress-nginx.ingress-nginx.svc.cluster.local

经过一番谷歌搜索后,我尝试将externalTrafficPolicy: "Local" 添加到我的服务定义中,但这并没有什么不同。

这看起来应该是非常微不足道且相当普遍的要求。有什么想法吗?

【问题讨论】:

  • 这个问题是否提供了有用的答案? stackoverflow.com/questions/39774846/…
  • 不幸的是,这并没有什么不同。
  • 可以发一下ingress的配置吗?
  • 您是否检查过 Web 应用程序中的 HTTP 标头?典型的解决方案是在 Nginx 中设置 X-Forwarded-For 并在应用程序中使用它。如果缺少标头,则使用远程地址,如果存在,则使用标头中的值。
  • @ewramner 我没有检查标题。刚试了一下,header就在那里,但是设置为集群内部的“10.244.1.0”,而不是我机器的IP地址。

标签: nginx kubernetes nginx-ingress


【解决方案1】:

首先尝试从headerX-Forwarded-For获取ip,如下图,如果为null则可以使用Connection.RemoteIpAddress。还要确保您的 nginx 配置映射已根据屏幕截图启用代理:

var ip = IPAddress.Parse(_accessor.ActionContext.HttpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault());
            if (string.IsNullOrEmpty(ip.ToString()))
            {
                ip = _accessor.ActionContext.HttpContext.Connection.RemoteIpAddress.MapToIPv4();
            }

【讨论】:

    猜你喜欢
    • 2021-03-04
    • 1970-01-01
    • 2021-11-23
    • 2020-02-17
    • 2021-12-27
    • 2020-04-24
    • 2019-10-02
    • 1970-01-01
    相关资源
    最近更新 更多