如何查找AWS ECS Fargate服务使用的端口及协议以优化NACL配置?
解决ECS Fargate服务NACL端口限制问题的实操方案
一、先搞清楚Fargate需要的两类端口
Fargate服务的流量分两种,漏了任何一种都会断流:
- 业务对外暴露的端口:用户访问你服务的端口
- 内部依赖的通信端口:Fargate和AWS服务、其他内部服务通信的端口,这也是你之前只加IP范围没用的核心原因
1. 快速获取业务端口
- 直接查看ECS任务定义:打开ECS控制台,找到对应任务定义的
容器定义,里面的端口映射就是业务要用到的端口(比如80、443)。 - 用AWS CLI批量查询:
这个命令会返回所有容器的端口映射,包括容器端口和主机端口(如果配置了的话)。aws ecs describe-task-definitions --task-definition <你的任务定义名> --query 'taskDefinitions[*].containerDefinitions[*].portMappings'
2. 必须放行的内部通信端口
Fargate要正常运行,这些端口绝对不能拦截:
- ECS控制平面通信:TCP 443(Fargate任务要和ECS服务端交互)
- 日志推送:TCP 443(往CloudWatch Logs发送日志)
- 密钥/配置拉取:TCP 443(访问Secrets Manager或Parameter Store)
- 其他依赖服务:比如你的服务连接RDS就要放行3306(MySQL)或5432(PostgreSQL),连接Redis放行6379,依此类推。
二、确定Fargate任务的IP范围
Fargate任务的IP来自你VPC里的子网CIDR,不用找AWS的Fargate全局IP范围,直接用你自己子网的CIDR即可(比如10.0.1.0/24、10.0.2.0/24)。
三、NACL配置要点(无状态规则要双向放行)
NACL是无状态的,入站和出站规则都要配置,不然会出现能进不能出或者反过来的情况:
- 入站规则:
- 放行外部访问业务端口:比如允许指定IP段(或0.0.0.0/0如果是公网服务)访问TCP 80/443
- 放行子网内部的必要通信:比如子网CIDR访问TCP 443,以及服务间互访的端口(如果有)
- 出站规则:
- 放行子网CIDR访问TCP 443(和AWS服务通信)
- 放行任务访问依赖服务的端口(比如RDS的3306)
- 如果服务要调用外部API,放行TCP 443
四、测试和排查技巧
- 不要直接删除全放行规则:先添加限制规则,把优先级设得比全放行规则高(数字越小优先级越高),测试服务正常后再删除全放行规则。
- 用VPC Flow Logs定位问题:开启子网的Flow Logs,查看里面的
REJECT记录,里面会显示被拒绝的IP、端口和协议,照着补全规则即可。
内容的提问来源于stack exchange,提问作者Naveed Ahmad
相关产品推荐
相关产品推荐

