Przekierowanie portu Vagrant nie działa [zamknięte]

108

Na końcu przewodnika Wprowadzenie dla programuvagrant . Pracuję na stacji bazowej CentOS, na której działa Apache2 (udostępnianie przez Puppet). Skonfigurowałem przekierowanie portów dla żądań internetowych, używając następującego wiersza Vagrantfile:

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

Ale kiedy wysyłam żądania do tego portu, zawodzą. Błąd zgłoszony przez Safari to „Safari nie może otworzyć strony„ http: // localhost: 4567 / ”, ponieważ serwer nieoczekiwanie porzucił połączenie”.

Zrobiłem a vagrant reloadi zobaczyłem w zwoju "[default] - web: 80 => 4567 (adapter 1)", więc gdzie mam zacząć rozwiązywać ten problem? Dzięki.

Hank Gay
źródło
1
Co curl -v 'http://localhost:4567/'mówi? Czasami Safari trochę zbyt dobrze ukrywa komunikaty o błędach.
Steve Losh
2
Czy curl 'http://localhost:80'z samej maszyny wirtualnej działa? Jeśli nie, problem nie dotyczy przekierowania portów.
Steve Losh
4
@Steve Losh curlz maszyny wirtualnej działa. curlod gospodarza mi daje (52) Empty reply from server.
Hank Gay
Przeładowanie
Dla mnie przypadek był z symfony 3: - kiedy uruchamiam sudo php bin / console server: run, co powoduje, że serwer działa na 127.0.0.1:8000, wtedy nie mogę uzyskać dostępu z przeglądarki internetowej, zwijam dostęp do maszyny wirtualnej. Po uruchomieniu sudo php -S 0.0.0.0:8000 w katalogu internetowym, mogłem uzyskać dostęp do 127.0.0.1:8082/app_dev.php . Nie rozumiem, dlaczego tak się dzieje, ale działa.
Darius.V

Odpowiedzi:

80

Uczynię to rzeczywistą odpowiedzią zamiast tylko więcej komentarzy.

Pierwsza rzecz: spróbuj curl 'http://localhost:80'z poziomu maszyny wirtualnej. Jeśli to nie zadziała, to na pewno nie jest to przekierowanie portów.

Dalej: spróbuj curl -v 'http://localhost:4567/'z komputera głównego. Curl może dać lepszy komunikat o błędzie niż Safari.

Sprawdziłbym, czy nie ma skonfigurowanych zapór ogniowych ograniczających dostęp do portu 80. Domyślna maszyna wirtualna Vagrant (Ubuntu) nie ma skonfigurowanej zapory, ale powiedziałeś, że używasz czegoś innego, więc może być tego warte sprawdzić.

Jeśli to nie wszystko, spróbuj stworzyć coś innego niż Apache na porcie 80. Python jest dostarczany z prostym serwerem HTTP, którego możesz użyć - przejdź do folderu index.htmli uruchom sudo python -m SimpleHTTPServer 80, a następnie spróbuj uderzyć w to curl z obu pól. Jeśli to zadziała, prawdopodobnie jest to problem z konfiguracją Apache. Nie mam wystarczającego doświadczenia z Apache, aby pomóc, jeśli tak jest (używam nginx).

Steve Losh
źródło
14
Zasadniczo jestem do dupy w RedHat i iptables. Sprawdziłem, czy domyślna polityka ACCEPTdotyczy połączeń przychodzących, ale nie zwróciłem uwagi na niestandardowy łańcuch reguł RedHat, który ma REJECTregułę catch-all jako ostatnią regułę w łańcuchu. tl; dr Miałem firewall na drodze i po prostu tego nie zauważyłem.
Hank Gay
Dzięki! Ta podstępna reguła zapory jest przyczyną moich problemów na RHEL 5.5.
Roosh
Ponownie drukuję komentarz Roberta poniżej, ponieważ jest to tak trywialny sposób sprawdzenia: Uruchom service iptables stopjako root, aby szybko wykluczyć problem z zaporą sieciową gościa. W razie potrzeby włącz go ponownie później.
Arnaud Meuret
1
miał ten sam problem z dziwnym obrazem centów; iptablesograniczał prawie wszystko. Postępowałem zgodnie z tym praktycznym przewodnikiem po centos (rozwiązanie w sekcji 3 Pisanie prostego zestawu reguł ) i zadziałało jak urok :)
GabLeRoux
dla mnie curl działał w środku, więc włączyłem sieć Vagrantfilei uruchomiłem polecenievagrant reload
abhirathore2006
266

Chciałem dodać dodatkową uwagę, że często jest to spowodowane przez serwer w maszynie wirtualnej, ponieważ jest on powiązany z 127.0.0.1, czyli sprzężeniem zwrotnym. Będziesz chciał się upewnić, że serwer jest powiązany, aby 0.0.0.0wszystkie interfejsy miały do niego dostęp.

Niektóre wbudowane serwery aplikacji, takie jak serwery deweloperskie Django i niektóre serwery Ruby, są domyślnie 127.0.0.1ustawione, więc jest to coś, na co należy uważać.

Poza tym, to, co powiedział Steve, jest prawdą: upewnij się, że działa z poziomu maszyny wirtualnej i wypróbuj inne proste serwery, aby spróbować dowiedzieć się, czy jest to problem z konfiguracją.

Mitchell
źródło
8
To była poprawka potrzebna do strzelby w cegle.
Ronze,
To rozwiązało problem. Aby powiązać Torquebox z 0.0.0.0, uruchom go z: torquebox run -b 0.0.0.0
Bartek Skwira
3
Tak, to był problem. Trzeba powiązać z wersją 0.0.0.0. Zastanawiam się, czy istnieje sposób, w jaki Vagrant może automatycznie rozwiązać ten problem w przyszłości?
CMCDragonkai
1
ten sam problem z sinatrą i webrickiem: "set: bind, '0.0.0.0'" rozwiązany
pragmatic_programmer
to była dla mnie poprawka
sixty4bit
33

Miałem ten sam problem na CentOS 6.3 z NGINX i znalazłem odpowiedź w iptables na pudełku włóczęgi.

Od uderzenia w pudełko włóczęgów wykonaj następujące kroki:

Najpierw wypisz aktualne zasady iptable

iptables -L -v

Następnie usuń aktualne zasady:

iptables -F

Zezwalaj na połączenia SSH na porcie TCP 22

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

Ustaw domyślne zasady dla łańcuchów INPUT, FORWARD i OUTPUT

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

Ustaw dostęp dla hosta lokalnego

iptables -A INPUT -i lo -j ACCEPT

Akceptuj pakiety należące do ustanowionych i powiązanych połączeń

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

Zapisz ustawienia

/sbin/service iptables save

Lista zmodyfikowanych reguł

iptables -L -v

Curl localhost: [port #] lub naciśnij go w przeglądarce z zewnątrz włóczęga

Więcej informacji na temat konfiguracji CentOS iptable można znaleźć tutaj:

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

Powodzenia.

travyo
źródło
2
Dziękuję za napisanie tego. Miałem ten sam problem w Fedorze 18, więc nie jest on specyficzny dla CentOS. Mam nadzieję, że to pomoże komuś innemu. :)
Benjamin Oakes
4
To byłem ja na CentOS. service iptables stop
Robert
2
iptables -Fsam to dla mnie
zrobił
Znalazłem solidne rozwiązanie tego problemu za pomocą niektórych poleceń exec wymienionych w tym poście na blogu, aby rozwiązać ten sam problem techie-notebook.blogspot.com/2014/05/ ... Musiałem zastąpić moją ścieżkę sekcjami $ {os_path}, tak jak nie zrobiłem nie mam dostępnej tej zmiennej.
Joshua Fricke
27

Lepszym rozwiązaniem dla mnie jest wyłączenie firewalla

service iptables stop
chkconfig iptables off
edwinallenz
źródło
+1 Pracowało dla mnie. Aby korzystać z lokalnej instancji VirtualBox, nie potrzebowałem zapory.
Eduardo
to dobra sztuczka, jeśli chcesz tymczasowo naprawić
brrystrw
0

Chcę również dodać kolejną notatkę, taką jak Mitchell. jeśli w mojej sprawie przekażę to na 6789 z 80

$ curl -v http://localhost:6789

I dostałem

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

Następnie zamiast tego użyłem adresu IP, otrzymałem poprawną wiadomość html.

Larry Cai
źródło