如果服务器在路由器后面,如何获取用户的公共IP?

5
如果我的服务器在路由器后面,我如何获取用户的公共IP?
我正在尝试:
protected string GetIPAddress() 
{
    System.Web.HttpContext context = System.Web.HttpContext.Current;
    string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
    if (!string.IsNullOrEmpty(ipAddress))
    {
        string[] addresses = ipAddress.Split(',');
        if (addresses.Length != 0)
        {
            return addresses[0];
        }
    }
    return context.Request.ServerVariables["REMOTE_ADDR"]; 
}

但是我只得到了路由器网关。

显然,在我的情况下,REMOTE_ADDRHTTP_X_FORWARDED_FOR都无法使用。

你有什么方法可以在我的情况下获取用户的公共IP地址吗?

谢谢。


5
转储所有传入的HTTP头文件。如果所需值不在其中,则无法获取。如果存在,则可以查看如何获取该值。 - usr
1
@PicrofoEGY,听起来问题是关于 Web 服务器端的反向代理。你需要小心,不要不断地将反向代理的地址报告为用户的地址。 - Marc Gravell
@MarcGravell 谢谢您提供的信息。祝您有一个美好的一天 :) - Picrofo Software
客户端IP地址不在HTTP头中。 - user1761123
@MarcGravell 很不幸,我并不拥有这个服务器,但是我被要求开发一个网站来跟踪用户的IP是否在某个范围内。虽然我尝试了上面的代码,但我注意到无论我从哪里打开网站,我总是得到相同的IP地址,这让我得出结论,这个IP实际上是路由器的网关。 - user1761123
显示剩余5条评论
3个回答

2
你正在尝试在HTTP层面处理IP和路由。在应用层,数据包已经通过路由/IP层,并且该信息已被剥离。你在HTTP层面看到的数据包与远程端点在其应用层级别发送的完全相同,该数据包不包含IP信息,因此在HTTP头中查找不会有帮助。正如@Marc Gravell所说,一些反向代理确实将此信息添加到HTTP头中。因此,如果您配置了反向代理,请检查它是否这样做。此答案列出了您可以检查的其他服务器变量。

这完全取决于所使用的基础设施;许多反向代理等将添加此信息(作为请求中的HTTP标头)。 - Marc Gravell

0

唯一可靠的方法是联系互联网上的某些已知服务,该服务将告诉您它看到您的请求来自哪个IP地址。当然,该服务必须继续运行并且可达,否则此功能将失效。例如,http://whatismyip.com


我已经尝试过http://jsonip.appspot.com/,它可以正常工作,但我需要一个C# APS.NET方法。 - user1761123
正确。因此,您需要进行一些跨域黑客攻击,使用户的浏览器访问像这样的站点并将结果返回给您。 - John Watts
顺便说一下,我并不是在说这是找出用户请求来源的好方法或“正确”方法。我只是在说,在托管环境中,可能真的没有其他方法,除了利用互联网上的某些其他服务,这些服务不会被代理隐藏用户的IP。 - John Watts

0

无法获取它。

但是,您可以查找用户是从本地网络还是从Web打开页面。

如果IP是路由器分配给来自Web的请求的IP,则清楚它来自Web。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接