将主机端口80转发到VirtualBox端口80无效。

23

我已经阅读了VirtualBox端口转发指南、这个网站和其他网站上的类似问题,但找不到解决方案。

在客户机操作系统(Ubuntu)上启用了UFW,端口80和22是开放的。我可以从主机ssh到Ubuntu,并且可以从主机浏览器访问Ubuntu站点。

在客户机上,我设置了NAT和hostonly(vboxnet3)适配器,并打开了路由器端口80(192.168.1.90),客户机IP为192.168.70.10。

因此,在guest设置中 > NAT > 端口转发 我设置如下:

TCP 主机IP: 192.168.1.90 主机端口:80 客户机IP:192.168.70.10 客户机端口:80

然而,这个设置不起作用。如果您能指导我走向正确的道路,我将不胜感激。


我也遇到了同样的问题,但是将主机上超过1024的端口映射到客户机的80端口是可以工作的,但是将主机上的80端口映射到客户机上的任何端口都不起作用...我正在使用Mac上的Virtual Box。如果您找到了解决方案,请告诉我吗? - ramesh.mimit
4个回答

33

正如 William 所提到的,Linux/Unix操作系统不允许进程监听小于1024的端口,除非它们以root身份运行。虚拟机软件 VirtualBox 可以以 root 身份运行,但我读过一些关于这样做的可怕警告。这可能非常不安全。

相反,设置 Apache2 在主机系统上侦听端口80(通常已经设置为侦听),但不要在主机上提供网站服务,而是将其代理到主机上的某个更高端口,比如8080。

然后,让 VirtualBox 将该高端口转发到客户机操作系统的端口80。

Apache2 的设置如下:

  1. 安装 HTTP 代理模块
  2. a2enmod proxy_http
  3. 确保 /etc/apache2/ports.conf 文件中有一个指令 Listen 80
  4. /etc/apache2/sites-available 中添加另一个站点或修改默认站点(或者直接在 ports.conf 中添加以下代码)
  5. <VirtualHost *:80>
        ProxyPreserveHost On
        ProxyRequests Off
        ProxyPass / http://localhost:8080/
        ProxyPassReverse / http://localhost:8080/
    </VirtualHost>
    
  6. 重启 Apache 服务
  7. service apache2 restart

VirtualBox 的设置是 主机端口:8080,客户端端口:80

流量将按以下方式处理:

client --> host:80 --> Apache --> host:8080 ---> vbox NAT ----> guest:80

这与William的ssh隧道类似,但不需要每次重新启动主机时手动干预(重新输入密码)。


4
如果您的主机操作系统是*nix操作系统,您可以使用iptables将来自端口80的流量重定向到主机操作系统上的更高端口。这比涉及Apache或SSL隧道要好得多。 - Peter
1
使用代理模块转发SSL请求是否同样简单?例如 <VirtualHost *:443> 或者还需要其他步骤? - Michael Butler
@MichaelButler -- 我不得不为了SSL设置它,并在Apache2配置中制定了自己的版本,其中包括额外的https / SSL内容。详见:https://superuser.com/questions/1427245/how-do-i-access-low-port-numbers-forwarded-from-virtualbox-port-forwarding-on-li/1427787#1427787 - adowdy

10
这里有另一种方法可以解决如果您不想以root用户身份运行VirtualBox的问题。您可以使用SSH设置端口转发,将主机端口80转发到某个非受限制的端口(在下面的示例中,我使用端口8080),然后再将其转发到客户端口80。虽然有些复杂,但它确实可行。
  1. Forward from host port 8080 to guest port 80. Make sure it is functioning by pointing a browser at port 8080 on your host machine.
  2. Make sure sshd is running on your host. In Mac OS X, go to System Preferences -> Internet & Wireless -> Sharing and make sure Remote Login is checked.
  3. Become root on your host

    $ sudo su -
    
  4. Forward host port 80 to host port 8080 using SSH (the bind address \* makes the port available on all interfaces).

    # ssh yourusername@localhost -L \*:80::8080
    
请注意,它会要求您使用您的用户名的凭据登录,因此很可能会要求您输入密码,并在成功后将您实际登录。
现在,您应该能够访问主机上的80端口,并看到与访问主机上的8080端口相同的服务,也就是客户端操作系统上的80端口。
如果您不希望网络中的其他人能够访问该机器上的80端口,但仍希望能够从主机系统的浏览器访问它,请将端口绑定到localhost
# ssh yourusername@localhost -L localhost:80::8080

6
根据http://www.virtualbox.org/manual/ch06.html#natforward,主机端口转发 < 1024 不可能:
在基于 Unix 的主机上(例如 Linux、Solaris、Mac OS X),未经 root 运行的应用程序无法绑定到低于 1024 的端口。因此,如果尝试配置此类端口转发,则虚拟机将拒绝启动。
可以以 root 身份运行 VirtualBox,这将允许你转发低于 1024 的主机端口。因此,如果坚持要使用 VirtualBox 进行此操作,可以成为 root 并以以下方式执行 VirtualBox:
$ sudo su -
# VirtualBox

0

地址='0.0.0.0'。在您的http服务启动命令中添加此选项,将允许来自任何IP地址的连接,否则可能会受到本地(内部Virtualbox)的限制。您可以使用curl进行测试,如果在盒子内部工作,则应该在外部也能工作,否则请执行以下操作

敬礼


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