【问题标题】:Get IP of user in NATed virtual server获取 NATed 虚拟服务器中用户的 IP
【发布时间】:2015-01-10 17:28:50
【问题描述】:

我在 VirtualBox 中有 Windows Server 和 NATed 端口 80。 Request.UserHostAddress 返回虚拟网络的本地 IP。 我应该如何获得用户的IP?

【问题讨论】:

  • 为什么?反正那是不可能的。
  • @fejesjoco 我不知道。我的服务器是 Debian,我在 Virtual Box 中安装了 Windows Server 2012

标签: c# asp.net virtualbox nat


【解决方案1】:

您遇到的问题是您无法看到 NAT 之外的内容。 NAT 代表Network Address Translation,因此在这种情况下,您看到的是 NAT 设备的公共 IP 地址,而不是客户端。这就是它的工作方式。客户端可以发送其本地 IP 地址,但您需要在客户端上有一些东西才能做到这一点。

另一种选择是从 NAT 切换到桥接网络。桥接意味着 VM 所在的虚拟网络与主机所在的物理网络并排连接。这意味着它们将具有位于同一子网上的 IP 地址,并且可以从同一网络上的任何其他地方路由。网桥的作用类似于交换机/集线器,NAT 的作用类似于路由器。

只要您的服务器/客户端之间没有任何 NAT 设备,使用标准机制(例如 context.Request.ServerVariables["REMOTE_ADDR"]Request.UserHostAddress 等)就应该很容易看到 IP

【讨论】:

  • 您说是出于测试目的...在生产服务器中这样做有什么问题吗?我在 VPS @Basic 中使用 IIS、MailEnable、FTP 等。
  • 一点也不...我说“出于测试目的”的唯一原因是让您尝试并证明它有效。我假设您出于某种原因而不是任意决定而进行了 NAT。如果没有,那么桥接绝对是您想要的方式。我们以这种方式配置了许多生产服务器。我会编辑
【解决方案2】:

您想获取用户的公共 IP 地址吗? 最简单的方法是简单地创建一个 PHP 脚本来回显远程地址,或者使用执行此操作的现有 API。

PHP:

<?php
    echo $_SERVER["REMOTE_ADDR"];
?>

C#:

using (var client = new HttpClient()) {
    var response = await client.GetStringAsync(new Uri("URL"));
    IPAddress ip;

    if (IPAddress.TryParse(response, out ip)) {
        //Success
    }
}

【讨论】:

  • 你的两段代码做的不一样。 C# 部分甚至可以做什么?
  • 他们不应该做同样的事情; C# 代码使用 HttpClient 读取字符串(这是由 PHP sn-p 回显的 IP 地址)。一种非常可靠的获取外部 IP 地址的方法。
  • 该信息应该在您的答案中,但无论如何,OP 并不是在寻找公共 IP 地址。 OP 认为他可以通过 NAT 获取客户端的“真实”IP 地址。
猜你喜欢
  • 2017-11-16
  • 2013-11-12
  • 2013-01-23
  • 2018-05-04
  • 2015-03-27
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多