在 VirtualBox 中使用 Vagrant 时,特权端口的 NAT 端口转发失败

在 VirtualBox 中使用 Vagrant 时,特权端口的 NAT 端口转发失败

我想在使用 Vagrant 和 VirtualBox 时支持通过特权端口(例如端口 80)连接到客户机,但似乎不起作用。处理这个问题的最佳选择是什么?

我在 Mac 上运行 Vagrant 和 Virtualbox,并有一个 CentOS 7 客户机。在客户机中,我正在试验 Docker,并运行了几个不同的容器。

在我的 Vagrantfile 中,我设置了最小的端口转发规则,并且这些规则由 vagrant 在 VirtualBox 中正确创建。

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # NOTE: This will enable public access to the opened port
  config.vm.network "forwarded_port", guest: 8080, host: 8080
  config.vm.network "forwarded_port", guest: 80, host: 8081
  config.vm.network "forwarded_port", guest: 3306, host: 3306

从 Virtualbox 来看,一切都按预期设置(Nat 网络、转发规则)

VirtualBox 网络配置

端口转发规则

lsof当我在 macOS 上运行时,我看到它的外观和工作方式均符合预期:

VBoxHeadl 1265 david   15u  IPv4 0x54ccbd2a67321437      0t0  TCP localhost:2222 (LISTEN)
VBoxHeadl 1265 david   16u  IPv4 0x54ccbd2a602a3b3f      0t0  TCP *:3306 (LISTEN)
VBoxHeadl 1265 david   17u  IPv4 0x54ccbd2a672ad627      0t0  TCP *:8080 (LISTEN)
VBoxHeadl 1265 david   18u  IPv4 0x54ccbd2a6539fd2f      0t0  TCP *:8081 (LISTEN)

问题

如果我尝试转发特权端口(本例中为 :80),端口转发将不起作用。没有 OSX 进程在 :80 上监听。

在 VM 内部,我可以从正在运行的 Web 服务器获取页面,实际上看起来与 Guest VM 并没有什么不同。

Virtualbox 手册说这不起作用?

在 Virtual Box 手动 NAT 网络部分中,有一个名为6.3.3. NAT 限制

无法转发小于 1024 的主机端口:在基于 Unix 的主机(例如 Linux、Solaris、Mac OS X)上,无法将非 root 运行的应用程序绑定到小于 1024 的端口。因此,如果您尝试配置这样的端口转发,VM 将拒绝启动。

因此,也许这说明这不应该起作用,但是,虚拟机无法启动并不是真的。它在我的例子中运行良好,这让我怀疑手册是在谈论运行虚拟机的主机操作系统,还是客户操作系统。

这是带有 NAT 和端口转发的 Virtualbox 没有启动端口 80 监听器的原因吗?

Vagrant up 上似乎弹出了一条我以前从未见过的消息:

==> default: You are trying to forward to privileged ports (ports <= 1024). Most
==> default: operating systems restrict this to only privileged process (typically
==> default: processes running as an administrative user). This is a warning in case
==> default: the port forwarding doesn't work. If any problems occur, please try a
==> default: port higher than 1024.

因此这似乎确实可以消除任何困惑。


结论

专用网络或桥接网络都是可行的解决方案,允许我利用自然的客户端口,即使它们在主机上具有特权(<1024)。

这也消除了设置单独端口转发的需要。就我而言,专用网络似乎是最佳选择,因为它更安全一些,因为只有我的 Mac 才能看到 Guest。

以下是必要的 Vagrantfile 配置:

# Create a private network, which allows host-only access to the machine   
# using a specific IP.   
config.vm.network "private_network", ip: "192.168.20.20"

这也有利于为客户机在 mac 的 /etc/hosts 文件中添加一个或多个条目,提供便利。

答案1

我认为最佳选择取决于您要执行的所有操作。对于包含 VirtualBox 的服务器环境,我倾向于使用桥接适配器运行所有虚拟机,以便它们在 LAN 上都有 IP 地址。在这种情况下,特权端口没有问题。此外,将虚拟机迁移到新机器相当简单,因为集群中的所有虚拟机都已可由集群中的所有其他虚拟机寻址。

有时,我会通过 启动远程隧道ssh,但这种情况比较少见。这很有用的例子是,在公共 Web 服务器上将我计算机上的 VM 暂时暴露给外界,而无需将我的计算机直接连接到 Internet。

相关内容