Vagrant的端口转发不起作用[关闭]

Posted

技术标签:

【中文标题】Vagrant的端口转发不起作用[关闭]【英文标题】:Vagrant's port forwarding not working [closed] 【发布时间】:2011-08-24 11:05:15 【问题描述】:

我在Getting Started guide for vagrant 的末尾遇到了一个小问题。我正在开发一个运行 Apache2 的 CentOS basebox(通过 Puppet 进行配置)。我已经使用Vagrantfile 中的以下行为 Web 请求设置了端口转发:

 config.vm.forward_port "web", 80, 4567

但是当我向那个端口发出请求时,它们会失败。 Safari 报告的错误是'Safari 无法打开页面“http://localhost:4567/”,因为服务器意外断开了连接。'

我做了vagrant reload 并在滚动中看到“[default] -- web: 80 => 4567 (adapter 1)”,那么我应该从哪里开始解决这个问题?谢谢。

【问题讨论】:

curl -v 'http://localhost:4567/' 说什么?有时 Safari 在隐藏错误消息方面有点过分了。 另外,来自 VM 本身的 curl 'http://localhost:80' 是否有效?如果不是,则问题不在于端口转发。 虚拟机内部的 @Steve Losh curl 正在工作。主持人的curl 给了我(52) Empty reply from server 流浪者重新加载帮助我解决类似的问题... 对我来说,symfony 3 的情况是: - 当运行 sudo php bin/console server:run 使服务器在127.0.0.1:8000 上运行时,我无法从 Web 浏览器访问,curl 在访问的虚拟机中。在 web 目录中运行 sudo php -S 0.0.0.0:8000 时,我可以访问 127.0.0.1:8082/app_dev.php 。不明白为什么会发生这种情况,但有效。 【参考方案1】:

我想补充一点,这通常是由 VM 中的服务器引起的,因为它绑定到 127.0.0.1,即环回。您需要确保服务器绑定到0.0.0.0,以便所有接口都可以访问它。

一些内置的应用服务器,例如 Django 的开发服务器和一些 Ruby 服务器,默认默认为127.0.0.1,因此需要注意这一点。

除此之外,Steve 所说的也是正确的:确保它在 VM 内工作,并尝试一些其他简单的服务器来尝试找出是否是配置问题。

【讨论】:

这是 shotgun 运行 webrick 所需的修复程序。 这解决了我的问题。要将 Torquebox 绑定到 0.0.0.0 运行它:torquebox run -b 0.0.0.0 是的,这就是问题所在。需要绑定到 0.0.0.0。我想知道 Vagrant 以后有没有办法自动解决这个问题? sinatra 和 webrick 的同样问题:"set :bind, '0.0.0.0'" 解决了这个问题 这对我来说是解决办法【参考方案2】:

我会让这个成为一个实际的答案,而不是更多的 cmets。

第一件事:在虚拟机中尝试curl 'http://localhost:80'。如果这不起作用,那肯定不是端口转发。

下一步:从您的主机尝试curl -v 'http://localhost:4567/'。 Curl 可能会比 Safari 提供更好的错误消息。

我会检查是否没有设置防火墙来限制对端口 80 的访问。默认的 Vagrant VM (Ubuntu) 没有设置防火墙,但你说你正在使用其他东西,所以它可能值得一试。

如果不是这样,请尝试在端口 80 上创建除 Apache 之外的其他内容。Python 附带一个您可以使用的简单 HTTP 服务器——转到带有 index.html 的文件夹并运行 sudo python -m SimpleHTTPServer 80,然后尝试使用从两个盒子卷曲。如果可行,那么它可能是 Apache 配置问题。如果是这种情况,我没有足够的 Apache 经验来提供帮助(我使用 nginx)。

【讨论】:

基本上,我很讨厌 RedHat 和 iptables。我检查以确保传入连接的默认策略是 ACCEPT,但没有注意 RedHat 的自定义规则链,它有一个包罗万象的 REJECT 规则作为链中的最后一条规则。 tl;博士我有一个防火墙挡住了,只是没有注意到。 谢谢!那个鬼鬼祟祟的防火墙规则是导致我在 RHEL 5.5 上出现问题的原因。 我在下面转载 Robert 的评论,因为这是一种非常简单的检查方法:以 root 身份运行 service iptables stop 以快速排除访客防火墙问题。如果需要,稍后重新启用它。 对于奇怪的 centos 图像有同样的问题; iptables 几乎限制了一切。我关注了这个iptable centos guide(section 3 Writing a Simple Rule Set 中的解决方案),它就像一个魅力:) 对我来说 curl 在里面工作,所以我在Vagrantfile 中启用了网络并运行了命令vagrant reload【参考方案3】:

我在 CentOS 6.3 w/NGINX 上遇到了同样的问题,并在 vagrant box 的 iptables 中找到了答案。

从 vagrant box 上的 bash 中,按照以下步骤操作:

首先列出当前的iptable规则

iptables -L -v

然后刷新当前规则:

iptables -F

在 tcp 端口 22 上允许 SSH 连接

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

为 INPUT、FORWARD 和 OUTPUT 链设置默认策略

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

为本地主机设置访问权限

iptables -A INPUT -i lo -j ACCEPT

接受属于已建立和相关连接的数据包

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

保存设置

/sbin/service iptables save

列出修改后的规则

iptables -L -v

Curl localhost:[port#] 或从外部 vagrant 在浏览器中点击它

在此处找到有关 CentOS iptable 配置的更多信息:

http://wiki.centos.org/HowTos/Network/IPTables

祝你好运。

【讨论】:

感谢您撰写本文。我在 Fedora 18 上遇到了同样的问题,所以它不是 CentOS 特有的。我希望这对其他人有所帮助。 :) 这是 CentOS 上的我。 service iptables stop iptables -F 一个人为我做了这件事 我找到了一个可靠的解决方案,使用这篇博文中列出的一些 exec 命令来解决同样的问题 techie-notebook.blogspot.com/2014/05/… 我不得不用 $os_path 部分替换我的路径,因为我没有有该变量可用。【参考方案4】:

对我来说更好的解决方案是禁用防火墙

service iptables stop
chkconfig iptables off

【讨论】:

+1 为我工作。对于使用本地 VirtualBox 实例,我不需要防火墙。 如果您想要临时修复,这是一个很好的技巧【参考方案5】:

我还想添加另一个注释,例如 Mitchell。如果我的情况,我将它从 80 转发到 6789

$ curl -v http://localhost:6789

我得到了

<HTML>
<HEAD><TITLE>Redirection</TITLE></HEAD>
<BODY><H1>Redirect</H1></BODY>

然后,我改用 IP 地址,它得到了正确的 html 消息。

【讨论】:

以上是关于Vagrant的端口转发不起作用[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

端口使用Vagrant转发时连接重置

vagrant配置端口转发

Docker端口转发不起作用

firewall-cmd centos 端口转发似乎不起作用?

无法访问 Prometheus 仪表板/端口转发不起作用

在现有的vagrant box上添加端口转发