端口转发:在 Virtual Box 下模拟 Ubuntu 上的公共 IP

端口转发:在 Virtual Box 下模拟 Ubuntu 上的公共 IP

我需要在运行 Windows 10 的笔记本电脑上的虚拟机上安装一个用 Ubuntu 制作的演示应用程序,以便向同一国家/地区不同位置的潜在客户展示,但虚拟环境中的这个应用程序在外部应该被视为具有确切的 IP。原因是我们有一个由 ISP 提供的公共 IP(假设为 11.22.33.44),并且访问必须是公共的;实际上,验证远程访问的方法之一是通过该应用程序的 IP。事实上,在这个虚拟设备中,它将运行一个客户通过客户的本地网络(例如 192.168.ab)访问服务(通过浏览器),如下例所示(虚构值),

> ------------------ +
>                    [---------------]                   [------------]
> Guest (Ubuntu)     [ Host (W10)    ]                   [ Web Server ]
> Static IP          [ Static IP     ]--- Internet --- >>[ Static IP  ]
> 11.22.33.44        [ 192.168.0.100 ]                   [ 11.22.33.x ]
>                    [---------------]                   [------------]
> ------------------ +

但我尝试过的所有方法都没有奏效;我甚至无法成功对任何公共 IP 执行 PING。在 VirtualBox 中,我尝试了几种组合,如下所示:

Settings >> Network >> NAT >> (virtuo-net) >> Port Fowarding
--TCP: HostIP = blank || HostPort = 6789 || GuestIP = blank || GuestPort = 80
--UDP: HostIP = blank || HostPort = 4567 || GuestIP = blank || GuestPort = 53

在 Guest (Ubuntu) 中,我通过 GUI 界面以及通过以下方式为网络设置以下配置/etc/网络/接口(尽管这里已经提到 GUI 配置优先于手动配置)

auto 
iface lo inet loopback

auto enp0s3
iface inet enp0s3 static
address 11.22.33.44
netmask 255.255.255.0
network 11.22.33.0
broadcast 11.22.33.254
gateway 11.22.33.1
dns-nameservers 8.8.8.8 8.8.4.4

如果我遗漏了什么,有人可以提供见解吗?

答案1

不确定你为什么要使用端口转发——它不是甚至接近去完成你想做的事情。

相反,您的客户端虚拟机需要通过 VPN 连接到 11.22.33.44 的物理所在网络。

为什么“端口转发”不起作用

  1. 您正在尝试添加“端口转发”规则来转换 TCP 和 UDP。Ping 既不是 TCP 也不是 UDP;它是 ICMP。

  2. 您正在尝试从虚拟机进行传出连接,但“端口转发”的目的是转换传入连接(即从主机 IP 地址到客户的 DNAT)。SNAT 会更合适(如果有的话)。如果您在 VirtualBox 中选择“NAT”网络,它会自动执行 SNAT,但是...

  3. DNAT(“端口转发”)和 SNAT 的最终目的都是转换地址。由于您在虚拟机的网络接口上配置了 11.22.33.44想要让 11.22.33.44 在外部互联网上可见,似乎翻译正是你所需要的想。

为什么不会任何这些工作

假设您只有基本的 IP 配置:您的客户操作系统配置为 11.22.33.44/24 作为其 IP 地址,并以 11.22.33.1 作为网关。

问题 #2:您的示例在相同的11.22.33.0/24 子网与客户端虚拟机相同。如果确实如此,则您的虚拟机将假定服务器与虚拟机本身位于同一个“虚拟 LAN”上 - 它永远不会尝试根本无法通过互联网网关到达它。

(顺便说一下,11.22.33.0/24 的广播地址是 11.22.33。255,而不是 254。您可以通过根本不尝试手动指定广播地址来避免此错误:操作系统可以完全自行计算它。)

但假设服务器的 IP 地址实际上位于不同的子网中(或者您可能正在尝试 ping Google)。那么,是的,客户端 VM 将尝试通过其网关向 Internet 发送数据包。但将发生以下情况:

  • 如果虚拟机配置为“NAT”网络,则 VirtualBox 将对所有传出的数据包进行 SNAT,使它们看起来像是从主机自己的 IP 地址(本例中为 192.168.0.100)发送的。这不是您想要的。

    当这些经过转换的数据包离开主机 PC 并到达客户的本地路由器后,它会再次对这些数据包进行 SNAT,使它们看起来像是从客户的公共 IP 地址发送的。这也不是您想要的结果。

  • 如果虚拟机配置为“桥接”网络,则客户操作系统将尝试在客户的 LAN 上找到其网关 - 当然其中没有 11.22.33.1。

如果虚拟机配置为“仅主机”网络,并且主机操作系统上相应的虚拟 LAN 接口配置为 11.22.33.1/24如果主机操作系统启用了 IP 路由/转发(在 Windows 上有点麻烦),那么数据包实际上有机会不经修改地离开主机 PC。但它不会走太远:

  • 客户的 LAN 路由器很可能会无论如何都对数据包进行 SNAT,将客户的公共 IP 地址而不是您的 IP 地址作为源。

  • 如果路由器没有执行 SNAT 并发送未修改的数据包,它可能会被 ISP 拒绝。(许多 ISP 会阻止带有“欺骗性”IP 源地址的数据包,希望是出于明显的安全原因。)

  • 如果数据包逃过了路由器的 SNATISP 的反欺骗过滤器并成功到达目标服务器……回复将转至贵公司的网络,因为 IP 地址就在那里真的换句话说,互联网上的随机服务器实际上并不知道您的笔记本电脑正在“借用”该 IP 地址。

如何实现这一点

总之,即使您可以访问服务器,服务器也无法访问您 - 它的回复要么停留在同一个子网中,要么通过互联网传输,但无论如何,所有发往 11.22.33.44 的数据包都将到达您的“家庭” ISP,然后到达您公司的网络。

所以你需要一些方法告诉您公司的网络如何访问笔记本电脑内的虚拟机,以便虚拟机可以接收发往 11.22.33.44 的数据包。这通常是通过设置隧道或者 VPN。(其实是一样的。)

你必须:

  1. 在您的公司网络上设置一个 VPN 服务器(如果还没有的话);
  2. 让客户端虚拟机连接到VPN;
  3. 配置 VPN服务器拥有 IP 地址 11.22.33.44(几种可能的方法之一,但可能是最简单的方法)。

相关内容