我的AWS开发具有以下架构。
1 个 VPC 具有 2 个私有子网:1 个用于 RDS(10.0.11.0/24),1 个用于 EC2(10.0.1.0/24)1 个公共子网:
1 个连接到我的 VPC 的互联网网关
3 路由表:
a) 主路由表(0.0.0.0/0 目标互联网网关)
b) EC2 路由表(与 EC2 私有子网关联)加上指向 NAT 实例的网络 ID 接口的附加路由 0.0.0.0/0
c) RDS 路由表(与 RDS 私有子网关联)
3 个安全组:
a) EC2(选定传入并允许所有传出)
b) RDS(选定传入和允许所有传出)
c) NAT(选定传入并允许所有传出)
已在 NAT 实例中添加 iptable 预路由规则,以将数据重定向到 EC2 实例端口。根据规则,传入数据没有问题。SSH 和其他打开的端口正在运行。
问题是我的 EC2 实例发出的所有网络调用都被阻止了。我甚至无法执行“apt-get update”或从 github 克隆 repo 等命令。它们超时了。此外,我的服务器代码无法访问 AWS S3 资源。与 RDS 的连接工作正常。
过去几个月它一直运行良好。昨天,我在安装 nginx 并使用 ufw 时注意到了这个问题,我以为我搞乱了 iptables,因此清除了 ufw 包并刷新了 iptable 规则,然后重新启动。但仍然没有帮助。
我启动了另一个具有相同子网和其他规则的 EC2 实例,只是想看看问题是否出在之前的 EC2 实例上。即使是新实例也无法访问外部网站。不知道如何进一步调查。
更新:为了完整性,我发布了我的 EC2 的 iptable
ubuntu@ip-10-0-1-126:~$ sudo iptables -S
-P 输入接受
-P 转发接受
-P 输出接受
答案1
您将公共 IP 附加到您的 EC2 了吗?
公有子网中的 EC2 需要公有 IP 才能连接到互联网。如果您在具有 NAT 网关的私有子网中创建 EC2,则不需要公有 IP。
答案2
NAT PREROUTING iptable 规则对于传入流量没问题。对于传出流量。我需要添加 POSTROUTING 规则。令人惊讶的是,我在任何教程中都没有找到提到它,更令人惊讶的是,到目前为止,我的实例对于传出流量运行良好。
欲了解更多详情,我建议你访问此帖子 https://medium.com/@rakeshkanagaraj1990/aws-nat-instance-bb0911ba19d5