AWS IGW 網路連線完全指南:從零開始理解雙向通訊機制

Published November 4, 2025 by 徐培鈞
架構

在學習 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

圖解說明:

  1. 實線箭頭:入站流量(外部 → EC2)
  2. 虛線箭頭:出站流量(EC2 → 外部)
  3. 顏色區分
  • 🔵 藍色: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 主動向外」的出站通訊。

必要條件清單

出站通訊相對簡單,只需要滿足這些條件:

說明提供對外通道
是否必須✅ 必須
說明指引流量走向
是否必須✅ 必須
說明通常預設允許
是否必須✅ 必須
說明讓外部回應找到路
是否必須❌ 不必須

重點:出站通訊不需要 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 發出請求時:

  1. IGW 會記錄這個連線
  2. 將來源 IP 轉換成 VPC 的公開 IP
  3. 當外部回應時,IGW 根據記錄將回應送回正確的 EC2

這就像是公司總機:

  • 員工(EC2)打電話出去時,顯示的是公司電話(VPC 的 IP)
  • 對方回電時,總機(IGW)知道要轉接給哪個員工

常見問題排除

問題:EC2 無法連到外部網站

檢查清單:

  1. ✅ 確認 Subnet 的 Route Table 有 0.0.0.0/0 → IGW 設定
  2. ✅ 確認 Security Group 的 Outbound 規則沒有被限制
  3. ✅ 確認 VPC 有綁定 Internet Gateway
  4. ✅ 確認 Network ACL 沒有阻擋(預設通常允許)

入站通訊(外部主動連 EC2)

情境說明

現在換個方向,你想要:

  • 從自己的電腦 SSH 登入 EC2(Port 22)
  • 讓使用者造訪你在 EC2 上架設的網站(Port 80/443)
  • 提供 API 服務給外部應用程式呼叫

這些都屬於「外部主動連進來」的入站通訊。

必要條件清單(缺一不可!)

入站通訊的條件比出站嚴格得多:

說明流量進入通道
是否必須✅ 必須
缺少會怎樣完全無法連線
說明引導流量
是否必須✅ 必須
缺少會怎樣流量找不到路徑
說明外部能定位
是否必須✅ 必須
缺少會怎樣外部不知道要連哪裡
說明防火牆放行
是否必須✅ 必須
缺少會怎樣Connection Refused

生活化比喻:讓朋友來你家拜訪

讓我們用一個生活化的例子來理解:

生活比喻你家的地址
沒有的話會怎樣朋友不知道去哪裡找你
生活比喻社區大門
沒有的話會怎樣有地址但社區鎖住,進不來
生活比喻社區內的路標
沒有的話會怎樣進了社區但找不到你家
生活比喻社區警衛室
沒有的話會怎樣社區管理員攔住訪客
生活比喻你家的門
沒有的話會怎樣到了門口但你不開門

所有條件都要滿足,朋友才能順利來訪!

防火牆雙層保護:

  • 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 ACLSubnet(子網路)
Security GroupInstance(實例)
Network ACLStateless(無狀態)
Security GroupStateful(有狀態)
Network ACL允許 + 拒絕
Security Group只有允許
Network ACL有(數字越小優先)
Security Group無(全部評估)
Network ACL允許所有
Security Group拒絕所有入站
Network ACL需明確設定 Outbound
Security Group自動允許

深入理解:為什麼需要 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 → 外部)下載更新、呼叫 API、連資料庫
入站(外部 → EC2)SSH 登入、提供 Web 服務
出站(EC2 → 外部)✅ 需要
入站(外部 → EC2)✅ 需要
出站(EC2 → 外部)✅ 需要(0.0.0.0/0 → IGW)
入站(外部 → EC2)✅ 需要(0.0.0.0/0 → IGW)
出站(EC2 → 外部)❌ 不需要
入站(外部 → EC2)✅ 必須
出站(EC2 → 外部)Outbound 允許(預設允許)
入站(外部 → EC2)Inbound + Outbound 都要設定
出站(EC2 → 外部)Outbound 允許(預設允許)
入站(外部 → EC2)Inbound 必須開對應 Port
出站(EC2 → 外部)EC2 主動發起
入站(外部 → EC2)外部主動發起
出站(EC2 → 外部)Timeout / Network Unreachable
入站(外部 → EC2)Connection Refused / Timeout

防火牆層級對照

作用層級Subnet
狀態性Stateless
預設行為允許所有
設定難度★★★ 較難
初學者建議使用預設即可
作用層級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  # 如果用 Nginx

EC2 無法連到外部網站

症狀:

[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 網路連線指南!

現在你應該能夠:

  • ✅ 清楚區分出站和入站通訊
  • ✅ 知道每個元件的作用
  • ✅ 獨立設定並排除問題
  • ✅ 遵循安全最佳實踐

記住,網路設定的關鍵在於:

  1. 理解流量的方向(誰發起請求)
  2. 逐一檢查每個環節(IGW → Route → IP → Security Group)
  3. 遵循最小權限原則(安全第一)

繼續探索,持續學習,你已經掌握了 AWS 網路的核心基礎!

有問題或需要更多協助?

  • AWS 官方文件:https://docs.aws.amazon.com/vpc/
  • AWS 支援論壇:https://forums.aws.amazon.com/
  • AWS 免費培訓:https://aws.amazon.com/training/

祝你在 AWS 的學習之路順利!🚀