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的端口转发不起作用[关闭]的主要内容,如果未能解决你的问题,请参考以下文章