
你已經會開帳號、管權限了,機器開出來卻連不上網,Security Group 設了半天還是打不通——八成的問題出在網路層。這篇適合第一次在 AWS 上把服務跑起來的人,還有從 K8s 轉過來、不習慣「出口 IP」這件事的人。
結論:public subnet 只放兩樣東西
ALB 和 NAT gateway。 其他全部關進 private subnet——應用、資料庫、Redis,沒有例外。
這一條決定了後面所有事:流量怎麼進來(走 ALB)、怎麼出去(走 NAT)、誰能連誰(Security Group 用引用不用 IP)。設定順序是 VPC → Subnet → IGW + NAT → Route Table → Security Group,五步,「建房子 → 隔間 → 裝門 → 畫路線 → 裝鎖」。
會踩的坑集中在畫路線和裝鎖,還有一個藏在 NAT 裡、平常看不到的上限。照這個順序講。
一、VPC 和 Subnet:一開始就給大
VPC 是你在 AWS 圈出來的一塊網路。CIDR 給 10.0.0.0/16,65,536 個 IP。有人覺得 /24 的 256 個夠用——夠用到你第一次想加第二個環境的時候。VPC 的主網段之後不能改,只能加副網段,而且跟其他 VPC 或地端重疊就永遠接不起來。
aws ec2 create-vpc --cidr-block 10.0.0.0/16 \
--tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=prod-vpc}]'Subnet 至少四個,跨兩個 AZ:
| 子網 | AZ | CIDR | 放什麼 |
|---|---|---|---|
| public-1a | ap-northeast-1a | 10.0.1.0/24 | ALB、NAT gateway |
| public-1c | ap-northeast-1c | 10.0.2.0/24 | ALB |
| private-1a | ap-northeast-1a | 10.0.10.0/24 | 應用、資料庫 |
| private-1c | ap-northeast-1c | 10.0.20.0/24 | 應用、資料庫 |
跨 AZ 不是可選項。一個 AZ 就是一個機房,機房會掛,而且 ALB 強制要求至少兩個 AZ。
aws ec2 create-subnet --vpc-id vpc-xxx --cidr-block 10.0.1.0/24 \
--availability-zone ap-northeast-1a \
--tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=public-1a}]'二、IGW、NAT、Route Table:門裝了,路沒畫
IGW 掛到 VPC,public subnet 就能上網。NAT gateway 建在 public subnet,讓 private subnet 的機器出得去、外面進不來——像公司大樓的大廳,你能從大廳出去,外人不能從大廳直接走進你的辦公室。
aws ec2 create-internet-gateway \
--tag-specifications 'ResourceType=internet-gateway,Tags=[{Key=Name,Value=prod-igw}]'
aws ec2 attach-internet-gateway --internet-gateway-id igw-xxx --vpc-id vpc-xxx
aws ec2 allocate-address --domain vpc
aws ec2 create-nat-gateway --subnet-id subnet-public-1a --allocation-id eipalloc-xxx然後是 Route Table。門裝好了,還要告訴每個 subnet「往外的流量走哪扇門」:
# public:走 IGW
aws ec2 create-route --route-table-id rtb-public \
--destination-cidr-block 0.0.0.0/0 --gateway-id igw-xxx
# private:走 NAT
aws ec2 create-route --route-table-id rtb-private \
--destination-cidr-block 0.0.0.0/0 --nat-gateway-id nat-xxx
aws ec2 associate-route-table --route-table-id rtb-public --subnet-id subnet-public-1a
aws ec2 associate-route-table --route-table-id rtb-private --subnet-id subnet-private-1a我有次建好 NAT,忘了改 private subnet 的 Route Table。ECS task 一直起不來,錯誤是拉不到 container image。花了一個小時才找到原因:private subnet 的 0.0.0.0/0 根本沒指向 NAT。機器連門在哪都不知道,當然出不去。
Route Table 是整條鏈裡最容易忘的一步,因為它不是「一個東西」,它是「兩個東西之間的關係」。建了 NAT 不等於用了 NAT。
三、NAT 的真面目:它不只是「讓你出去」
這段是我最近整理一份實際專案的 AWS 架構圖時才真正搞懂的。
那張圖上所有服務都關在 private subnet,對外全部走同一個 NAT。我一開始以為這只是標準做法,看到連線清單才發現原因:金流商要白名單。對方只接受固定 IP 來的請求,所以整個系統的出口必須收斂成一個 Elastic IP,綁在 NAT 上。網段怎麼切、服務放哪,全是被這一條逼出來的。
問題來了。NAT gateway 有個上限:每個 IPv4 位址、對每個「唯一目的地」(目的 IP + port + 協定的組合),最多 55,000 條同時連線。金流商就那一兩個 IP,尖峰時所有服務的連線都堆到同一個目的地。撞上限的時候錯誤率跳,但你的 task CPU 一點都不高——很難第一時間想到是 NAT。
第一個冒出來的答案是「多開幾個 NAT 分流」。我當時請 AI 幫我整理,它也是這樣建議的。錯的。多開 NAT 就多幾個出口 IP,固定 IP 白名單的前提就破了。
去翻官方文件才發現解法跟直覺相反:同一個 NAT gateway 可以綁最多 8 個 IPv4(1 個主要 + 7 個次要)。公有 NAT 預設只能綁 2 個 EIP,要先申請調高配額。上限直接變 8 倍,IP 還是你指定的,請對方把這 8 個都加進白名單就好。多開 NAT 那個念頭我默默收回。
順帶一個常被講一半的建議:「開 VPC Endpoint 讓 AWS 內部流量不經 NAT,省錢又減壓」。對,但 Endpoint 分兩種——Gateway 型(只有 S3 和 DynamoDB)免費;Interface 型(ECR、Secrets Manager、CloudWatch……全是這種)按小時、按 AZ、按流量收費。開一堆 Interface endpoint 可能比 NAT 處理費還貴。先算再開,帳單怎麼看放 第 11 篇。
四、Security Group:用引用,不用 IP
SG 是綁在網卡上的防火牆,只有 allow 沒有 deny。最少三組:
| SG | 方向 | Port | 來源 |
|---|---|---|---|
| ALB | 入站 | 443 | 0.0.0.0/0 |
| 應用 | 入站 | 8080 | ALB 的 SG ID |
| 資料庫 | 入站 | 5432 | 應用的 SG ID |
重點在來源那欄:不寫 IP,寫另一組 SG 的 ID。「只有經過 ALB 的流量才進得了應用、只有應用才連得到資料庫」——而且 task 擴到一百個也不用改任何一條規則,因為規則綁的是身分不是位址。
aws ec2 authorize-security-group-ingress --group-id sg-app \
--protocol tcp --port 8080 --source-group sg-alb一條我以前沒認真看的:SG 出站預設全開。入站鎖得再緊,機器被入侵後資料照樣從出站流出去。金流案子的合規會問這一題。出站至少限制到「只能到 NAT 和 VPC Endpoint」,細節在 第 12 篇。
別偷懶全開 0.0.0.0/0。等你收到 AWS 的帳單通知說有人在你機器上挖礦,就知道痛了。
除錯順序:先看 L3,再看 L4,最後才懷疑程式
連不上任何東西,看 Route Table 和 subnet(第三層)。Port 不通,看 Security Group(第四層)。HTTP 回 502 或 504,才輪到 ALB 和應用(第七層)。
八成的網路問題在前兩層。不要一上來就翻應用程式碼。
實戰 Checklist
- VPC CIDR 給
/16,主網段之後不能改 - public / private subnet 各兩個、跨兩個 AZ;public 只有 ALB 和 NAT
- Route Table:public → IGW、private → NAT,綁到每個 subnet
- 對方要白名單就把 NAT 綁固定 EIP;預估會撞 55,000 就先加副 IP;Endpoint 分清 Gateway(免費)跟 Interface(收費)
- SG 來源用 SG ID 不用 IP;出站不是全開
從 K8s 過來的話
VPC 大致對到 cluster 網路、Security Group 對到 NetworkPolicy(但沒有 label selector,所以才要用 SG 互相引用)、ALB 對到 Ingress controller。最不習慣的會是出口 IP 這件事——在 K8s 上很少人管 egress 長什麼 IP,到了 AWS 只要有第三方要白名單,整個網段切法就被它決定。K8s 那邊的網路模型看 K8s 網路模型。
VPN 這篇不講。員工連回 VPC 用 Client VPN,辦公室接 VPC 用 Site-to-Site VPN——但注意一條:經虛擬私有閘道接進來的 VPN 流量,導不進 NAT。地端想借雲端的固定 IP 出去,得改用 Transit Gateway。官方文件有寫,選接法的時候就決定了。
相關文章
- 上一篇 IAM,下一篇 EKS 三選一
- 流量入口的另一半在 Route 53
- 這些概念在自架環境長什麼樣:Network & DNS
網路設定就像水電管線——平常沒人在意,壞掉的時候所有人都在意。
