如何配置对EC2实例的直接http访问?

时间:2012-03-07 15:58:45

标签: amazon-ec2 ec2-ami

这是一个非常基本的亚马逊EC2问题,但我很难过这里。

我想启动Amazon EC2实例并允许在端口80和8888上访问HTTP 从任何地方。到目前为止,我甚至不能允许实例使用连接到这些端口 它自己的IP地址(但它将连接到localhost)。

我使用管理控制台(以及SSH)上的标准HTTP选项为HTTP配置了“默认”安全组。

我在默认安全组中启动了我的实例。

我连接到SSH端口22上的实例两次,并在一个窗口中启动HTTP服务器 在端口80上。在另一个窗口中,我验证我可以使用“localhost”连接到HTTP。

但是当我尝试使用公共DNS或私有IP地址从实例(或其他任何地方)访问HTTP时,我认为“连接被拒绝”。

我做错了什么,拜托?

下面是一个控制台片段,显示成功的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]

[ec2-user@ip-10-195-205-30 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.
[ec2-user@ip-10-195-205-30 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.
[ec2-user@ip-10-195-205-30 tmp]$ 

6 个答案:

答案 0 :(得分:18)

标准tcp套接字接口要求您在发送或侦听时绑定到特定的IP地址。有几个有点特殊的地址:localhost(你可能很熟悉),它是127.0.0.1。还有一个特殊地址,0.0.0.0或INADDR_ANY(互联网协议,任何地址的特殊简写)。这是一种在主机上侦听任何或更常见的所有地址的方法。这是一种告诉内核/堆栈您对特定IP地址不感兴趣的方法。

因此,当您设置一个侦听“localhost”的服务器时,您告诉服务您要使用该主机的用户只能访问的特殊保留地址,并且它存在于每个主机,与localhost建立连接只会到达您提出请求的主机。

如果希望服务可以到达任何地方(在本地主机上,在所有接口上等),则可以指定0.0.0.0。

答案 1 :(得分:18)

(0)这很愚蠢,但您需要做的第一件事就是确保您的网络服务器正在运行。

(1)您需要编辑安全组以允许传入的HTTP数据包访问您的网站。如果您的网站正在侦听端口80,则需要编辑安全组以打开对端口80的访问,如上所述。如果您的网站正在侦听其他端口,则需要编辑安全组以访问该其他端口。

(2)如果您正在运行Linux实例,则默认情况下 iptables 防火墙可能正在运行。您可以通过运行

来检查此防火墙是否处于活动状态

sudo service iptables status

命令行上的

。如果输出,则iptables防火墙正在运行。如果您收到消息“防火墙未运行”,那就非常明显了。通常, iptables 防火墙默认运行。

您有两种选择:敲除防火墙或编辑防火墙的配置以允许HTTP流量通过。我选择将防火墙作为更简单的选项(对我而言)。

sudo service iptables stop

关闭 iptables 没有真正的安全风险,因为 iptables ,如果有效,只会复制亚马逊防火墙的功能,该防火墙正在使用安全组生成其配置文件。我们假设亚马逊AWS没有错误配置其防火墙 - 这是一个非常安全的假设。

(3)现在,您可以从浏览器访问该网址。

(4)默认情况下,Microsoft Windows Server也运行其个人防火墙,您也需要修复Windows Server的个人防火墙。

更正:根据AWS默认情况下,当您订购新EC2实例的订单时,AWS不会启动服务器防火墙,如iptables(Centos)或UAF(Ubuntu) - 这就是为什么同一个VPC中的EC2实例可以进入彼此,您可以“看到”从同一VPC中的另一个EC2实例启动的Web服务器。

确保您的RESTful API正在侦听所有接口,即0.0.0.0:portID

答案 2 :(得分:4)

当您拒绝连接(数据包被拒绝)时,我打赌它是 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。

答案 3 :(得分:3)

显然我是“绑定到localhost”而我需要绑定到0.0.0.0以响应所有传入TCP接口(?)的端口80。这是TCP / IP的一个微妙之处,我还没有完全理解,但它解决了这个问题。

答案 4 :(得分:0)

必须执行以下操作:

1)在实例配置上启用HTTP访问,默认情况下它不启用SSH 2)试图做nodejs服务器,所以端口绑定到80 - &gt; 3000执行了以下命令来修复

definition

答案 5 :(得分:0)

亚马逊支持人员对此做出了回应,并立即发挥作用:

  

我在测试Ubuntu实例上复制了我的问题并且能够解决它。问题是,为了在Ubuntu / Unix中的1024以下端口上运行Tomcat,该服务需要root权限,一般不建议使用root权限在端口80上运行进程是一种不必要的安全风险。

我们建议通过iptables使用端口重定向: -

  

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

我希望以上信息有所帮助。