VirtualBox NAT网络下的端口转发:从主机访问客户机
使用VirtualBox时,NAT网络模式是最简单、最省心的选择——你不需要配置任何网络桥接或路由,虚拟机就能通过主机连上外网。但代价也很明显:NAT中的虚拟机对主机和外部网络是完全“隐身”的。这样一来,当你需要从主机直接访问虚拟机里的服务(比如SSH登录、运行Web应用)时,就会碰壁。
解决办法其实不复杂:启用VirtualBox NAT的端口转发功能。把主机上的某个端口映射到虚拟机的对应端口,所有发往那个主机端口的流量都会被自动“翻译”给虚拟机。下面来看看具体怎么操作——你可以通过图形界面(GUI)完成,也可以直接敲命令行,各取所需。
通过GUI配置端口转发
在VirtualBox主界面中,选中你要配置的虚拟机,点击“设置”。然后进入“网络”菜单,展开当前网络适配器下的“高级”选项——没错,端口转发的入口就藏在这里。

点击“端口转发”按钮,会弹出一个规则配置窗口。点击右上角的“添加”图标,就可以开始填写参数了。

一条完整的转发规则需要填写以下六项:
- 名称:随意起一个唯一的名字,比如“SSH”
- 协议:TCP(SSH走TCP协议)
- 主机IP:127.0.0.1(即仅允许本地主机访问)
- 主机端口:2222(只要大于1024且未被占用即可)
- 客户机IP:虚拟机的实际IP地址(可以在虚拟机内通过
ip addr查看) - 客户机端口:22(SSH默认端口)

保存规则后,启动虚拟机,端口转发就会自动生效。你可以用下面这条命令确认主机2222端口是否已被VirtualBox监听:
$ sudo netstat -nap | grep 2222

一切就绪后,在主机终端里执行以下命令,就能像登录本地服务一样SSH到虚拟机了:
$ ssh -p 2222 @127.0.0.1
发送到 127.0.0.1:2222 的请求,会被VirtualBox自动翻译成 10.0.2.15:22 ——没错,这就是NAT模式下虚拟机的默认网关地址,端口转发正是靠这个机制实现穿透的。
通过命令行配置端口转发
如果你更习惯用命令行,或者需要在脚本中自动化配置,VirtualBox自带的 VBoxManage 工具可以帮你轻松搞定。以下命令为名为 centos7 的虚拟机添加一条SSH端口转发规则:
$ VBoxManage modifyvm "centos7" --natpf1 "SSH,tcp,127.0.0.1,2222,10.0.2.15,22"
注意规则名称(本例中为“SSH”)必须是唯一的。创建完成后,可以用下面的命令验证网络适配器的配置是否生效:
$ VBoxManage showvminfo "centos7" | grep NIC

效果和GUI配置完全一致。如果你需要转发HTTP服务(比如Web服务器),只需把客户机端口改为80,主机端口换成8080之类的空闲端口即可。端口转发本质上是将虚拟机从NAT的“黑盒”里拉出一条通道,让你既能享受NAT的简洁,又不必牺牲本地的可访问性——算是一种实用的折中方案。
