O encaminhamento de porta do Vagrant não está funcionando [fechado]

108

Estou tendo um pequeno problema no final do guia de primeiros passos paravagrant . Estou trabalhando em um basebox CentOS que tem o Apache2 em execução (provisionamento via Puppet). Configurei o encaminhamento de portas para solicitações da web usando a seguinte linha em Vagrantfile:

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

Mas quando faço solicitações para essa porta, eles falham. O erro relatado pelo Safari é 'O Safari não pode abrir a página “ http: // localhost: 4567 / ” porque o servidor interrompeu inesperadamente a conexão.'

Eu fiz um vagrant reloade vi "[padrão] - web: 80 => 4567 (adaptador 1)" no pergaminho, então por onde devo começar a solucionar isso? Obrigado.

Hank Gay
fonte
1
O que quer curl -v 'http://localhost:4567/'dizer? Às vezes, o Safari é muito bom em esconder mensagens de erro.
Steve Losh
2
Além disso, curl 'http://localhost:80'a própria VM funciona? Caso contrário, o problema não é o encaminhamento de porta.
Steve Losh
4
@Steve Losh curlde dentro da VM está funcionando. curldo anfitrião me dá (52) Empty reply from server.
Hank Gay
O reload vagabundo me ajuda em uma questão semelhante ...
haudoing
Para mim, o caso foi com o symfony 3: - ao executar sudo php bin / console server: run que faz o servidor rodar em 127.0.0.1:8000, então não consigo acessar do navegador da web, curl na máquina virtual acessada. Quando executei sudo php -S 0.0.0.0:8000 no diretório da web, pude acessar 127.0.0.1:8082/app_dev.php . Não entendo porque isso acontece, mas funciona.
Darius.V

Respostas:

80

Vou fazer desta uma resposta real em vez de apenas mais comentários.

Primeira coisa: tente curl 'http://localhost:80'de dentro da VM. Se isso não funcionar, então definitivamente não é o encaminhamento de porta.

Em seguida: experimente curl -v 'http://localhost:4567/'em sua máquina host. O Curl pode fornecer uma mensagem de erro melhor do que o Safari.

Eu verificaria se não há firewalls configurados restringindo o acesso à porta 80. O Vagrant VM padrão (Ubuntu) não vem com um firewall configurado, mas você disse que está usando outra coisa, então pode valer a pena checar.

Se não for isso, tente fazer algo diferente do Apache listado na porta 80. Python vem com um servidor HTTP simples que você pode usar - vá para a pasta com index.htmle execute sudo python -m SimpleHTTPServer 80, depois tente acertar com curl em ambas as caixas. Se funcionar, provavelmente é um problema de configuração do Apache. Não tenho experiência suficiente com o Apache para ajudar se for esse o caso (eu uso o nginx).

Steve Losh
fonte
14
Basicamente, sou péssimo em RedHat e iptables. Eu verifiquei para ter certeza de que a política padrão era ACCEPTpara conexões de entrada, mas não prestei atenção à cadeia de regras personalizadas do RedHat, que tem uma REJECTregra pega-tudo como a última regra na cadeia. tl; dr Eu tinha um firewall no caminho e simplesmente não percebi.
Hank Gay
Obrigado! Essa regra de firewall sorrateira é o que causou meus problemas no RHEL 5.5.
Roosh
Reimprimo o comentário de Robert abaixo porque é uma maneira trivial de verificar: Execute service iptables stopcomo root para descartar rapidamente um problema de firewall do Guest. Reative-o mais tarde, se necessário.
Arnaud Meuret
1
teve o mesmo problema com uma imagem de centos estranha; iptablesestava restringindo quase tudo. Segui este guia de centos do iptable (solução na seção 3 Escrevendo um conjunto de regras simples ) e funcionou
perfeitamente
para mim, o curl estava trabalhando internamente, então habilitei a rede Vagrantfilee executei o comandovagrant reload
abhirathore2006
266

Eu queria acrescentar uma observação adicional que geralmente isso é causado pelo servidor dentro da VM porque ele se liga a 127.0.0.1, que é o loopback. Você vai querer ter certeza de que o servidor está ligado para 0.0.0.0que todas as interfaces possam acessá-lo.

Alguns servidores de aplicativos integrados, como os servidores de desenvolvimento do Django e alguns servidores Ruby, são padronizados 127.0.0.1por padrão, então isso é algo a ser observado.

Além disso, o que Steve disse é verdade: certifique-se de que funciona dentro da VM e tente alguns outros servidores simples para tentar descobrir se é um problema de configuração.

Mitchell
fonte
8
Essa era a correção necessária para o Webrick do shotgun.
Ronze de
Isso resolveu o problema para mim. Para vincular o Torquebox a 0.0.0.0, execute-o com: torquebox run -b 0.0.0.0
Bartek Skwira
3
Sim, esse era o problema. Precisa vincular a 0.0.0.0. Eu me pergunto se há uma maneira de o Vagrant resolver automaticamente esse problema no futuro?
CMCDragonkai
1
mesmo problema com sinatra e webrick: "set: bind, '0.0.0.0'" resolveu o problema
pragmatic_programmer
esta foi a solução para mim
sixty4bit de
33

Tive o mesmo problema no CentOS 6.3 c / NGINX e encontrei a resposta no iptables da caixa do vagrant.

No bash on the vagrant box, siga estas etapas:

Primeira lista de regras de iptable atuais

iptables -L -v

Em seguida, libere as regras atuais:

iptables -F

Permitir conexões SSH na porta tcp 22

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

Definir políticas padrão para cadeias INPUT, FORWARD e OUTPUT

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

Definir acesso para localhost

iptables -A INPUT -i lo -j ACCEPT

Aceita pacotes pertencentes a conexões estabelecidas e relacionadas

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

Salvar configurações

/sbin/service iptables save

Listar regras modificadas

iptables -L -v

Curl localhost: [port #] ou acesse-o em seu navegador de fora do vagrant

Mais informações sobre as configurações de iptable do CentOS podem ser encontradas aqui:

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

Boa sorte.

travyo
fonte
2
Obrigado por escrever isso. Eu tive esse mesmo problema no Fedora 18, então não é específico do CentOS. Espero que ajude outra pessoa. :)
Benjamin Oakes
4
Este era eu no CentOS. service iptables stop
Robert
2
iptables -Fsozinho fez isso para mim
code_monk
Eu encontrei uma solução sólida para isso com alguns comandos exec listados nesta postagem do blog para resolver esse mesmo problema techie-notebook.blogspot.com/2014/05/… Tive que substituir meu caminho pelas seções $ {os_path}, como fiz não tem essa variável disponível.
Joshua Fricke
27

Uma solução melhor para mim é desativar o firewall

service iptables stop
chkconfig iptables off
Edwinallenz
fonte
+1 funcionou para mim. Para usar uma instância local do VirtualBox, não precisei de um firewall.
Eduardo
é um bom truque se você quiser uma solução temporária
brrystrw
0

Quero adicionar outra nota como Mitchell também. se meu caso eu encaminho para 6789 de 80

$ curl -v http://localhost:6789

E eu tenho

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

Então, eu usei o endereço IP em vez disso, ele obteve a mensagem html correta.

Larry Cai
fonte