2012-03-07 37 views
11

Esta es una pregunta muy básica de Amazon EC2, pero estoy perplejo, así que aquí va.¿Cómo se configura el acceso http directo a la instancia EC2?

Quiero iniciar una instancia de Amazon EC2 y permitir el acceso a HTTP en los puertos 80 y 8888 desde cualquier lugar. Hasta ahora no puedo permitir que la instancia se conecte en esos puertos usando su propia dirección IP (pero se conectará a localhost).

Configuré el grupo de seguridad "predeterminado" para HTTP usando la opción HTTP estándar en la consola de gestión (y también SSH).

Lancé mi instancia en el grupo de seguridad predeterminado.

Me conecté dos veces a la instancia en el puerto SSH 22 y en una ventana ejecuté un servidor HTTP en el puerto 80. En la otra ventana verifico que puedo conectarme a HTTP usando el "localhost".

Sin embargo, cuando intento acceder a HTTP desde la instancia (o desde cualquier otro lugar) utilizando el DNS público o la dirección IP privada, het "connection refused".

¿Qué estoy haciendo mal, por favor?

A continuación se muestra un fragmento de consola que muestra el wget que tiene éxito y los dos que fallan se ejecutan desde la propia instancia.

--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]$ 

Respuesta

16

La interfaz estándar de sockets tcp requiere que se vincule a una determinada dirección IP cuando envía o escucha. Hay un par de direcciones algo especiales: localhost (con el que probablemente esté familiarizado) que es 127.0.0.1. También hay una dirección especial, 0.0.0.0 o INADDR_ANY (protocolo de Internet, abreviatura especial para CUALQUIER DIRECCIÓN). Es una forma de escuchar CUALQUIER o más comúnmente, TODAS las direcciones en el host. Esta es una forma de decirle al núcleo/pila que no está interesado en una dirección IP en particular.

Por lo tanto, cuando está configurando un servidor que escucha "localhost" le está diciendo al servicio que desea utilizar la dirección reservada especial a la que solo pueden acceder los usuarios de este host, y mientras existe en cada host, establecer una conexión con localhost solo llegará al host desde el que realiza la solicitud.

Cuando desee que un servicio sea accesible en cualquier lugar (en un host local, en todas las interfaces, etc.) puede especificar 0.0.0.0.

+0

Complementando la respuesta de Peter, es posible que desee editar la siguiente línea en /etc/jetty/jetty.xml: 0.0.0.0 douglaslps

3

Al parecer, fue "La unión a localhost", mientras que necesitaba para unirse a 0.0.0.0 para responder a puerto 80 para las todas las interfaces TCP entrantes (?). Esta es una sutileza de TCP/IP que aún no entiendo del todo, pero solucionó el problema.

+0

De forma predeterminada, y es un valor predeterminado de AWS, el enlace solo se aplica a la interfaz del host local, que es interna para el kernel. Por lo tanto, si intenta acceder al puerto desde una IP externa, no obtendrá nada porque el servidor no está escuchando en ninguna de las interfaces externas. –

18

(0) Es una tontería, pero lo primero que debe hacer es asegurarse de que su servidor web se está ejecutando.

(1) Debe editar su Grupo de seguridad para permitir que los paquetes HTTP entrantes accedan a su sitio web. Si su sitio web está escuchando en el puerto 80, debe editar el Grupo de seguridad para abrir el acceso al puerto 80 como se mencionó anteriormente. Si su sitio web está escuchando en algún otro puerto, entonces necesita editar el Grupo de seguridad para acceder a ese otro puerto.

(2) Si está ejecutando una instancia de Linux, el firewall iptables se puede ejecutar de manera predeterminada.Se puede comprobar que este servidor de seguridad está activo mediante la ejecución de

servicio sudo iptables estado

en la línea de comandos. Si obtiene salida, entonces se está ejecutando el firewall de iptables. Si aparece el mensaje "Cortafuegos que no se ejecuta", eso se explica por sí mismo. En general, el firewall iptables se ejecuta de manera predeterminada.

Tiene dos opciones: bloquear el firewall o editar la configuración del firewall para permitir el tráfico HTTP. Opté por noquear el firewall como la opción más simple (para mí).

service iptables sudo detienen

No hay riesgo real de seguridad en el cierre de iptables PORQUE iptables, si está activo, más que duplica la funcionalidad de servidor de seguridad de Amazon, que está utilizando el grupo de seguridad para generar su archivo de configuración. Estamos asumiendo que Amazon AWS no configura incorrectamente sus firewalls, una suposición muy segura.

(3) Ahora puede acceder a la URL desde su navegador.

(4) Los servidores de Microsoft Windows también ejecutan sus servidores de seguridad personales de forma predeterminada y también deberá reparar el servidor de seguridad personal del servidor de Windows.

Corrección: por AWS predeterminado, AWS no activa firewalls de servidor tales como iptables (Centos) o UAF (Ubuntu) cuando ordena la creación de nuevas instancias EC2 - Es por eso que las instancias EC2 que están en la misma VPC pueden uno dentro del otro y usted puede "ver" el servidor web que activó desde otra instancia EC2 en la misma VPC.

Sólo asegúrese de que su API REST está escuchando en todas las interfaces decir 0.0.0.0:portID

+0

Me olvidé para verificar mi configuración de iptables ... después de leer su respuesta revisé mis reglas y tenía una regla que redirige paquetes de 80 a 3000 y esa es la razón por la que no funcionaba. – Chittolina

4

Como vas a encontrar conexión rechazada (paquetes están siendo rechazados) apuesto a que es iptables que causan el problema. Intente ejecutar

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

y probar la conexión.

También deberá agregar esas reglas permanentemente, lo cual puede hacer agregando las líneas anteriores en ie./etc/sysconfig/iptables si está ejecutando Red Hat.

0

tenía que hacer lo siguiente:

1) Habilitar el acceso HTTP en la instancia de configuración, que no estaba en forma predeterminada sólo SSH 2) tratado de hacer nodejs servidor, así que el puerto estaba obligado a 80 -> 3000 hicieron los siguientes comandos para solucionar ese

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

apoyo Amazon respondió y funcionó al instante:

que replican el problema en mi final en una instancia de Ubuntu prueba y fue capaz de sol ve eso El problema era que para ejecutar Tomcat en un puerto por debajo de 1024 en Ubuntu/Unix, el servicio necesita privilegios de administrador, lo que generalmente no se recomienda ya que ejecutar un proceso en el puerto 80 con privilegios de administrador es un riesgo de seguridad innecesario.

Lo que recomendamos es usar una redirección de puertos a través de iptables: -

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --a puertos 8080

Espero que la información anterior ayude.

Cuestiones relacionadas