使用NAT适配器的VirtualBox端口转发无法工作

35

我正在使用VirtualBox进行简单的端口转发,似乎VirtualBox.exe正在主机上监听端口,但实际上没有将连接转发到虚拟机。我已经尝试了多个端口,并且多次重启了VirtualBox。另一方面,从虚拟机到主机的连通性是正常的。以下是详细信息:

Host: Win7 x64
Guest: Win7 x64
VirtualBox version: VirtualBox 4.2.10
Firewalls: All firewalls on host and guest disabled.

Virtual Box > Machine Settings > Network
 Adapter 1: 
  Attached to: NAT
  Cable Connected : True
  Port Forwarding:
   Rule 1: TCP, HostIP=127.0.0.1, HostPort=8081, GuestIP=127.0.0.1, GuestPort=8081

On Host:
[VirtualBox.exe]  TCP    127.0.0.1:8081         IBM-6KT5OPCF76P:0      LISTENING

On Guest:
I never get the connection request on port 8081 or any others I've tried.

有什么想法吗?我希望避免使用VirtualBox的桥接适配器,有多种原因。我认为使用VirtualBox进行NAT端口转发相对简单。

谢谢!

10个回答

47

Paravirtualized Network* (virtio-net)是关键

  1. 选择您要进行端口转发的虚拟机。

    • 注意:确保虚拟机处于停止模式。
  2. 选择“设置”

  3. 选择“网络”
  4. 选择任何可用的适配器。假设“适配器2”
  5. 启用“启用网络适配器”
  6. 在连接到下拉列表中选择“NAT”
  7. 选择“高级”
  8. 在适配器类型中:选择“Paravirtualized Network(virtio-net)”[这很重要]
  9. 选择“端口转发”
  10. 在“端口转发”对话框的右侧部分,选择“+”
  11. 提供以下内容

    • 名称:任何您想要的名称。以ssh为例,说“ ssh”
    • 协议:协议类型[对于ssh:TCP]
    • 主机IP:提供您要连接到的主机名[在此处:127.0.0.1]
    • 主机端口:您要连接到远程端口的那个主机上的端口[例如:60022]
    • 客户IP:留空
    • 客户端口:从上述主机要连接到哪个端口。[对于ssh,默认为22]

3
我的问题在于我试图使用主机上的22端口。当我将其更改为高端口(8080)时,它就可以工作了。 - John
9
在适配器类型中,选择“虚拟化网络(virtio-net)”[这很重要]。你是完全正确的——当我从默认的“Intel PRO/1000 MT Desktop”模拟器切换到virtio-net模拟器时,端口转发神奇地开始工作了。但我找不到任何文档记录这一点,你是如何知道的呢? - Joshua Davies
@JoshuaDavies 有时候人们的想法是一样的。我也正是这样想的 :) 去问他或者了解一下。我曾经也处于你现在的情况。 - Nickromancer
也许我有点晚了。我有一个类似的问题,只有在虚拟机从DHCP获取IP地址时才能解决。有人知道为什么吗? - ricoderks
2
我和约翰一样。不要将主机端口设置为22,它不起作用。当我将其更改为“2222”并保存后,立即可以连接到端口2222。无需重新启动计算机或其他任何操作。 - Christopher Done
@John 可能是因为主机也在端口22上提供SSH服务,导致了端口冲突。如果要使用端口22作为主机端口,请确保在主机上禁用sshd服务。 - felipeek

20

您指定了错误的客户端IP地址,应该是客户端的IP地址(如果将IP地址静态分配给客户端)或者将其留空。请注意,您将主机IP指定为127.0.0.1,这意味着您转发的端口只能从该端口访问(如果不是您所需的,则也应为空)。

VBoxManage modifyvm "win" --natpf1 ",tcp,,8081,,8081"

也许这是你一直想做的事情。(请点击此处获取更多详情)


4
看起来这个问题已经解决了。我的意图是将 [主机上的localhost:8081] 转发到 [虚拟机上的localhost:8081]。正如 wlevchenko 所说,只需进入“端口转发”对话框,并在两个IP列中简单地删除“127.0.0.1”(并留空)即可解决问题。我确实需要重新启动虚拟机才能使端口转发生效。 - Roberto Olivares
2
实际上端口转发的更改不应该需要虚拟机重启,真正需要的是在pf规则更改后,客户端显示任何网络活动。 - vvlevchenko

11

不清楚您使用的是哪个客户操作系统。

我曾经遇到过同样的问题。

我的主机是MAC电脑,而虚拟机中运行的是CentOS 7。
我在VirtualBox上启用了从guest到host的ssh端口22和http端口80的NAT端口转发。

但是我发现无法通过http连接从我的MAC电脑主机访问Centos 7客户操作系统上的Apache HTTP服务器。

为了解决这个问题,我必须将firewalld服务设置为允许端口80连接。


你开始吧!我有完全相同的问题。对我来说,firewall-cmd有效。 - Obaid Maroof
2
遇到了完全相同的问题,运行以下命令停止防火墙,一切都很顺利!>systemctl stop firewalld.service - chendu
相同的问题...和相同的解决方案:当我禁用firewalld防火墙时,端口转发开始正常工作(MAC主机和CentOS客户机)。 - Pablo Ezequiel Inchausti

4
在Mac主机和Fedora客户端的设置中遇到了类似的问题。尝试从主机访问运行在客户端8000端口上的http web服务器。通过在客户端使用firewall-cmd打开8000/tcp端口解决该问题。
sudo firewall-cmd --zone=public --add-port=8000/tcp

2
我曾遇到类似的问题,结果是一些由名为 proxycap 的企业代理拦截软件安装的网络堆栈中未签名驱动程序导致虚拟机设置端口转发时出错。在设置端口转发并列出未签名驱动程序时,请检查您的 VM 机器日志以获取错误消息,并卸载对应的应用程序。

我也在VBox.log中看到了那些消息,但那不是原因。我签署了那些ProxyCap dll文件,但NAT仍然无法工作。这里是VirtualBox NAT与ProxyCap不兼容的解释:https://forums.virtualbox.org/viewtopic.php?f=6&t=82910&p=488206#p488206 - miro

1
如果有人遇到同样的问题,尝试卸载诸如ProxyCap、proxifier等重定向工具。VirtualBox NAT与它们不兼容。如果您尝试跟踪VirtualBox网络,则日志中不会显示任何错误消息,并且在pcap文件中也看不到任何内容。禁用ProxyCap是不够的,必须卸载它或使用"netsh winsock reset"重置您的网络配置,但ProxyCap将不再适用于您。

对我来说,ProxyCap存在问题已经得到确认。 - mukunda

1

1

如果有其他人遇到了和我一样的问题,我在这里记录了我的错误:

我使用CentOS 7作为主机,Windows作为客户机。

唯一阻碍我的问题是:我忘记在客户机中禁用Windows防火墙设置。一旦禁用它,一切都正常工作。


1
我这样连接到我的Centos7:

Virtual Box > Machine Settings > Network
Adapter 1: 
Attached to: NAT
Cable Connected : True
Port Forwarding:
  Rule 1: TCP, HostIP=127.0.0.1, HostPort=8081, GuestIP=10.0.2.15, GuestPort=8081

$> ssh -p8081 [change]@127.0.0.1


0
在我的情况下,客户机操作系统是CentOS8,主机操作系统是Ubuntu 22.04,转发的端口在主机上是1022,我将其更改为10022,然后它就可以工作了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接