首页 新闻 会员 周边 捐助

net core 部署在nginx上,通过另一台内网机子的nginx转发,取不到真实客户端IP

0
悬赏园豆:10 [已解决问题] 解决于 2017-03-12 22:30

现在我有二台服务器,一台192.168.1.6(WIN2008,NGINX),一台192.168.1.225(CENTOS7, NGINX)
外网地址 blog.niunan.net 访问到 192.168.1.6上,nginx做转发:


server
{
    listen 80;#监听端口
    server_name blog.niunan.net;#域名
    location / {
  proxy_redirect off;
  proxy_set_header Host $host;#访问后端服务器的地址
  proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-Host $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #告知后端服务器的访问来源
        proxy_pass http://192.168.1.225/;#转发到哪里去
    }
    access_log logs/niunantest.log;
}

然后在192.168.1.225上的nginx再转一次:

server {
    listen 80;
    location / {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Host $remote_addr;
        proxy_cache_bypass $http_upgrade;
    }
    access_log logs/niunantest.log;
}

为什么我程序中取到的IP地址还是192.168.1.6呢?

牛腩的主页 牛腩 | 初学一级 | 园豆:-6
提问于:2017-03-07 12:56
< >
分享
最佳答案
0

使用wireshark抓包看看proxy_set_header 设置上头信息了吗

收获园豆:5
2012 | 高人七级 |园豆:21645 | 2017-03-07 13:02

 抓 包发现从192.168.1.6机器上跳转到192.168.1.225的CENTOS机器上是把客户的IP传过去了。
现在就是192.168.1.225机器上的dotnet core程序取不到客户IP。。
牛腩 | 园豆:-6 (初学一级) | 2017-03-12 16:28

@牛腩:  最后不管了,把中间那一层去掉,然后就可以读到了。。

blog.niunan.net → 192.168.1.6:80 → 192.168.1.225:80 → 192.168.1.225:5000

我只接从.1.6:80 转向到 .1.225:5000, 然后就可以找到相应的IP地址了。

牛腩 | 园豆:-6 (初学一级) | 2017-03-12 22:31
其他回答(1)
0

你是通过类似下面的代码获取IP地址的吗?

public static class HttpContextExtensions
{
    public static string GetUserIp(this HttpContext context)
    {
        var ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
        if (string.IsNullOrEmpty(ip))
        {
            ip = context.Connection.RemoteIpAddress.ToString();
        }
        return ip;
    }
}
收获园豆:5
dudu | 园豆:29737 (高人七级) | 2017-03-07 14:04

是的,几种取IP的方法我都试过了,都是只取到192.168.1.6,
下面是我的CORE代码:

 

我也试着把header都打印出来,结果还是发现全部是192.168.1.6

 

支持(0) 反对(0) 牛腩 | 园豆:-6 (初学一级) | 2017-03-07 14:12

@牛腩: 在第2台nginx的配置似乎有问题

proxy_set_header X-Real-IP $remote_addr;

这里应该从第1台发过来的X-Real-IP请求头中获取,而不是从$remote_addr中获取。

支持(0) 反对(0) dudu | 园豆:29737 (高人七级) | 2017-03-07 14:30

@dudu: 改成$http_x_real_ip;了好像也不行呢?已经 nginx -s reload了

支持(0) 反对(0) 牛腩 | 园豆:-6 (初学一级) | 2017-03-07 14:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册