如果我们的整个系统还有用 Cloudflare的CDN的话。 这个时候我们想获得真实的IP 就需要编辑 ingress-nginx-controller的 configmap
kubectl edit configmap ingress-nginx-controller
加上 enable-real-ip 和 real_ip_header 如下:
apiVersion: v1
data:
enable-real-ip: "true"
server-snippet: |
real_ip_header CF-Connecting-IP;
kind: ConfigMap
metadata:
这样 cloudflare 的 CF-Connecting-IP 就会放到 x-Forwarded-For x-Real-IP 的 http header里面。程序通过这两个可以读到真实的IP
_httpContextAccessor.HttpContext.Connection.RemoteIpAddress 这个出来是一个蛮奇怪的地址 ::ffff:10.244.0.20
在Asp.net core当中还可以设置 UseForwardedHeaders 这样 判断是不是https的代码都不需要改动。 在.net5.0里面会导致 x-Forwarded-For 从request.Headers里面消失
public void Configure(IApplicationBuilder application, IHostingEnvironment environment)
{
var options = new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders = ForwardedHeaders.All
// ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto 只用这两个的话。swagger会出错
};
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
application.UseForwardedHeaders(options);
// ...
}