如何在VirtualBox上正确进行端口转发?

3

我在VirtualBox中连接客户操作系统时遇到了问题。

我的环境如下:

  • 宿主机:MacOSX(Lion)
  • 客户操作系统:CentOS(5.7,2.6.18-274.3.1.el5)
  • VirtualBox版本:4.1.4 r74291 -- 网络适配器类型:NAT

在客户操作系统中,我可以看到httpd正常运行,如下所示:

$ ps aux | grep httpd
root      2571  0.0  3.5 258440  8824 ?        Ss   08:20   0:00 /usr/sbin/httpd
apache    2573  0.0  2.2 258440  5780 ?        S    08:20   0:00 /usr/sbin/httpd
apache    2574  0.0  2.0 258440  5184 ?        S    08:20   0:00 /usr/sbin/httpd
apache    2575  0.0  2.0 258440  5180 ?        S    08:20   0:00 /usr/sbin/httpd
apache    2576  0.0  2.0 258440  5180 ?        S    08:20   0:00 /usr/sbin/httpd
apache    2577  0.0  2.0 258440  5180 ?        S    08:20   0:00 /usr/sbin/httpd
apache    2578  0.0  2.0 258440  5180 ?        S    08:20   0:00 /usr/sbin/httpd
apache    2579  0.0  2.0 258440  5180 ?        S    08:20   0:00 /usr/sbin/httpd
apache    2580  0.0  2.0 258440  5180 ?        S    08:20   0:00 /usr/sbin/httpd
$ curl localhost
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
...

在主机操作系统中,我进行了以下端口转发配置:
$ VBoxManage showvminfo CentOS_3 | grep "NIC 1"
NIC 1:           MAC: 080027B1FA87, Attachment: NAT, Cable connected: on, Trace: off (file: none), Type: Am79C973, Reported speed: 0 Mbps, Boot priority: 0, Promisc Policy: deny
NIC 1 Settings:  MTU: 0, Socket (send: 64, receive: 64), TCP Window (send:64, receive: 64)
NIC 1 Rule(0):   name = http, protocol = tcp, host ip = , host port = 8003, guest ip = , guest port = 80
NIC 1 Rule(1):   name = ssh, protocol = tcp, host ip = , host port = 2203, guest ip = , guest port = 22

根据这份信息,我正在尝试将8003端口转发至80端口以及2203端口转发至22端口。实际上,我可以通过"ssh -p 2203 localhost"连接到客户操作系统。然而,当我尝试查看http://localhost:8003时,浏览器显示"无法加载网页,因为服务器未发送任何数据"。
在主操作系统中,当我尝试使用"telnet localhost 8003"时,似乎该端口正在侦听,但是客户操作系统的访问日志中没有任何记录。
请问我应该怎么解决这个问题?谢谢! (补充内容:10月14日15:55)
$ netstat -nl | grep tcp | grep 127.0.0.1 # Host OS
tcp4       0      0  127.0.0.1.8003         127.0.0.1.64698        ESTABLISHED
tcp4       0      0  127.0.0.1.64698        127.0.0.1.8003         ESTABLISHED
tcp4       0      0  127.0.0.1.26164        127.0.0.1.53917        ESTABLISHED
tcp4       0      0  127.0.0.1.53917        127.0.0.1.26164        ESTABLISHED
tcp4       0      0  127.0.0.1.2203         127.0.0.1.53183        ESTABLISHED
tcp4       0      0  127.0.0.1.53183        127.0.0.1.2203         ESTABLISHED

$ netstat -nl | grep tcp # Guest OS
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:952                 0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN
tcp        0      0 :::80                       :::*                        LISTEN
tcp        0      0 :::22                       :::*                        LISTEN
tcp        0      0 :::443                      :::*                        LISTEN

愚蠢的问题时间:客人是否配置了防火墙? - mkj
请发布一个 "netstat -nl|grep tcp" 命令。 - evildead
谢谢你的回复!我添加了netstat的结果。我认为没有问题... - yinkyweb
2个回答

1

看起来像是 mkj 所说的,您安装了防火墙。

尝试以 root 身份运行: yum install system-config-firewall-tui

运行 system-config-firewall-tui,选择自定义并确保选中“WWW(HTTP)”。


0

虽然这是一个老问题,但对于某些人可能仍有帮助,因为我今天遇到了这个问题。 正如mkj所提到的,问题出在客户操作系统(在我的情况下是Centos 6)的防火墙上。它允许ssh(端口22)连接,但阻止其他连接。我无法从主机访问运行在客户操作系统中(在端口5432上)的postgresql服务器。因此,在客户操作系统上执行以下iptables命令即可解决问题:

 $ sudo iptables -I INPUT -p tcp -m tcp --dport 5432 -j ACCEPT

在您的情况下,针对运行在80端口的httpd服务器,您可能需要执行以下操作:
 $ sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT

当我将Ubuntu/Debian作为Guest OS运行时,我从未遇到过这个问题,所以很可能防火墙在它们中没有配置。


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