Как настроить прямой доступ HTTP к экземпляру EC2?

Это очень простой вопрос Amazon EC2, но я в тупике, поэтому здесь идет.

Я хочу запустить экземпляр Amazon EC2 и разрешить доступ к HTTP на портах 80 и 8888 откуда угодно. Пока я не могу позволить экземпляру подключаться к этим портам, используя его собственный IP-адрес (но он будет подключаться к localhost).

Я настроил группу безопасности по умолчанию для HTTP с помощью стандартной опции HTTP на консоли управления (а также SSH).

Я запустил свой экземпляр в группе безопасности по умолчанию.

Я дважды подключался к экземпляру на SSH-порту 22 и в одном окне запускал HTTP-сервер на порту 80. В другом окне я проверяю, что я могу подключиться к HTTP с помощью "localhost".

Однако, когда я пытаюсь получить доступ к HTTP из экземпляра (или где-либо еще), используя либо общедоступный DNS, либо частный IP-адрес, я отказываюсь от "соединения".

Что я делаю неправильно, пожалуйста?

Ниже показан фрагмент консоли, в котором отображается wget, который преуспевает, и два, которые не запускаются из самого экземпляра.

--2012-03-07 15:43:31--  http://localhost/
Resolving localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: /__whiff_directory_listing__ [following]
--2012-03-07 15:43:31--  http://localhost/__whiff_directory_listing__
Connecting to localhost|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: "__whiff_directory_listing__"

[ <=>
                                                                                                               ] 7,512       --.-K/s   in 0.03s   

2012-03-07 15:43:31 (263 KB/s) - "__whiff_directory_listing__" saved [7512]

[[email protected] tmp]$ wget http://ec2-50-17-2-174.compute-1.amazonaws.com/
--2012-03-07 15:44:17--  http://ec2-50-17-2-174.compute-1.amazonaws.com/
Resolving ec2-50-17-2-174.compute-1.amazonaws.com... 10.195.205.30
Connecting to ec2-50-17-2-174.compute-1.amazonaws.com|10.195.205.30|:80... failed:          
Connection refused.
[[email protected] tmp]$ wget http://10.195.205.30/
--2012-03-07 15:46:08--  http://10.195.205.30/
Connecting to 10.195.205.30:80... failed: Connection refused.
[[email protected] tmp]$ 

Ответ 1

Стандартный интерфейс tcp сокетов требует, чтобы вы связывались с определенным IP-адресом при отправке или прослушивании. Есть несколько несколько специальных адресов: localhost (с которым вы, вероятно, знакомы), что составляет 127.0.0.1. Также есть специальный адрес: 0.0.0.0 или INADDR_ANY (интернет-протокол, специальная стенограмма для ЛЮБОГО АДРЕСА). Это способ прослушивания ЛЮБОГО или чаще, ВСЕ адреса на хосте. Это способ сообщить ядру/стеку, что вас не интересует конкретный IP-адрес.

Итак, когда вы настраиваете сервер, который слушает "localhost", вы сообщаете службе, что вы хотите использовать специальный зарезервированный адрес, который может быть доступен только пользователям этого хоста, и, хотя он существует на каждый хост, подключающийся к локальному хосту, будет только доходить до хоста, из которого вы делаете запрос.

Если вы хотите, чтобы служба была доступна везде (на локальном хосте, на всех интерфейсах и т.д.), вы можете указать 0.0.0.0.

Ответ 2

(0) Это глупо, но первое, что вам нужно сделать, это убедиться, что ваш веб-сервер запущен.

(1) Вам необходимо отредактировать свою группу безопасности, чтобы входящие пакеты HTTP обращались к вашему веб-сайту. Если ваш сайт прослушивает порт 80, вам необходимо отредактировать группу безопасности, чтобы открыть доступ к порту 80, как указано выше. Если ваш сайт прослушивает какой-либо другой порт, вам необходимо отредактировать группу безопасности для доступа к этому другому порту.

(2) Если вы используете экземпляр Linux, брандмауэр iptables может работать по умолчанию. Вы можете проверить, что этот брандмауэр активен, запустив

sudo service iptables status

в командной строке. Если вы получаете выход, тогда работает брандмауэр iptables. Если вы получите сообщение "Брандмауэр не работает", это довольно понятно. В общем, брандмауэр iptables работает по умолчанию.

У вас есть два варианта: выбить брандмауэр или отредактировать конфигурацию брандмауэра, чтобы пропускать HTTP-трафик. Я решил выбить брандмауэр как более простой вариант (для меня).

sudo service iptables stop

В закрытии iptables нет реальной угрозы безопасности, потому что iptables, если активен, просто дублирует функциональность брандмауэра Amazon, который использует группу безопасности для генерации своего файла конфигурации. Мы предполагаем, что Amazon AWS не искажает свои брандмауэры - очень безопасное предположение.

(3) Теперь вы можете получить доступ к URL из своего браузера.

(4) Серверы Microsoft Windows Server также запускают свои личные брандмауэры по умолчанию, и вам также потребуется исправить личный брандмауэр Windows Server.

Исправление: по AWS по умолчанию AWS не запускает брандмауэры сервера, такие как iptables (Centos) или UAF (Ubuntu), когда вы заказываете создание новых экземпляров EC2. То, что экземпляры EC2, которые находятся в одном и том же VPC, могут ssh в друг друга, и вы можете "видеть" веб-сервер, который вы активировали из другого экземпляра EC2 в том же VPC.

Просто убедитесь, что ваш RESTful API прослушивает все интерфейсы, то есть 0.0.0.0:portID

Ответ 3

По мере того, как вы получаете отказ в соединении (пакеты отклоняются), я уверен, что это iptables вызывает проблему. Попробуйте запустить

iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 8888 -j ACCEPT

и проверьте соединение.

Вам также необходимо будет постоянно добавлять эти правила, которые вы можете сделать, добавив вышеприведенные строки в ie./etc/sysconfig/iptables, если вы используете Red Hat.

Ответ 4

По-видимому, я был "привязан к localhost", тогда как мне нужно было привязать к 0.0.0.0 для ответа на порт 80 для всех входящих TCP-интерфейсов (?). Это тонкость TCP/IP, которую я еще не полностью понял, но она устранила проблему.

Ответ 5

Придется сделать следующее:

1) Включите HTTP-доступ в конфигурации экземпляра, он по умолчанию не включен только SSH 2) Пытался делать nodejs-сервер, поэтому порт был привязан к 80- > 3000, выполнив следующие команды, чтобы исправить это

iptables -F
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
sudo service iptables-persistent flush