AWS EC2 安全组开放 80/443 端口:入站规则配置与排查
EC2 上 Nginx 起了、本机 curl 也通,浏览器就是打不开——十有八九是 安全组(Security Group) 没放行 80/443。AWS 安全组默认只出不进,所有入站都要显式添加。
添加入站规则
- EC2 控制台 → 实例 → 选中目标实例 → 安全 标签页 → 点击安全组链接
- 编辑入站规则(Edit inbound rules)→ Add rule:
- 类型选 HTTP(自动填 TCP 80),Source 选 Anywhere-IPv4(0.0.0.0/0)
- 再加一条 HTTPS(TCP 443),同样 Anywhere
- 有 IPv6 的加 Anywhere-IPv6(::/0)两条
- 保存,立即生效,不用重启实例
SSH(22)不要 Anywhere:Source 选 My IP,只放行自己当前出口 IP。
打不开的排查顺序
# 1. 服务监听确认
sudo ss -lntp | grep -E ':80|:443'
# 2. 本机连通
curl -I http://127.0.0.1
- 本机不通 → 应用问题,看 Nginx/服务日志
- 本机通、外网不通 → 依次检查:
- 安全组入站有没有 80/443(最常见)
- 系统防火墙:Amazon Linux 一般默认没开 firewalld,Ubuntu 检查
ufw status - 子网的 网络 ACL 是否被改过(默认全放行,被改过才会拦)
- 实例是否有公网 IP(私有子网的实例没有公网入口)
- IP 通、域名不通 → DNS 解析问题
安全组 vs 网络 ACL
| 项目 | 安全组 | 网络 ACL |
|---|---|---|
| 层级 | 实例网卡级 | 子网级 |
| 状态 | 有状态(回包自动放行) | 无状态(进出都要写) |
| 默认 | 入站全拒 | 全放行 |
| 日常使用 | 主要工具 | 一般不动 |
日常只管安全组即可;ACL 保持默认,除非有子网级封禁需求。
安全建议
- 数据库端口(3306/5432/6379)永远不对 0.0.0.0/0 开放,Source 填应用服务器所在安全组的 ID(安全组互相引用是 AWS 的最佳实践)
- 定期审计:删掉不再使用的临时规则
- 一组多用:同角色的实例共用一个安全组,规则改一处全生效
常见问题
规则已放行但端口仍不通,先查什么?
按顺序核对:云厂商安全组/轻量防火墙是否入站放行、是否绑到正确实例、系统内防火墙或服务是否监听、本机是否只监听 127.0.0.1,以及源地址是否被限制为特定网段。
80/443 应该对哪些网段开放?
对外提供 Web 服务时通常放行 0.0.0.0/0 的 TCP 80/443;管理端口(如 22、3389、8888)应限制为运维出口 IP,避免把管理面暴露到公网。
没有对应云账号时怎么开始?
可先通过申请账号开通国际云账号,再用自助充值完成额度准备,然后按本文配置安全组或防火墙。