此处遵循 rposcibed 模式: 场景 3:具有公有子网和私有子网以及硬件 VPN 访问的 VPC
摘要描述: 我已经配置了一个带有 1 个公共子网和 2 个私有子网的 VPC 每个子网位于不同的 AZ 有两个路由表:1 个用于公共子网,1 个用于 2 个私有子网 有两个 NACL:1 个用于公共子网,1 个用于 2 个私有子网 有一个互联网网关(路由到公共子网) EC2 实例有一个安全组 RDS 实例有一个安全组 我在公共子网中有一个带有 Web 应用程序的 EC2 实例 Apache/Tomcat 我在 2 个私有子网中部署了一个 RDS PostgreSQL 数据库(多可用区=是)
这是我能做的:
我可以通过 SSH 连接到 EC2 实例
我可以通过端口 80 访问 Tomcat Manager 应用
我可以部署一个 war 文件(我的应用程序)
如果我将私有子网公开,并相应地设置安全组和 NACL,我可以使用 PGAdmin 访问 postgresql 数据库,并且可以使用 RDS 实例端点作为主机从我的桌面运行该应用程序。因此数据库处于良好状态并且可以访问。
失败之处如下:
当我将应用程序部署到 Tomcat 并尝试访问数据库时,它失败了:org.postgresql.util.PSQLException:连接被拒绝。请检查主机名和端口是否正确,以及 postmaster 是否接受 TCP/IP 连接。
当我 ping RDS 端点(DNS 名称)时,它可以正确解析为私有 IP 地址,但无法到达节点(NACL 和安全组中已启用所有流量)。
因此,我可以从公共互联网从我的桌面访问 EC2 和 RDS 实例,但我无法让它们从 VPC 内部相互连接。
我将所有 NACL 和安全组设置为最大权限,只是为了强制成功连接。但即使这样也不起作用。
稍后我会附上相关细节。如果有人对要检查的内容有任何建议,我将不胜感激!!!
谢谢
我终于搞明白了。我会先描述完问题,然后再给出答案。问题根源在于 NALCS 和安全组,所以我只分享这些细节。路由和互联网网关很简单。
私有网络访问控制列表
In Bound
80 0.0.0.0/0 Allow
Out Bound
All 0.0.0.0/0 Allow
公共子网 NACL
InBound
80 0.0.0.0/0 Allow
Out Bound
All 0.0.0.0/0 Allow
5432 172.30.4.0/24 Allow (PostgreSQL)
私有子网 NACL
InBound
5432 172.30.1.0/24 Allow
Out Bound
5432 172.30.1.0/24 Allow
VPC 安全组
InBound
80 VPC-Security-Group-ID Allow
Out Bound
All 0.0.0.0/0 Allow
公共子网安全组
InBound
80 0.0.0.0/0 Allow
Out Bound
5432 172.30.4.0/0 Allow
私有子网安全组
InBound
5432 172.30.1.0/24 Allow
Out Bound
5432 172.30.1.0/24 Allow
答案1
如果你对此有所了解(也许你是一名网络工程师),你可能会马上明白问题所在。
问题根源于以下概念:
- 临时端口
- 无状态和有状态
- 连接跟踪
- NACL 是无状态的
- 安全组是有状态的
在这里阅读:
http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Security.html
http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_SecurityGroups.html
http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_ACLs.html
https://en.wikipedia.org/wiki/Ephemeral_port
更正后的配置如下。真正纠正公共子网和私有子网之间连接的更改是启用临时端口上的响应流量,以响应入站公共子网 NACL 和出站私有子网 NACL 规则。我还清理了 NACLS 和安全组中一些冗余且不安全的出站规则。
私有网络访问控制列表
In Bound
80 0.0.0.0/0 Allow
Out Bound
32768-65535 0.0.0.0/0 Allow
公共子网 NACL
InBound
80 0.0.0.0/0 Allow
32768-65535 172.30.4.0/0 Allow
Out Bound
32768-65535 0.0.0.0/0 Allow
5432 172.30.4.0/24 Allow (PostgreSQL)
私有子网 NACL
InBound
5432 172.30.1.0/24 Allow
Out Bound
32768-65535 172.30.1.0/24 Allow
VPC 安全组
InBound
80 VPC-Security-Group-ID Allow
Out Bound
公共子网安全组
InBound
80 0.0.0.0/0 Allow
Out Bound
5432 172.30.4.0/0 Allow
私有子网安全组
InBound
5432 172.30.1.0/24 Allow
Out Bound
这是一个有效的配置。希望这对某些人有帮助。如果您发现任何可以改进的地方,请告诉我,如果您有疑问,请告诉我。