在學習 AWS 的過程中,許多初學者常常被 EC2 的網路連線機制搞得一頭霧水。
明明設定了 Internet Gateway(IGW),為什麼還是無法從外部連線到 EC2?
為什麼有時候 EC2 可以連到外部網站,但外部卻連不進來?
這篇文章將用最白話、最系統化的方式,帶你完全理解 EC2 的網路通訊原理。
我們會從「出站」和「入站」兩個方向來拆解,讓你清楚知道每個元件的角色,以及什麼情況下需要什麼配置。
讀完這篇文章,你將能夠:
- 理解 EC2 與外部網路的雙向通訊機制
- 知道 Public IP、IGW、Security Group 各自的作用
- 獨立判斷並解決常見的連線問題
- 建立正確的網路安全觀念
讓我們開始吧!
核心觀念建立
什麼是雙向通訊?
在討論 EC2 的網路連線時,我們需要區分兩種通訊方向:
出站通訊(Outbound)
- EC2 主動向外部發送請求
- 例如:EC2 下載軟體更新、呼叫外部 API、連線到資料庫
入站通訊(Inbound)
- 外部主動向 EC2 發送請求
- 例如:你從自己電腦 SSH 登入 EC2、使用者瀏覽你的網站
這兩個方向所需的配置條件完全不同,這是初學者最容易混淆的地方。
網路元件架構圖
以下是 EC2 網路通訊的完整架構圖,幫助你理解各元件之間的關係:
graph TB
subgraph Internet["☁️ 網際網路"]
User["👤 外部使用者"]
External["🌐 外部服務<br/>(Google, API, etc)"]
end
subgraph VPC["🏢 VPC (Virtual Private Cloud)"]
IGW["🚪 Internet Gateway<br/>(VPC 的對外大門)"]
subgraph PublicSubnet["📦 Public Subnet (10.0.1.0/24)"]
RT["🗺️ Route Table<br/>0.0.0.0/0 → IGW"]
NACL["🛡️ Network ACL<br/>(Subnet 層級防火牆)"]
subgraph EC2Instance["💻 EC2 Instance"]
SG["🔒 Security Group<br/>(實例層級防火牆)"]
ENI["🔌 ENI<br/>Private IP: 10.0.1.50<br/>Public IP: 3.113.20.99"]
App["⚙️ 應用程式<br/>(Web Server, SSH, etc)"]
end
end
end
User -->|"1️⃣ 請求<br/>(例: SSH, HTTP)"| IGW
IGW -->|"2️⃣ 查詢路由"| RT
RT -->|"3️⃣ 導向 Subnet"| NACL
NACL -->|"4️⃣ Subnet 層檢查<br/>(Stateless)"| SG
SG -->|"5️⃣ 實例層檢查<br/>(Stateful)"| ENI
ENI -->|"6️⃣ 流量抵達"| App
App -->|"7️⃣ 回應"| ENI
ENI -->|"8️⃣ 通過 SG<br/>(自動允許)"| SG
SG -->|"9️⃣ 通過 NACL<br/>(需明確規則)"| NACL
NACL -->|"🔟 經 IGW 返回"| IGW
IGW -->|"✅ 回應送達"| User
App -.->|"出站請求<br/>(apt-get, curl)"| ENI
ENI -.->|"經 SG, NACL"| IGW
IGW -.->|"連到外部"| External
External -.->|"回應自動返回"| IGW
style VPC fill:#e1f5ff,stroke:#0066cc,stroke-width:3px
style PublicSubnet fill:#fff4e6,stroke:#ff9800,stroke-width:2px
style EC2Instance fill:#f3e5f5,stroke:#9c27b0,stroke-width:2px
style IGW fill:#c8e6c9,stroke:#4caf50,stroke-width:2px
style NACL fill:#ffccbc,stroke:#ff5722,stroke-width:2px
style SG fill:#ffcdd2,stroke:#f44336,stroke-width:2px
style Internet fill:#e8f5e9,stroke:#66bb6a,stroke-width:2px圖解說明:
- 實線箭頭:入站流量(外部 → EC2)
- 虛線箭頭:出站流量(EC2 → 外部)
- 顏色區分:
- 🔵 藍色:VPC 範圍
- 🟠 橘色:Subnet 範圍
- 🟣 紫色:EC2 實例範圍
- 🟢 綠色:對外元件
關鍵流程:
- 入站:Internet → IGW → Route Table → NACL → Security Group → ENI → App
- 出站:App → ENI → Security Group → NACL → IGW → Internet
關鍵元件介紹
在深入了解之前,我們先認識幾個重要角色:
Internet Gateway(IGW)- 網路的大門
- VPC 與外部網路之間的橋樑
- 沒有它,你的 VPC 就是一個封閉的內網
- 具備雙向轉發能力
Route Table – 交通指揮
- 決定網路流量該往哪裡走
- 必須設定
0.0.0.0/0 → IGW才能連接外部網路
ENI(Elastic Network Interface)- 虛擬網卡
- EC2 的網路介面
- IP 地址是綁定在 ENI 上,不是 EC2 本體
Public IP – 對外地址
- 讓外部世界能找到你的 EC2
- 可以是自動分配的 Public IP 或固定的 Elastic IP
Security Group – 防火牆
- AWS 提供的虛擬防火牆
- 控制哪些流量可以進出
- 作用在 EC2 實例層級
- 具有狀態性(Stateful):允許出站的流量,回應會自動被允許
Network ACL (NACL) – 子網路層防火牆
- Subnet 層級的防火牆(比 Security Group 更外層)
- 控制進出 Subnet 的流量
- 作用在 Subnet 層級
- 無狀態性(Stateless):進出流量需要分別設定規則
- 預設允許所有流量
- 通常用於額外的安全層級
出站通訊(EC2 主動連外部)
情境說明
假設你的 EC2 需要執行以下動作:
- 執行
apt-get update下載軟體更新 - 程式呼叫外部的 Google Maps API
- 連線到外部的 RDS 資料庫
這些都屬於「EC2 主動向外」的出站通訊。
必要條件清單
出站通訊相對簡單,只需要滿足這些條件:
| 條件 | 說明 | 是否必須 |
|---|---|---|
| VPC 有 Internet Gateway | 提供對外通道 | ✅ 必須 |
Route Table 設定 0.0.0.0/0 → IGW | 指引流量走向 | ✅ 必須 |
| Security Group 允許 Outbound | 通常預設允許 | ✅ 必須 |
| Public IP | 讓外部回應找到路 | ❌ 不必須 |
重點:出站通訊不需要 Public IP!
流程圖解
[EC2 執行 apt-get update]
↓
發送 HTTP 請求
↓
[Route Table 查詢]
↓
判定:目的地是外部 → 走 IGW
↓
[Internet Gateway]
↓
轉發到外部伺服器(例如 Ubuntu 更新伺服器)
↓
外部伺服器回傳資料
↓
[Internet Gateway 接收]
↓
根據 NAT 記錄回傳給 EC2
↓
[EC2 收到更新檔案] ✅為什麼不需要 Public IP?
這是許多人的疑問。答案是:
IGW 具備 NAT(Network Address Translation)功能
當 EC2 發出請求時:
- IGW 會記錄這個連線
- 將來源 IP 轉換成 VPC 的公開 IP
- 當外部回應時,IGW 根據記錄將回應送回正確的 EC2
這就像是公司總機:
- 員工(EC2)打電話出去時,顯示的是公司電話(VPC 的 IP)
- 對方回電時,總機(IGW)知道要轉接給哪個員工
常見問題排除
問題:EC2 無法連到外部網站
檢查清單:
- ✅ 確認 Subnet 的 Route Table 有
0.0.0.0/0 → IGW設定 - ✅ 確認 Security Group 的 Outbound 規則沒有被限制
- ✅ 確認 VPC 有綁定 Internet Gateway
- ✅ 確認 Network ACL 沒有阻擋(預設通常允許)
入站通訊(外部主動連 EC2)
情境說明
現在換個方向,你想要:
- 從自己的電腦 SSH 登入 EC2(Port 22)
- 讓使用者造訪你在 EC2 上架設的網站(Port 80/443)
- 提供 API 服務給外部應用程式呼叫
這些都屬於「外部主動連進來」的入站通訊。
必要條件清單(缺一不可!)
入站通訊的條件比出站嚴格得多:
| 條件 | 說明 | 是否必須 | 缺少會怎樣 |
|---|---|---|---|
| VPC 有 Internet Gateway | 流量進入通道 | ✅ 必須 | 完全無法連線 |
Route Table 設定 0.0.0.0/0 → IGW | 引導流量 | ✅ 必須 | 流量找不到路徑 |
| ENI 綁定 Public IP | 外部能定位 | ✅ 必須 | 外部不知道要連哪裡 |
| Security Group 開啟對應 Port | 防火牆放行 | ✅ 必須 | Connection Refused |
生活化比喻:讓朋友來你家拜訪
讓我們用一個生活化的例子來理解:
| AWS 元件 | 生活比喻 | 沒有的話會怎樣 |
|---|---|---|
| Public IP | 你家的地址 | 朋友不知道去哪裡找你 |
| Internet Gateway | 社區大門 | 有地址但社區鎖住,進不來 |
| Route Table | 社區內的路標 | 進了社區但找不到你家 |
| Network ACL | 社區警衛室 | 社區管理員攔住訪客 |
| Security Group | 你家的門 | 到了門口但你不開門 |
所有條件都要滿足,朋友才能順利來訪!
防火牆雙層保護:
- Network ACL:社區層級的管制(可選設定,預設放行)
- Security Group:家門層級的管制(必須設定,預設不放行)
詳細流程圖解
[外部使用者想連線到 EC2]
↓
輸入 EC2 的 Public IP(例如:3.113.20.99)
↓
[DNS 解析] → 找到目標 IP
↓
請求送達 AWS 網路邊界
↓
[Internet Gateway 接收]
↓
查詢 Route Table:這個 IP 對應哪個 Subnet?
↓
流量被導向正確的 Subnet
↓
[Network ACL 檢查] ← 第一層防火牆(Subnet 層級)
├─ ✅ Inbound 規則允許 → 繼續
└─ ❌ Inbound 規則拒絕 → 封包被丟棄(無回應)
↓
[Security Group 檢查] ← 第二層防火牆(實例層級)
├─ ✅ 有開放對應 Port → 放行
└─ ❌ 沒有開放 → 拒絕(Connection Refused)
↓
[流量抵達 EC2] ✅
↓
EC2 上的應用程式處理請求
↓
產生回應封包
↓
[Security Group 自動允許回應] ← Stateful,記得來時的連線
↓
[Network ACL 檢查 Outbound 規則] ← Stateless,需明確規則
├─ ✅ Outbound 規則允許 → 放行
└─ ❌ Outbound 規則拒絕 → 封包被丟棄
↓
回應沿著原路返回外部使用者 ✅兩層防火牆的差異:
| 特性 | Network ACL | Security Group |
|---|---|---|
| 作用層級 | Subnet(子網路) | Instance(實例) |
| 狀態性 | Stateless(無狀態) | Stateful(有狀態) |
| 規則類型 | 允許 + 拒絕 | 只有允許 |
| 規則順序 | 有(數字越小優先) | 無(全部評估) |
| 預設行為 | 允許所有 | 拒絕所有入站 |
| 回應封包 | 需明確設定 Outbound | 自動允許 |
深入理解:為什麼需要 Public IP?
ENI 與 IP 的關係
很多人以為 IP 是直接給 EC2 的,其實不是:
EC2 實例
└─ ENI(虛擬網卡)
├─ Private IP(必定有,例如:10.0.1.50)
└─ Public IP(選配,例如:3.113.20.99)Private IP
- 只能在 VPC 內部使用
- 外部網路完全看不到
- 就像公司內部分機號碼
Public IP
- 外部網路可以路由到
- 可以是自動分配或 Elastic IP
- 就像公司的對外總機號碼
如果沒有 Public IP 會發生什麼?
假設你嘗試從家裡電腦 SSH 到 EC2:
你的電腦:ssh ec2-user@10.0.1.50
↑
這是 Private IP
結果:Timeout(連線逾時)
原因:你的家用網路路由器不知道 10.0.1.0/24 這個網段在哪裡
這個 IP 只在 AWS VPC 內部有效正確做法:
你的電腦:ssh ec2-user@3.113.20.99
↑
這是 Public IP
Internet Gateway 會將請求轉發到內部的 10.0.1.50完整案例:設定可 SSH 的 EC2
讓我們走過完整流程:
步驟 1:建立 VPC 與 IGW
1. 建立 VPC(例如:10.0.0.0/16)
2. 建立 Internet Gateway
3. 將 IGW 附加到 VPC步驟 2:設定 Route Table
1. 建立或選擇 Route Table
2. 新增路由:
Destination: 0.0.0.0/0
Target: igw-xxxxx步驟 3:建立 Subnet 並關聯 Route Table
1. 建立 Public Subnet(例如:10.0.1.0/24)
2. 將 Subnet 關聯到上面的 Route Table
3. 啟用「自動分配 Public IP」步驟 4:設定 Security Group
1. 建立新的 Security Group
2. 新增 Inbound 規則:
- Type: SSH
- Port: 22
- Source: 你的 IP/32步驟 5:啟動 EC2
1. 選擇 AMI(例如 Amazon Linux 2)
2. 選擇剛才建立的 Subnet
3. 確認「自動分配 Public IP」已啟用
4. 選擇剛才建立的 Security Group
5. 下載或選擇 Key Pair步驟 6:測試連線
# 從你的電腦執行
ssh -i your-key.pem ec2-user@<EC2_PUBLIC_IP>
# 成功的話會看到
[ec2-user@ip-10-0-1-50 ~]$雙向通訊對照表
出站 vs 入站完整比較
| 項目 | 出站(EC2 → 外部) | 入站(外部 → EC2) |
|---|---|---|
| 使用情境 | 下載更新、呼叫 API、連資料庫 | SSH 登入、提供 Web 服務 |
| 是否需要 IGW? | ✅ 需要 | ✅ 需要 |
| 是否需要 Route Table 設定? | ✅ 需要(0.0.0.0/0 → IGW) | ✅ 需要(0.0.0.0/0 → IGW) |
| 是否需要 Public IP? | ❌ 不需要 | ✅ 必須 |
| Network ACL 設定 | Outbound 允許(預設允許) | Inbound + Outbound 都要設定 |
| Security Group 設定 | Outbound 允許(預設允許) | Inbound 必須開對應 Port |
| 誰發起連線? | EC2 主動發起 | 外部主動發起 |
| 失敗時的錯誤訊息 | Timeout / Network Unreachable | Connection Refused / Timeout |
防火牆層級對照
| 防火牆 | 作用層級 | 狀態性 | 預設行為 | 設定難度 | 初學者建議 |
|---|---|---|---|---|---|
| Network ACL | Subnet | Stateless | 允許所有 | ★★★ 較難 | 使用預設即可 |
| Security Group | Instance | Stateful | 拒絕入站 | ★★☆ 中等 | 必須熟練掌握 |
常見問題與疑難排解
我的 EC2 無法被外部連線
問題 A:Connection Timeout
可能原因:
- ❌ 沒有 Public IP
- ❌ Route Table 沒有指向 IGW
- ❌ Network ACL 阻擋(較少見)
排查步驟:
1. 檢查 EC2 是否有 Public IP
EC2 Console → 實例詳情 → Public IPv4 address
2. 檢查 Route Table
VPC Console → Route Tables → 找到 Subnet 使用的 Table
確認有:0.0.0.0/0 → igw-xxxxx
3. 檢查 Network ACL(進階)
VPC Console → Network ACLs
確認 Inbound 和 Outbound 規則允許流量問題 B:Connection Refused
可能原因:
- ❌ Security Group 沒有開啟對應 Port
- ❌ EC2 上的服務沒有啟動
排查步驟:
1. 檢查 Security Group
EC2 Console → 實例 → Security → Security Groups
確認 Inbound 規則有開啟目標 Port
2. 登入 EC2 檢查服務狀態
# 檢查 22 port(SSH)
sudo systemctl status sshd
# 檢查 80 port(HTTP)
sudo systemctl status httpd # Amazon Linux
sudo systemctl status nginx # 如果用 NginxEC2 無法連到外部網站
症狀:
[ec2-user@ip-10-0-1-50 ~]$ curl google.com
curl: (6) Could not resolve host: google.com可能原因與解決:
原因 1:Route Table 設定錯誤
檢查:VPC Console → Route Tables
解決:確保有 0.0.0.0/0 → igw-xxxxx原因 2:DNS 解析問題
檢查:cat /etc/resolv.conf
解決:確保有正確的 nameserver(通常是 VPC DNS)原因 3:Security Group Outbound 被限制
檢查:Security Group → Outbound rules
解決:確保有允許 HTTPS(443)或 All Traffic如何知道是哪個環節出問題?
使用這個診斷流程圖:
無法連線
↓
問:有 Public IP 嗎?
├─ 否 → 去 EC2 設定分配 Public IP 或 Elastic IP
└─ 是 ↓
問:Route Table 有設定 IGW 嗎?
├─ 否 → 去 Route Table 新增 0.0.0.0/0 → IGW
└─ 是 ↓
問:Security Group 有開 Port 嗎?
├─ 否 → 去 Security Group 新增 Inbound 規則
└─ 是 ↓
問:EC2 上的服務有啟動嗎?
├─ 否 → sudo systemctl start <服務名稱>
└─ 是 ↓
進階檢查:Network ACL、VPC Peering、作業系統防火牆安全最佳實踐
Security Group 的黃金原則
原則 1:最小權限原則
❌ 不好的做法:
Source: 0.0.0.0/0 (允許全世界)
Port: 22 (SSH)
✅ 好的做法:
Source: 你的 IP/32 (只允許你)
Port: 22 (SSH)原則 2:分層設計
Web Server Security Group:
├─ Inbound: 80, 443 from 0.0.0.0/0
└─ Outbound: All
App Server Security Group:
├─ Inbound: 8080 from Web Server SG
└─ Outbound: All
Database Security Group:
├─ Inbound: 3306 from App Server SG
└─ Outbound: None (資料庫不需主動對外)Public IP 使用建議
何時該用 Elastic IP?
使用 Elastic IP 的時機:
- ✅ 需要固定 IP(例如要設定白名單)
- ✅ 需要快速切換到備用 EC2
- ✅ IP 地址被寫在設定檔或文件中
使用自動分配 Public IP 的時機:
- ✅ 測試或開發環境
- ✅ Auto Scaling Group(IP 會動態變化)
- ✅ 前面有 Load Balancer(使用者連 LB 的 IP)
成本考量:
Elastic IP 收費規則:
✅ 綁定到運行中的 EC2 → 免費
❌ 沒有綁定或 EC2 停止 → 每小時收費結語
恭喜你完成這篇完整的 EC2 網路連線指南!
現在你應該能夠:
- ✅ 清楚區分出站和入站通訊
- ✅ 知道每個元件的作用
- ✅ 獨立設定並排除問題
- ✅ 遵循安全最佳實踐
記住,網路設定的關鍵在於:
- 理解流量的方向(誰發起請求)
- 逐一檢查每個環節(IGW → Route → IP → Security Group)
- 遵循最小權限原則(安全第一)
繼續探索,持續學習,你已經掌握了 AWS 網路的核心基礎!
有問題或需要更多協助?
- AWS 官方文件:https://docs.aws.amazon.com/vpc/
- AWS 支援論壇:https://forums.aws.amazon.com/
- AWS 免費培訓:https://aws.amazon.com/training/
祝你在 AWS 的學習之路順利!🚀