我想在使用 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 网络、转发规则)
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。