HTTP-доступ к экземпляру GCE после добавления правила брандмауэра

Я пытаюсь заставить Apache работать с экземпляром GCE.

Следуя Руководству по быстрому запуску GCE, я сделал следующее:

  1. Создан экземпляр my-instance в my-project (образ CentOS)
  2. Установил httpd, проверил, что он запущен
  3. Добавлено следующее правило межсетевого экрана:

    gcutil addfirewall http2 --description="Incoming http allowed." --allowed="tcp:http"

    и сделал то же самое для HTTPS и ICMP

  4. Проверено через gce gui, что эти правила были добавлены в сеть по умолчанию

Я могу проверить связь с IP-адресом своего экземпляра, но не могу получить ответ HTTP. Пробовал через браузер, из команды curl - без кубиков. И он отлично работает на локальном хосте, поэтому я знаю, что Apache возвращает страницу index.html.

Когда я использую curl с удаленного хоста, возникает ошибка:

curl: (7) Failed connect to (instance ip addr):80; Connection refused

Мысли?


person spinsf    schedule 08.12.2013    source источник
comment
Если вы перейдете в облачную консоль (cloud.google.com/console), перейдите к своему проекту, Compute Engine, Сети, а затем щелкните сеть по умолчанию. Ваше правило http2 указано в списке?   -  person IanGSY    schedule 08.12.2013
comment
Да, я вижу это через консоль для сети по умолчанию. Я также могу проверить это через командную строку.   -  person spinsf    schedule 08.12.2013
comment
Я также попытался удалить правило и воссоздать его. Та же проблема - его можно увидеть на консоли, но не может заставить отвечать на HTTP-запросы.   -  person spinsf    schedule 08.12.2013
comment
Вы определенно подключаетесь к правильному IP-адресу, используете ли вы IP-адрес, показанный в конце вывода команды: gcutil getinstance instancename   -  person IanGSY    schedule 08.12.2013
comment
Еще одна вещь, которую стоит попробовать, - это перезагрузить ваш экземпляр?   -  person IanGSY    schedule 08.12.2013
comment
Httpd слушает только 127.0.0.1? Посмотрите с sudo netstat -tpln   -  person Benson    schedule 09.12.2013
comment
Спасибо - отвечу на каждый вопрос: да, я проверил внешний IP с помощью команды gcutil getinstance, а также через консоль. Я попытался перезагрузить экземпляр, без изменений. sudo netstat -tpln дает следующее:   -  person spinsf    schedule 09.12.2013
comment
tcp 0 0 ::: 80 ::: * СЛУШАТЬ 1443 / httpd   -  person spinsf    schedule 09.12.2013


Ответы (1)


Я провел несколько экспериментов, чтобы воспроизвести это. Короче говоря, я считаю, что HTTP-порт 80 может быть заблокирован правилами брандмауэра iptables на локальном экземпляре Centos. Похоже, это поведение по умолчанию.

У меня есть настройка правила брандмауэра GCE, чтобы разрешить трафик порта 80 для всех экземпляров. Я создал образ на основе centos через облачную консоль (которая действительно использует API v1). Я зашел через SSH и запустил веб-сервер на 80-м порту. Мне не удалось подключиться к веб-серверу со своего ноутбука. Однако мне также не удалось получить его из другого экземпляра в моем проекте. Это заставило меня подозревать брандмауэр, локальный для экземпляра, а не брандмауэр Compute Engine.

Я выполнил эту команду (которая отбрасывает отклонение по умолчанию всех портов для тестирования - это небезопасно делать для машин, напрямую подключенных к Интернету):

$ sudo iptables -D  INPUT -j REJECT --reject-with icmp-host-prohibited

После запуска я смог подключиться к своему веб-серверу как с другого экземпляра, так и с моего ноутбука. Обратите внимание, что это изменение теряется после перезапуска экземпляра. Я не знаю правильной процедуры для изменения правил брандмауэра по умолчанию на Centos.

Попробуйте провести аналогичный эксперимент на своих экземплярах, особенно попробуйте подключиться к веб-серверу из другого экземпляра Compute Engine, поскольку брандмауэры уровня обслуживания не блокируют трафик между экземплярами в одной сети.

person Brian Dorsey    schedule 10.12.2013