Перенаправление портов Vagrant не работает [закрыто]


108

Я столкнулся с небольшой проблемой в конце руководства по началу работы дляvagrant . Я работаю над базовым ящиком CentOS, на котором работает Apache2 (подготовка через Puppet). Я настроил переадресацию портов для веб-запросов, используя следующую строку Vagrantfile:

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

Но когда я делаю запросы к этому порту, они терпят неудачу. Safari сообщает об ошибке: «Safari не может открыть страницу« http: // localhost: 4567 / », потому что сервер неожиданно разорвал соединение».

Я сделал vagrant reloadи увидел в прокрутке «[default] - web: 80 => 4567 (adapter 1)», так с чего мне начать устранение неполадок? Спасибо.


1
Что curl -v 'http://localhost:4567/'говорит? Иногда Safari слишком хорошо скрывает сообщения об ошибках.
Стив Лош

2
Кроме того, curl 'http://localhost:80'от самой ВМ работает? Если нет, проблема не в переадресации портов.
Стив Лош

4
@Steve Losh curlизнутри виртуальной машины работает. curlот хозяина дает мне (52) Empty reply from server.
Hank Gay

Бродячая перезагрузка помогла мне в подобном вопросе ...
haudoing

Для меня случай был с symfony 3: - при запуске sudo php bin / console server: run, который запускает сервер на 127.0.0.1:8000, я не могу получить доступ из веб-браузера, доступ к curl на виртуальной машине. При запуске sudo php -S 0.0.0.0:8000 в веб-каталоге я мог получить доступ к 127.0.0.1:8082/app_dev.php . Не понимаю, почему так происходит, но работает.
Darius.V

Ответы:


80

Я сделаю это реальным ответом, а не просто дополнительными комментариями.

Первое: попробуйте curl 'http://localhost:80'из виртуальной машины. Если это не сработает, значит, дело не в переадресации портов.

Далее: попробуйте curl -v 'http://localhost:4567/'с вашего хост-компьютера. Curl может дать вам более точное сообщение об ошибке, чем Safari.

Я бы проверил, что нет настроенных брандмауэров, ограничивающих доступ к порту 80. Виртуальная машина Vagrant по умолчанию (Ubuntu) не поставляется с установленным брандмауэром, но вы сказали, что используете что-то еще, так что это может того стоить Проверять.

Если это не так, попробуйте создать что-то другое, кроме Apache, указанного на порту 80. Python поставляется с простым HTTP-сервером, который вы можете использовать - перейдите в папку с помощью index.htmlи запустите sudo python -m SimpleHTTPServer 80, затем попробуйте нажать на него с помощью curl из обоих полей. Если это сработает, то, вероятно, проблема в конфигурации Apache. У меня недостаточно опыта работы с Apache, чтобы помочь в этом случае (я использую nginx).


14
В принципе, RedHat и iptables. Я проверил, что политика по умолчанию предназначена ACCEPTдля входящих подключений, но не обратил внимания на настраиваемую цепочку правил RedHat, которая имеет универсальное REJECTправило в качестве последнего правила в цепочке. tl; dr У меня был брандмауэр, и я просто не заметил.
Hank Gay

Спасибо! Это хитрое правило брандмауэра вызвало у меня проблемы с RHEL 5.5.
Roosh

Я перепечатываю комментарий Роберта ниже, потому что это такой тривиальный способ проверить: запустить service iptables stopот имени пользователя root, чтобы быстро исключить проблему с гостевым брандмауэром. При необходимости включите его позже.
Арно Мере

1
была такая же проблема со странным изображением centos; iptablesограничивал почти все. Я следил за этим руководством по iptable centos (решение в разделе 3 «Написание простого набора правил» ), и оно сработало как шарм :)
GabLeRoux

для меня curl работал внутри, поэтому я включил сеть Vagrantfileи запустил командуvagrant reload
abhirathore2006

266

Я хотел добавить дополнительное примечание, что часто это вызвано сервером внутри виртуальной машины, потому что он привязывается к 127.0.0.1, что является обратной связью. Вы должны убедиться, что сервер привязан к нему, 0.0.0.0чтобы все интерфейсы могли получить к нему доступ.

Некоторые встроенные серверы приложений, такие как серверы разработки Django и некоторые серверы Ruby, по умолчанию работают 127.0.0.1по умолчанию, так что это то, чего стоит остерегаться.

В остальном то, что сказал Стив, остается верным: убедитесь, что он работает внутри виртуальной машины, и попробуйте несколько других простых серверов, чтобы попытаться выяснить, является ли это проблемой конфигурации.


8
Это было исправление, необходимое для работы вебрика с дробовиком.
Ronze

Это решило проблему для меня. Чтобы привязать Torquebox к 0.0.0.0, запустите его с помощью: Torquebox run -b 0.0.0.0
Bartek Skwira

3
Ага, это была проблема. Нужно привязать к 0.0.0.0. Интересно, есть ли способ, которым Vagrant может автоматически решить эту проблему в будущем?
CMCDragonkai 02

1
та же проблема с sinatra и webrick: "set: bind, '0.0.0.0'" решила проблему
pragmatic_programmer

это было исправление для меня
sixty4bit

33

У меня была такая же проблема на CentOS 6.3 с NGINX, и я нашел ответ в iptables на бродячем поле.

Из bash в бродячем поле выполните следующие действия:

Первый список текущих правил iptable

iptables -L -v

Затем удалите текущие правила:

iptables -F

Разрешить SSH-соединения на TCP-порту 22

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

Установите политики по умолчанию для цепочек INPUT, FORWARD и OUTPUT

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

Установить доступ для localhost

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: [порт #] или нажмите его в браузере извне бродяги

Более подробную информацию о конфигурациях CentOS iptable можно найти здесь:

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

Удачи.


2
Спасибо, что написали это. У меня была такая же проблема в Fedora 18, поэтому она не специфична для CentOS. Я надеюсь, что это поможет кому-то другому. :)
Benjamin Oakes

4
Это был я на CentOS. service iptables stop
Роберт

2
iptables -Fодин сделал это за меня
code_monk

Я нашел надежное решение этой проблемы с помощью некоторых команд exec, перечисленных в этом сообщении в блоге, чтобы решить ту же проблему. Techie-notebook.blogspot.com/2014/05/… Мне пришлось заменить свой путь разделами $ {os_path}, как я этого не делал эта переменная недоступна.
Джошуа Фрике

27

Лучшее решение для меня - отключить брандмауэр

service iptables stop
chkconfig iptables off

+1 Работал у меня. Для использования локального экземпляра VirtualBox мне не нужен брандмауэр.
Эдуардо

это хороший трюк, если вы хотите временное исправление
brrystrw

0

Я хочу добавить еще одну заметку, как и Митчелл. в моем случае пересылаю на номер 6789 из 80

$ curl -v http://localhost:6789

И я получил

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

Затем я использовал вместо этого IP-адрес, он получил правильное html-сообщение.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.