我刚刚租用了一台 Amazon EC2 服务器,用于托管一个在端口 9001 上监听客户端的 node.js 应用程序。
我确实配置了安全组并在此端口上添加了入站和出站规则。没有防火墙(Amazon Linux),并且我完全禁用了 iptables。
Asudo netstat -plunta | grep LISTEN
返回此内容:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2064/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2104/sendmail
tcp 0 0 0.0.0.0:9001 0.0.0.0:* LISTEN 3207/node
tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 2146/mongod
tcp 0 0 :::80 :::* LISTEN 2303/httpd
tcp 0 0 :::22 :::* LISTEN 2064/sshd
我的 node.js 应用程序正在监听此端口和所有地址,命令如下server.listen(9001, "0.0.0.0");
但是,服务器的 nmap 返回以下内容:
Portscan scan report for 172.31.47.81
Host is up.
All 1000 scanned ports on 172.31.47.81 are filtered
Portscan done: 1 IP address (1 host up) scanned in 2.32 seconds
或者,在我的手机上执行 nmap 告诉我只有端口 80 是开放的。
如果我在服务器上运行 node.js 应用程序并执行telnet <ip_server> 9001
,它确实可以工作。但是,如果我从个人计算机上执行相同的操作,则会收到超时错误。
我知道这个问题已经被多次提及,但我尝试过的所有解决方案都不起作用。我可以 ping 服务器,使用 ssh 连接到它,但 node.js 应用程序无法工作,并且任何应该打开的端口实际上都没有打开(即使尝试通过浏览器连接到 Web 服务器也不起作用,尽管 httpd 配置了正确的网站,因此端口 80 也没有打开)。
关于如何修复此问题您有什么想法吗?
答案1
172.31.47.81 上的所有 1000 个扫描端口均被过滤
事实上,他们应该如此。
有多个范围的 IPv4 地址是保留供私有网络使用的。
10.*.*.*
172.16.*.* through 172.31.*.*
192.168.*.*
这些范围内的任何地址都不能通过互联网直接访问。
https://www.rfc-editor.org/rfc/rfc1918
https://www.arin.net/knowledge/address_filters.html
EC2 实例始终有一个与之关联的私有 IP 地址,有时还有一个外部可访问的公共 IP。这些外部地址要么在实例启动时从池中动态分配(并在实例停止或终止时释放,此时地址返回到池中),要么可以由客户持续保留并与实例关联/取消关联,并保留以供客户后续重复使用(在这种情况下,它们被称为“弹性 IP 地址”。)
在给定区域内的一个客户的 EC2 部署中(以及通过 VPN 隧道进入 VPC),实例可以通过其私有 IP 相互寻址(并且应该,因为它不收取数据传输费用)......但在互联网上,实例只能通过其公共(又名“外部”)IP 地址访问,该地址在控制台中可见......尽管从实例的角度来看(即等ifconfig
),唯一已知的地址是私有地址。
EC2 基础设施透明地进行外部公共地址和内部私有地址之间的网络地址转换(NAT)。
如果您从外部通过 ssh 访问实例,则用于建立 ssh 连接的 IP 地址也将是您访问其他服务所需的 IP 地址。