24

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

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

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

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

我在 SSH 端口 22 上连接到实例两次,并在一个窗口中在端口 80 上启动 HTTP 服务器。在另一个窗口中,我验证我可以使用“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]$ 
4

6 回答 6

22

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

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

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

于 2012-03-07T17:53:40.827 回答
22

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

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

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

sudo 服务 iptables 状态

在命令行上。如果你得到输出,那么 iptables 防火墙正在运行。如果您收到一条消息“防火墙未运行”,那是不言自明的。一般来说,iptables防火墙是默认运行的。

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

sudo 服务 iptables 停止

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

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

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

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

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

于 2013-09-17T03:04:02.490 回答
5

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

于 2013-11-26T23:31:11.877 回答
4

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

于 2012-03-07T17:40:36.563 回答
0

必须执行以下操作:

1)在实例配置上启用 HTTP 访问,默认情况下仅 SSH 不启用 2)尝试做 nodejs 服务器,所以端口绑定到 80 -> 3000 做了以下命令来解决这个问题

iptables -F
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
sudo service iptables-persistent flush
于 2016-08-20T00:35:40.350 回答
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

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

于 2018-03-06T21:28:47.983 回答