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

Amazon ec2 如何配置对EC2实例的直接http访问?,amazon-ec2,ec2-ami,Amazon Ec2,Ec2 Ami,这是一个非常基本的AmazonEC2问题,但我被难住了,所以就这样吧 我想启动一个AmazonEC2实例,并允许访问端口80和8888上的HTTP 从任何地方来。到目前为止,我甚至不能允许实例使用 它自己的IP地址(但它将连接到本地主机) 我使用管理控制台(以及SSH)上的标准HTTP选项为HTTP配置了“默认”安全组 我在默认安全组中启动了我的实例 我在SSH端口22上连接了实例两次,并在一个窗口中启动了一个HTTP服务器 在端口80上。在另一个窗口中,我验证是否可以使用“localhost”

这是一个非常基本的AmazonEC2问题,但我被难住了,所以就这样吧

我想启动一个AmazonEC2实例,并允许访问端口80和8888上的HTTP 从任何地方来。到目前为止,我甚至不能允许实例使用 它自己的IP地址(但它将连接到本地主机)

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

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

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

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

请问我做错了什么

下面是一个控制台片段,显示了从实例本身运行的成功的wget和失败的两个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]$ 
--2012-03-07 15:43:31--http://localhost/
正在解析本地主机。。。127.0.0.1
正在连接到本地主机| 127.0.0.1 |:80。。。有联系的。
HTTP请求已发送,正在等待响应。。。302临时搬家
位置:/\uuuu whiff\u目录\u列表\uuuuuu[以下]
--2012-03-07 15:43:31--  http://localhost/__whiff_directory_listing__
正在连接到本地主机| 127.0.0.1 |:80。。。有联系的。
HTTP请求已发送,正在等待响应。。。200行
长度:未指定[text/html]
保存到:“\uuuu whiff\u目录\u列表\uuuuuu”
[ 
]7512---K/s,0.03秒
2012-03-07 15:43:31(263 KB/s)-“\uuuuuu whiff\u目录\uuuu列表\uuuuuuuuuu”已保存[7512]
[ec2-user@ip-10-195-205-30 tmp]$wgethttp://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/
解析ec2-50-17-2-174.compute-1.amazonaws.com。。。10.195.205.30
连接到ec2-50-17-2-174.compute-1.amazonaws.com | 10.195.205.30 |:80。。。失败:
连接被拒绝。
[ec2-user@ip-10-195-205-30 tmp]$wgethttp://10.195.205.30/
--2012-03-07 15:46:08--  http://10.195.205.30/
连接到10.195.205.30:80。。。失败:连接被拒绝。
[ec2-user@ip-10-195-205-30TMP]$

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

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

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

当您希望在任何地方(本地主机上、所有接口上等)都可以访问服务时,您可以指定0.0.0.0。

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

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

(2) 如果您正在运行Linux实例,默认情况下,iptables防火墙可能正在运行。您可以通过运行来检查此防火墙是否处于活动状态

sudo服务iptables状态

在命令行上。如果获得输出,则iptables防火墙正在运行。如果您收到一条消息“防火墙未运行”,这是不言自明的。通常,iptables防火墙默认运行

您有两个选择:关闭防火墙或编辑防火墙的配置以允许HTTP流量通过。我选择了摧毁防火墙作为更简单的选择(对我来说)

sudo服务iptables停止

关闭iptables不会带来真正的安全风险,因为iptables如果处于活动状态,只会复制亚马逊防火墙的功能,而亚马逊防火墙正在使用安全组生成其配置文件。我们在这里假设亚马逊AWS没有错误配置其防火墙——这是一个非常安全的假设

(3) 现在,您可以从浏览器访问URL

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

更正:在AWS默认情况下,当您订购创建新EC2实例时,AWS不会启动iptables(Centos)或UAF(Ubuntu)等服务器防火墙-这就是为什么同一VPC中的EC2实例可以相互ssh连接,并且您可以“看到”从同一VPC中的另一个EC2实例启动的web服务器


只要确保您的RESTful API正在侦听所有接口,即0.0.0.0:portID,因为您的连接被拒绝(数据包被拒绝),我打赌是iptables导致了问题。试着跑

iptables-I输入-p tcp--dport 80-j接受
iptables-I输入-p tcp--dport 8888-j接受

并测试连接

您还需要永久添加这些规则,您可以通过将上述行添加到ie./etc/sysconfig/ip中来实现
iptables -F
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
sudo service iptables-persistent flush