
在 Security+ 的筆記裡,Software-defined Network(SDN)跟 Infrastructure as Code(IaC)都只佔了幾頁:
文字都懂,但我腦中沒有畫面,只記得幾個關鍵字:
「集中化控制」、「冪等性」、「程式碼管理」
於是我把這些零碎內容丟給 ChatGPT,開始了一連串「你說/ChatGPT 說」的對話。回頭看,整段過程可以拆成三條線:
這也是本文接下來的結構。
一開始,我只把 SDN 當成「比較聰明的網路設備」。
但在對話裡,我慢慢把它換成另一個描述:
SDN 不是某一台盒子,而是「把網路拆成三個平面」的做法:資料平面、控制平面、應用平面。SDN&iac
簡單整理成我後來自己用的版本:
| 層級 | 在 SDN 的角色 | 我後來怎麼想像它 |
|---|---|---|
| Data Plane 資料平面 | 真正轉封包的那一層 | 很多廉價但聽話的交換器 |
| Control Plane 控制平面 | 負責「決定流量怎麼走」 | 一個會下指令的大腦(SDN 控制器) |
| Application Plane 應用平面 | 管理策略與應用邏輯 | 安全策略、流量優先權、隔離規則等應用 |
有了這個表,我開始能把 SDN 放進具體場景裡,而不是只背定義。
在 ChatGPT 的整理下,我腦中出現了幾個畫面:
SDN&iac
這些畫面讓我第一次有了「SDN 真的在現場運作」的感覺。
但對話裡也提醒我,SDN 有幾個我原本沒想到的風險:
SDN&iac
我後來給自己的一句話是:
SDN 把「網路」變成一個平台,
方便之處也在平台,風險也集中在平台。
講義上對 IaC 的描述,很快就可以背起來:
但真正讓我理解的是實際動手做。
我選 Terraform + AWS 當作 IaC 起手式,目標只有一個:
「用一個 main.tf 生出 VPC + Subnet + EC2,然後可以再用同一份程式碼把它刪掉。」
過程大致長這樣:
SDN&iac
aws configure 存在本機憑證檔。main.tf:
ap-northeast-1(東京)aws_vpc:10.0.0.0/16
aws_subnet:10.0.1.0/24
aws_instance:一台 t2.micro EC2terraform plan → terraform apply → terraform destroy:
也因為這個實驗,我第一次很具體地感受到:「IaC 管的是『資源狀態』,而不是流程步驟。」
SDN&iac
我後來整理了一張自己用的對照表:
SDN&iac
| 面向 | SDN | IaC |
|---|---|---|
| 主要目標 | 管理網路流量、路由、策略 | 管理整體基礎設施(VM、網路、儲存、服務) |
| 操作層級 | 網路層 | 基礎設施層 |
| 典型工具 | 控制器、API、策略引擎 | Terraform、Ansible 等 |
| 關注點 | 資料流如何在環境內移動(行為) | 環境長什麼樣子(結構/狀態) |
| 自動化特性 | 動態、事件導向(遇到壅塞/攻擊即時調整) | 宣告式、版本化(描述最終狀態,工具幫你補齊) |
一句話記:
SDN = 網路如何運作
IaC = 網路(與整個環境)怎麼被建立出來
SDN&iac
而 IaC 甚至可以拿來「操作 SDN」:用 Terraform 建出 VPC、Route Table、Security Group,本身就是對 SDN 能力的一種包裝。
SDN&iac
如果只看最後的結果,好像只是:
「成功在 AWS 建了一個 VPC + EC2,GitHub 上也有個 repo。」
但中間的小插曲,反而對我幫助更大。
一開始我用官網 exe 安裝 Terraform,沒有成功;
改用 Chocolatey,又遇到 lock file 及 lib-bad 無法寫入的錯誤。
SDN&iac
最後的解法其實很「工程師」:
choco install terraform -y。這件事讓我慢慢習慣:
出錯時,不是重裝一遍就好,而是先分清楚:工具問題?權限問題?還是環境變數問題?
同樣地,AWS CLI 也因為 PATH 沒設好而一度無法使用,
我第一次開始認真檢查「執行檔實際裝在哪裡」、以及 Windows 的 PATH 到底長什麼樣。
另一個有趣的坑,是我第一次 git push 到 GitHub 的時候:
被一個 700 多 MB 的 terraform-provider-aws exe 擋下來。
原因很單純:
.terraform/providers/... 整個資料夾都 commit 進去了;最後的修正方式是:
.gitignore:
.terraform/
.tfstate
.tfstate.backup
crash.log
.git 資料夾,重新 git init、建一顆乾淨的初始 commit,再 push 一次。SDN&iac這一次,我不只解決「GitHub 檔案太大」的問題,也真正記住了:
.terraform:是 Terraform 幫我下載的 provider 產物,不是源碼。tfstate:可能含有敏感資訊(ID、設定),不適合放在公開 repo。
對我來說,這好像是 IaC 給我的第二堂課:
版本控制不是「全部一起丟進 Git」,而是知道哪些該被追蹤、哪些不該。
在整段對話裡,有一個觀點我很喜歡,也一直拿來提醒自己:
SDN 不是工具,是一種網路哲學;IaC 也不只是寫腳本,而是一種描述狀態的方法論。SDN&iac
換成更實務的語言,是三個問題:
當我用 Terraform 建 VPC 時,實際上是在練習:
plan 的 diff,再決定要不要動手。而當我回頭看 SDN,就比較能理解:
兩者搭配起來,才會有那種「網管、DevOps、雲端架構」混在一起的新工作樣貌。
如果未來還要繼續往這條路走,我自己會保留幾種實用的問法:
請它幫我建模概念
「幫我用對照表整理 SDN 和 IaC 的異同,重點放在『誰管行為、誰管狀態』,搭配兩個真實案例。」
請它協助設計練習路線
「我想用 AWS + Terraform 練習 IaC,目標是 5 天內建出可上網的 Web Server 架構,請幫我規劃每天的具體任務與完成標準。」
請它檢查我寫的程式邏輯
「這是我目前的 main.tf,請幫我檢查:哪一些資源適合拆成 module?哪一些設定若放到 production 環境會有安全風險?」
請它扮演『對立視角』
「假設你不同意在這個小團隊導入 SDN + IaC,請從成本、組織能力、風險三個角度提出反對理由,並點出我可能忽略的條件。」
請它把考試用語翻回實務場景
「Security+ 講義中對 SDN/IaC 的定義是這樣(貼原文),請幫我用一個中小企業的實際案例,把這些名詞連成一個完整故事。」
main.tf 生出、再刪掉整個世界。