💡 先搞懂問題
虛構公司「青松物流」的 IT 工程師第一次在 Azure 開了一台 Windows VM,準備放訂單查詢網站。精靈為了讓他「馬上連得進去」,替 VM 配了一個公用 IP,還勾選允許 RDP(TCP 3389)從任何地方連入。網站隔天就上線了,但一週後看登入紀錄,失敗的登入嘗試來自世界各地、一天好幾千筆。他想改,卻發現自己說不清楚:這台 VM 到底在哪個網路裡?哪一條規則在放行 3389?如果改成只開 443,他自己以後要怎麼進去維護?
這三個問題各自對應一個 Azure 元件。虛擬網路(Virtual Network,VNet)是你在某個區域裡擁有的私人網路,先決定一段位址空間(例如 10.20.0.0/16),再切成幾個子網路(subnet),例如放網站的 app 子網路、放資料庫的 db 子網路。網路安全性群組(Network Security Group,NSG)是一份依優先順序排好的允許/拒絕規則清單,可以關聯到子網路或 VM 的網路介面(NIC),決定哪些來源、哪個連接埠的流量能進出。Azure Bastion 則是部署在 VNet 裡的受管理跳板:你從瀏覽器用 HTTPS 連到 Bastion,Bastion 再用私人 IP 幫你接上 VM 的 RDP 或 SSH,VM 本身不需要公用 IP,3389 也不必對網際網路開放。
新手最常卡的地方有三個:以為 NSG 規則是「全部看完再決定」,其實是從小號碼往大號碼比對、第一條符合就停;以為子網路掛了 NSG 就夠,忘了網路介面上可能還有另一份 NSG,兩份都要允許才進得來;以及切子網路時忘了每個子網路 Azure 會先拿走 5 個位址,或把 Bastion 的子網路取錯名字、切得太小。
生活比喻:有警衛和訪客中心的社區大樓
想像青松社區有三棟樓。整個社區有自己的圍牆和門牌編號規則,住戶之間在社區裡走動不必出大門。每一棟樓門口有一位警衛,手上拿著一份名單,名單從第 1 條往下寫:「穿快遞制服、要送貨到 1 樓的,放行」「找住戶推銷的,擋下」……警衛從第一條開始比對,比到符合的那一條就照做,不會再往下看。名單最後面永遠印著三條社區公約:「社區住戶互相拜訪可以」「管委會的巡邏員可以」「其他人一律不准進」。
住戶自己家門也可以再裝一道鎖,有自己的規則。訪客要先過大樓警衛、再過家門鎖,兩關都放行才進得了家。至於水電師傅這種需要進住戶家裡的人,社區規定不能從大馬路直接按住戶門鈴,一律先到訪客中心登記、驗證身分,再由訪客中心的專人帶進去。這樣一來,住戶家門根本不必對大馬路開。
這個比喻有四個地方和實際不同。第一,真實的警衛進出都要盤查,NSG 則是具狀態的(stateful):一條連線被允許進來後,Azure 會記住這條連線,回應封包自動放行,不必再寫一條反方向的規則;反過來,VM 主動往外連線被允許時,回來的流量也不用另外開。第二,警衛也許會看你的包包,NSG 只看來源與目的 IP、連接埠和通訊協定,不檢查封包內容,擋 SQL 注入那類攻擊是 Web 應用程式防火牆的工作。第三,「先過警衛、再過家門」只描述了進來的方向;出去的流量順序相反,先評估網路介面的 NSG,再評估子網路的 NSG。第四,訪客中心只負責帶路,進了住戶家還是要用 VM 自己的帳號密碼或 SSH 金鑰登入,Bastion 不會替你管 VM 的帳號。
🎮 互動實驗室一:NSG 規則比對模擬器
情境:青松物流的網站 VM「web01」(私人 IP 10.20.1.4)放在 app 子網路裡。子網路關聯了一個 NSG,VM 的網路介面也關聯了另一個 NSG,兩份清單都只列入站(inbound)規則,目的地都是這台 VM。先選來源、目的連接埠與通訊協定,按「送出封包」,畫面會依序比對規則,在第一條符合的地方停下。你可以直接改自訂規則的優先順序、刪除規則、新增規則,或取消勾選某一層的 NSG,再看下方四個任務是否全部達成。
① 子網路 NSG:nsg-snet-app
入站時先評估這一份
② 網路介面 NSG:nsg-web01-nic
子網路 NSG 允許後,才輪到這一份
🎮 互動實驗室二:子網路規劃計算器
先在左上拉滑桿,熟悉「前置長度 /n 對應幾個位址、扣掉 Azure 保留的 5 個還剩幾個」。接著在左下輸入虛擬網路的位址空間與各子網路,右邊會即時算出每個子網路的保留位址、可用範圍與可用數量,並檢查五件事:格式與網路位址是否正確、是否落在位址空間內、大小是否在 /29 以上、子網路之間有沒有重疊,以及 Bastion 的子網路名稱與大小。可以先按「常見錯誤」看看錯誤長什麼樣子。
一、前置長度和可用位址
二、虛擬網路與子網路
三、計算與檢查結果
🛠️ 操作教學:建立虛擬網路、NSG 與 Bastion
跟著 8 個步驟,在左邊的示意畫面上替青松物流建立一個虛擬網路(含 app 子網路與 AzureBastionSubnet)、一個 NSG 與一條入站規則、把 NSG 關聯到子網路,最後建立 Bastion。你填的名稱、區域、位址與 SKU 會即時反映到右邊的 Azure CLI 與 Bicep;目前步驟對應的那幾行會以黃色底標示。填錯時畫面會說明原因,修正後才能進到下一步。
自己動手時要注意
權限:在資源群組上需要能建立網路資源的角色,例如參與者(Contributor)或網路參與者(Network Contributor);只想讓同事透過 Bastion 連 VM,對方至少需要 VM、Bastion 資源與 VM 網路介面的讀取者(Reader)角色,官方文件另有完整清單。費用:虛擬網路、子網路與 NSG 本身不另外收費;Bastion 的 Basic、Standard、Premium 依時數與輸出資料量計費,部署完成後即使沒人連線也在計費,公用 IP 也有費用,Developer SKU 則不收時數費用。收尾:練習完把整個資源群組刪掉,最不容易漏:
# 刪除練習用的資源群組與裡面所有資源(無法復原,確認名稱再執行)
az group delete --name rg-qingsong-net --yes --no-wait
範例裡沒有任何金鑰、密碼或訂用帳戶 ID。用 CLI 前先執行 az login,有多個訂用帳戶時用 az account set --subscription <your-subscription-id> 切換;這一行的佔位字請換成自己的值,不要把真實 ID 貼到公開的地方。
📘 原理補完
虛擬網路:先把位址規劃好,之後才不會卡住
虛擬網路屬於單一區域,會涵蓋那個區域的所有可用性區域;要跨區域互通,就要用全域 VNet 對等互連(global virtual network peering)或閘道。建立時先給一段或多段位址空間,官方建議用 RFC 1918 的私人範圍(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16),也接受 100.64.0.0/10;再切成子網路。IPv4 子網路最小 /29、最大 /2,IPv6 子網路固定 /64。
每個子網路 Azure 保留 5 個位址:第一個是網路位址,第二個(.1)給預設閘道,第三、四個(.2、.3)用來把 Azure DNS 對應進虛擬網路,最後一個是廣播位址。所以 /24 有 256 個位址、可用 251 個,/29 只剩 3 個。實驗室二的計算就是 2(32−n) − 5。
規劃時有三件事要先想好。第一,位址空間不能和要連線的地端網路或其他虛擬網路重疊,否則日後無法建立對等互連或 VPN,到時候只能重新編址。第二,有些服務要專用子網路而且有固定名稱,例如 Bastion 的 AzureBastionSubnet(/26 或更大)、VPN 與 ExpressRoute 閘道的 GatewaySubnet、Azure Firewall 的 AzureFirewallSubnet;先在位址空間裡留好位置,比事後擠出來容易得多。第三,NSG、路由表、NAT Gateway 多半關聯在子網路上,所以「依角色切子網路」等於「依角色切安全與路由規則」。
還有一個 2026 年要注意的變更:2026 年 3 月 31 日之後發布的 API 版本,新建虛擬網路的子網路預設是私人子網路(private subnet,defaultOutboundAccess = false),入口網站也已預設這樣建立。這種子網路裡的 VM 沒有隱含的網際網路輸出,要上網得用明確的方式,例如 NAT Gateway、Standard Load Balancer 輸出規則、Standard 公用 IP,或 Azure Firewall 搭配使用者定義路由。既有的虛擬網路不受影響。操作教學的 Bicep 在 app 子網路寫了 defaultOutboundAccess: false,就是把這個行為寫明。
NSG 規則怎麼比對:優先順序、符合即停、預設規則
每條安全性規則有名稱、優先順序、來源與目的(任何、IP 位址、CIDR、服務標籤或應用程式安全性群組)、通訊協定(TCP、UDP、ICMP、ESP、AH 或任何)、方向(入站或出站)、連接埠範圍與動作(允許或拒絕)。優先順序是 100~4096 的數字,同一個 NSG 裡不能重複;數字越小越先評估,一旦封包符合某條規則就停止評估,後面即使有條件更精準的規則也不會被看到。
每個 NSG 都有不能刪除的預設規則,優先順序在 65000 以後,所以你寫的規則一定先被評估;要改變預設行為,就用較小的號碼寫一條規則蓋過它。入站預設是 AllowVNetInBound(65000,VirtualNetwork 到 VirtualNetwork 允許)、AllowAzureLoadBalancerInBound(65001,允許 Azure Load Balancer 的健康探查)、DenyAllInbound(65500,其餘全部拒絕);出站預設是 AllowVnetOutBound(65000)、AllowInternetOutBound(65001)、DenyAllOutBound(65500)。換句話說,什麼都不寫的 NSG 會擋掉所有來自網際網路的入站流量,但允許 VM 往外連網際網路。
來源與目的可以寫服務標籤(service tag),它代表 Microsoft 維護的一組 IP 前置詞,例如 Internet、VirtualNetwork、AzureLoadBalancer、Storage,IP 變了也不必改規則。VirtualNetwork 不只是本身的位址空間,也包含對等互連的虛擬網路與透過閘道連進來的地端位址,所以實驗室一裡對等互連 VNet 的 VM 會被 65000 放行。若要依「角色」而不是 IP 寫規則,可以用應用程式安全性群組(Application Security Group,ASG)把網路介面分組,例如「web 可以連 db 的 1433」,VM 增減都不用改規則。
NSG 是具狀態的:Azure 為每條連線建立流量記錄(flow record),依連線狀態決定允許或拒絕。所以允許 443 入站後,不必再寫一條出站規則讓回應出去;VM 主動連出去被允許時,回來的封包也自動放行。刪除或修改規則只影響新的連線,已經建立的連線不會立刻被切斷。
子網路和網路介面都有 NSG 時
入站流量先評估子網路的 NSG,允許之後才評估網路介面的 NSG;子網路 NSG 拒絕了,網路介面的 NSG 根本看不到這個封包。出站順序相反,先網路介面、再子網路。結論是:入站要兩層都允許才會通;出站只要任一層拒絕就會被擋。沒有關聯 NSG 的那一層不做任何過濾。官方建議 NSG 只關聯在子網路或網路介面其中一層,不要兩層同時放,因為兩層規則容易互相衝突、出了問題很難排查;遇到「規則看起來對、就是連不進去」,用網路介面的有效安全性規則(effective security rules)一次看兩層合併後的結果,CLI 是 az network nic list-effective-nsg,Network Watcher 的 IP 流量驗證也能直接告訴你是哪一條規則擋下的。
Azure Bastion:讓 VM 不需要公用 IP
Azure Bastion 是部署在虛擬網路裡的 PaaS 服務,Microsoft 負責修補與維護。管理員從 Azure 入口網站(Standard 以上也能用本機的原生用戶端)以 TLS 連到 Bastion,Bastion 再用 VM 的私人 IP 開啟 RDP 或 SSH 工作階段,所以 VM 不需要公用 IP,NSG 也不必對網際網路開放 3389 或 22。Basic 以上的 SKU 要部署在名為 AzureBastionSubnet、大小 /26 或更大的子網路,這個子網路不能放其他資源;也需要一個 SKU 為 Standard、靜態配置的公用 IP。Premium 可以選擇私人部署(private-only),這時不需要公用 IP。
| SKU | 專用子網路與公用 IP | 重點功能(2026 年 10 月查證) | 適合 |
|---|---|---|---|
| Developer | 都不需要 | 不收時數費用;一次一個連線;不能連對等互連虛擬網路裡的 VM | 個人開發測試 |
| Basic | AzureBastionSubnet(/26 以上)+ Standard 靜態公用 IP | 固定 2 個執行個體;可連對等互連虛擬網路的 VM;入口網站連線 | 一般小型環境 |
| Standard | 同 Basic | 主機縮放(2~50 個執行個體)、原生用戶端、自訂連接埠、可分享連結(shareable link)、IP 連線 | 多人同時連線、要用本機 RDP/SSH 用戶端 |
| Premium | AzureBastionSubnet;選私人部署時不需公用 IP | Standard 全部功能,加上工作階段錄影、私人部署 | 需要稽核錄影或完全不對外的環境 |
Bastion 不是唯一的做法。Microsoft Defender for Cloud 的 Just-in-Time(JIT)VM 存取會在需要時暫時開放 NSG 規則、到期自動關閉,適合仍然要直接連 VM、但想縮短曝光時間的情境;Bastion 則讓 VM 根本沒有對外的管理連接埠。兩者也可以同時使用。不論哪一種,誰能透過 Bastion 連線仍由 Azure RBAC 控制,VM 的作業系統帳號與密碼仍要自己管理。
相似服務怎麼分
| 服務 | 解決什麼問題 | 判斷依據 | 位置與費用 |
|---|---|---|---|
| NSG(+ASG) | 子網路或 VM 層級的允許/拒絕 | IP、服務標籤、連接埠、通訊協定(L3/L4);不看 FQDN、不看內容 | 關聯到子網路或網路介面;不另外收費 |
| Azure Firewall | 集中檢查與記錄進出流量 | 網路規則、依 FQDN 的應用程式規則、威脅情報;Premium 有 IDPS 與 TLS 檢查 | AzureFirewallSubnet,搭配路由導流;另外計費 |
| Azure Bastion | 安全地 RDP/SSH 到 VM | VM 不需公用 IP,管理流量走 VNet 內部 | AzureBastionSubnet(Developer 例外);依 SKU 計費 |
| 私人端點 | 用私人 IP 存取 PaaS 服務 | 例如儲存體帳戶、Azure SQL 在你的子網路裡有一個私人 IP | 子網路中的網路介面;依時數與資料量計費 |
| VNet 對等互連 | 兩個 VNet 直接互通 | 走 Microsoft 骨幹,位址不能重疊、不可遞移 | 依資料量計費 |
判斷步驟
- 先畫出流量方向:誰連誰、從網際網路還是從虛擬網路內部、入站還是出站。
- 列出路上會經過的 NSG:入站先子網路再網路介面,出站相反;沒有關聯的那一層不過濾。
- 每一層從最小號碼開始比對來源、目的、連接埠、通訊協定,第一條全部符合的規則決定結果;都不符合就落到預設規則。
- 確認回應流量不用另外開(NSG 是具狀態的),再確認服務標籤涵蓋的範圍,例如 VirtualNetwork 也包含對等互連的網路。
- 要遠端管理 VM 時,優先讓 VM 沒有公用 IP,用 Bastion;檢查 AzureBastionSubnet 的名稱與 /26 大小,以及 VM 的 NSG 是否允許來自 Bastion 子網路的 22/3389。
容易考錯的地方
號碼大小的方向:優先順序數字越小越優先。干擾選項會寫「把拒絕規則的優先順序設成 4096 讓它最先生效」,其實 4096 是自訂規則裡最後被評估的。
以為最後一條才算:NSG 不是把所有規則看完再取最嚴格的,而是第一條符合就停。題目給一張規則表時,要從小號碼往下逐條套用。
回應流量要另開規則:錯。NSG 具狀態,允許的連線,回應自動放行。
兩層只看一層:子網路 NSG 允許、網路介面 NSG 沒允許,入站仍然不通。題目問「最少要改哪裡」時,留意是補規則還是移除多餘的那層 NSG。
Bastion 的子網路:名稱一定是 AzureBastionSubnet,大小 /26 或更大;/27 或改名都會失敗。VM 不需要公用 IP。要工作階段錄影選 Premium,要可分享連結或主機縮放選 Standard 以上,不需要專用子網路與公用 IP 的是 Developer。
可用 IP 數:每個子網路扣 5 個,不是扣 2 個(傳統網路只扣網路位址與廣播位址的算法在 Azure 不適用)。
相關考試:虛擬網路、子網路與對等互連出現在 AZ-900;NSG、ASG、有效安全性規則與 Bastion 出現在 AZ-104 的虛擬網路領域;AZ-700 涵蓋核心網路、Bastion 與網路安全服務;SC-500 與 SC-900 也點名 NSG 與 Bastion。
✅ 自我檢測
以下 6 題都是原創題,選完會立即顯示對錯與解析,全部作答後會出現總分。目前得分:0 / 6