問題現象
- EC2 實例上 Nginx 已啟動,本地 `curl localhost:80` 正常
- 瀏覽器訪問公網 IP:80 提示無法連接/超時
- `ping` 公網 IP 不通
根因:AWS 安全組默認拒絕所有入站流量
EC2 實例掛載的 Security Group (SG) 充當**虛擬防火牆**,默認規則:
必須顯式添加允許 HTTP (80)、HTTPS (443)、ICMP (ping) 的入站規則。
解決步驟(AWS 控制台)
- 登錄 AWS Console → EC2 → 左側「安全組」
- 選中實例綁定的 SG (如 `sg-xxxxxxxx`) → 「入站規則」標籤
- 點擊「編輯入站規則」→「添加規則」添加以下 3 條:
| 類型 | 協議 | 端口範圍 | 來源 | 描述 |
| HTTP | TCP | 80 | 0.0.0.0/0 | 允許全網訪問 Web 服務 |
| HTTPS | TCP | 443 | 0.0.0.0/0 | 允許 HTTPS (如有 SSL) |
| 自定義 ICMP - IPv4 | ICMP | N/A | 0.0.0.0/0 | 允許 ping (類型 8 Echo Request) |
- 點擊「保存規則」→ 立即生效,無需重啟實例
驗證命令
# 本地測試
curl -I https://<公網IP>
# 應返回 HTTP/1.1 200 OK
# 測試 ping
ping <公網IP>
# 應有回包
# 實例內部確認 Nginx 監聽
ss -tlnp | grep :80
# 或 netstat -tlnp | grep :80
進階安全建議
- 最小權限原則:來源 IP 限制為公司出口 IP/辦公網段,而非 `0.0.0.0/0`
- SSH 端口 (22) 同理:僅允許運維 IP 訪問
- 使用 ALB (Application Load Balancer):生產環境建議 SG 僅允許 ALB SG 入站,實例不直接暴露公網
- Network ACL (NACL):子網級無狀態防火牆,默認允許所有,通常無需修改,但若配置了 Deny 規則會阻斷流量
排查清單(若加規則仍不通)
- 實例內部防火牆:`systemctl status firewalld` / `ufw status` / `iptables -L` → 確保允許 80
- Nginx 監聽地址:`listen 0.0.0.0:80;` 而非 `listen 127.0.0.1:80;`
- 實例狀態檢查:EC2 控制台「狀態檢查」是否通過
- VPC 路由表:子網關聯的路由表是否指向 IGW (Internet Gateway)
- 公網 IP:實例是否分配了彈性 IP 或自動公網 IP
💡 一句總結:AWS 安全組 = 雲端防火牆,默認全擋,必須手動放行 80/443/ICMP 入站規則。這是 EC2 新手最容易踩的坑,也是最容易解決的問題。