Перенаправление портов 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

Удачи.

Travyo
источник
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
Edwinallenz
источник
+1 Работал у меня. Для использования локального экземпляра VirtualBox мне не нужен брандмауэр.
Эдуардо
это хороший трюк, если вы хотите временное исправление
brrystrw
0

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

$ curl -v http://localhost:6789

И я получил

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

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

Ларри Кай
источник