1 2 [PC1]---(Switch)---[PC2] # Switching [LAN]---(Router)---[Internet] # Routing & NAT
Switching(交換)
功能:在同一個區域網路(LAN)內 傳送資料。
設備:Switch(交換器)
工作層級:OSI 第 2 層(Data Link Layer)
根據什麼來轉發資料? ➤ 根據 MAC 位址
常見用途:
建立多個主機之間 的區域網路連線。
每個埠都有獨立帶寬,減少碰撞(collision domain 獨立)。
MAC Address Table(MAC 位址表):
Switch 會學習每個 MAC 位址來自哪個 port,根據此表轉發封包。
1 2 3 範例:PC1 要傳資料給 PC2,交換器查詢 MAC 表決定送出方向。 [PC1:192.168.1.10] <--> [PC2:192.168.1.11]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 ip link ip addr ifconfig ip addr add 192.168.1.10/24 dev eth0 ip addr add 192.168.1.11/24 dev eth0 ping 192.168.1.11
Routing(路由)
功能:在不同網路之間 轉送資料。
設備:Router(路由器)
工作層級:OSI 第 3 層(Network Layer)
根據什麼來轉發資料? ➤ 根據 IP 位址
常見用途:
公司網路連接外部網際網路 。
家用路由器將家中多設備連上網際網路。
在多子網之間 傳遞資料。
將 LAN、WAN 之間的資料傳送到正確的網段。
路由表(Routing Table):
儲存目的網段與下一跳(next hop)關係。
可設定靜態路由或啟用動態路由協定(如 OSPF、BGP 等)。
1 2 3 範例:家中路由器連接兩個內網子網段(192.168.1.0/24 與 192.168.2.0/24),路由器負責轉發這兩個子網之間的流量。 [PC1:192.168.1.10] <--> [Router: 192.168.1.1 | 192.168.2.1] <--> [PC2:192.168.2.20]
1 2 3 4 5 6 7 8 9 ip route ip route add 192.168.2.0/24 via 192.168.1.1 ip route del 192.168.2.0/24
1 2 3 4 5 echo 1 > /proc/sys/net/ipv4/ip_forward
Default Gateway(預設閘道)
功能:主機在無法找到目的 IP 所在網段時,將封包送到「預設閘道(Default Gateway)」處理,讓路由器決定後續的傳送路徑。
常見設定:
每台主機通常只設一個 Default Gateway。
預設閘道的 IP 通常是路由器的 IP(例如:192.168.1.1)。
若無設置預設閘道,主機將無法存取其他網段(包括上網)。
當資料要送往 Google 或其他外部網站時,封包會先被送往 Default Gateway,由路由器轉發到下一跳或網際網路。
1 2 3 4 5 ip route show default
1 2 3 4 ip route del default ip route add default via 192.168.2.1
類型
功能說明
指令範例
Default Route
處理所有不在路由表中的目的 IP
ip route add default via <IP>
Static Route
處理特定目的網段的封包
ip route add 10.0.0.0/24 via <IP>
NAT(Network Address Translation)
功能:將內部私有 IP 和外部公有 IP 互相轉換。
用途:
讓多台內部設備共用一個公有 IP。
強化安全性,避免內部 IP 直接暴露。
常見類型:
SNAT(Source NAT):轉換來源 IP(內 → 外)
DNAT(Destination NAT):轉換目的 IP(外 → 內)
PAT(Port Address Translation):多台內部主機共用一個公網 IP + 不同的 port
在 K8s 中,NAT 常出現在:
ClusterIP Service: SNAT
NodePort: DNAT
ExternalTrafficPolicy=Local: 會影響是否做 NAT
常見私有 IP 範圍(不能在 Internet 上直接使用):
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
範例:你在家中開瀏覽器(192.168.0.5)訪問網站,路由器會將你的私有 IP 替換成公有 IP。
總結比較表
項目
Switching
Routing
Default Gateway
NAT
功能
同網段內資料傳送
不同網段間資料傳送
主機不知去向的流量所使用的預設出口(轉送非本地 IP 封包)
私有 IP ↔ 公有 IP 轉換(進出網際網路)
依據
MAC 位址
IP 位址
主機 IP 設定中指定的閘道
封包來源或目的 IP(SNAT/DNAT)
OSI 層級
Layer 2 (Data Link)
Layer 3 (Network)
Layer 3
Layer 3(IP 層,常與 conntrack 配合追蹤連線狀態)
設備
Switch(交換器)
Router(路由器)
Router / Layer 3 Switch
Router / Firewall / NAT Gateway
主題
是否為 CKA 重點
補充說明
Switching
❌ 不是
Pod 在同一 Node 間溝通,透過 Linux bridge(如 cni0),為 Layer 2 概念,CKA 不深入考
Routing
✅ 中等
Pod 跨 Node 的流量、Service 的 ClusterIP 與 kube-proxy 都涉及 L3 routing
Default Gateway
✅ 中等
Node 如何將 Pod 的 egress 流量送到外部網路,需理解 default route 設定
NAT
✅ 高
SNAT 用於 Pod 出網(source NAT)、DNAT 則將虛擬 IP 轉向 Pod 真實 IP,kube-proxy 實作時常見
概念
層級
根據什麼轉發
傳送範圍
常見工具
Switching(交換)
OSI L2
MAC 位址
同一個 LAN
ip link
, ip addr
, bridge link
檢查/設定網卡與 L2 網橋狀態
Routing(路由)
OSI L3
IP 位址
跨子網/跨網段
ip route
, ip forward
, traceroute
查看路由表、啟用轉發、追蹤封包路徑
Default Gateway
路由設定一部分
預設轉送非本地流量
轉送至外部或上層路由器
ip route add default
, ip route show
設定與查詢 default gateway
Pod 間跨 Node 通訊的基礎 :K8s CNI 插件會自動設好路由規則。
Kubernetes 實務關聯說明 Kubernetes 的網路抽象背後建立在傳統網路知識上。掌握 Switching、Routing、Default Gateway 與 NAT 等概念,能幫助你更有效排查錯誤、設定 CNI、理解 kube-proxy 運作細節。
為何這些基礎知識重要?
Routing & NAT 是 Kubernetes 網路模型(尤其是 CNI)的核心概念。
Kubernetes 中,Pod 同 Node 間的通訊,透過 veth pair 與 Linux bridge(如 cni0)建立橋接,實際上屬於 Layer 2 Switching。
Kubernetes 設計中,每個 Pod 都會被分配一個 routable IP,跨 Node 的 Pod 通訊藉由每個 Node 上的路由表與 CNI 插件實現。
NAT 的理解 有助於排查 Service 無法連線的問題(SNAT/DNAT 錯誤)。
例如使用 NodePort 或 External IP 進行連線時,會透過 DNAT 將外部請求轉向對應的 Service Cluster IP,再由 kube-proxy 分流至實際 Pod。
Default Gateway 涉及 Pod egress 到外部網路,或與外部 Service 溝通的能力。
Switching 雖不考,但理解基本 L2 溝通,有助於 NetworkPolicy 與 Bridge 網路除錯。
DNS 什麼是 DNS(Domain Name System)?
將「人類記得住的網域名稱(如 google.com)」轉換為「機器可以識別的 IP 位址(如 142.250.66.132)」。
名稱解析流程(Name Resolution)
本地 /etc/hosts
檔案
DNS Server(依 /etc/resolv.conf
) 1 2 3 nameserver 8.8 .8 .8 nameserver 1.1 .1 .1
依 /etc/nsswitch.conf
設定的順序解析 1 2 3 4 5 6 hosts: files dns myhostname
1 2 3 4 5 6 7 8 9 10 11 12 13 cat /etc/hostsping db ssh db curl http://www.google.com/ cat /etc/resolv.confcat /etc/nsswitch.conf | grep hostshostname
1 2 3 4 cat /etc/hostscat /etc/resolv.confcat /etc/nsswitch.conf
DNS 查詢流程範例 Domain Name 結構:
1 2 3 4 5 apps.google.com ├── apps # Subdomain (e.g. maps, www, drive, apps) ├── google # Second Level Domain ├── com # Top-Level Domain (e.g. .com, .net, .edu, .org, .io) └── . # Root (隱含)
apps.google.com 查詢流程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [Client] ─┬─> /etc/hosts ⭐️ ├─> /etc/resolv.conf → Org DNS │ └─> Cache hit? → 回應 │ └─> Cache miss → │ Root DNS │ ↓ │ .com DNS │ ↓ │ google.com NS │ ↓ │ google DNS Server │ ↓ │ 216.58.221.78 └─<─ 回傳並快取 (Cache 結果到 Org DNS 或本機)
DNS Record Types
類型
說明
範例
A
網域名稱 → IPv4 位址
A www.google.com → 142.250.66.132
AAAA
網域名稱 → IPv6 位址
AAAA www.google.com → 2607:f8b0::
CNAME
Canonical Name(別名)
CNAME mail → ghs.google.com
MX
Mail eXchanger(郵件交換伺服器)
MX google.com → smtp.google.com
TXT
附加文字,常用於驗證(如 SPF、DKIM)
TXT google.com → v=spf1 include:_spf.google.com
NS
指定此網域使用的 DNS 名稱伺服器
NS google.com → ns1.google.com
SOA
Start of Authority,定義網域的主要資訊
包含主 DNS、序號、TTL、負責人 Email 等
PTR
IP → 網域名稱(反查用)
PTR 132.66.250.142.in-addr.arpa → google.com
SRV
提供服務的位址和連接埠
SRV _sip._tcp.example.com → sipserver.example.com:5060
DNS 查詢工具補充
工具
說明
常用指令範例
nslookup
傳統工具,只查詢 DNS Server
記錄
nslookup www.google.com
dig
現代工具,支援多種記錄與查詢細節
dig www.google.com A
、 dig +short google.com
host
簡潔快速查詢
host www.google.com
、 host 8.8.8.8
(反查 IP)
ping
同時測試網路連線與名稱解析
ping google.com
traceroute
顯示封包路徑
traceroute google.com
或 tracepath
(Linux 上較常見)
curl
測試 HTTP 請求與 DNS 是否能解析成功
curl -I https://google.com
Pre-Requisites – Network Namespaces 什麼是 Network Namespace? Network Namespace(NetNS)是 Linux 核心支援的虛擬網路隔離機制,可讓不同容器、Pod 擁有各自獨立的網路堆疊。
每個 Namespace 擁有自己的:
Routing Table
Network Interfaces
IP Address Table
ARP Cache
iptables
(部分隔離)
✅ Kubernetes 的每個 Pod、Docker Container 就是透過 NetNS 實現網路隔離!
核心概念
Network Namespace 是容器網路的基礎
每個容器(或 Pod)都運作在自己的 Network Namespace。
NetNS 提供隔離的網路堆疊(IP、路由表、ARP、iptables…),是實現多容器網路分離的基礎技術。
veth pair 建立 namespace 之間的連線
veth pair 像是「虛擬網路線」:一端在 Pod/namespace,另一端連接 bridge(虛擬交換器)。
用來模擬 Pod 與 Pod、Pod 與 host 間的網路通訊。
Linux Bridge 作為虛擬交換器
可連接多個 veth 口,實現 namespace 間的 L2 層網路通訊。
相當於模擬多個 Pod 在同一個虛擬 switch 上。
iptables + IP forwarding 模擬 NAT 出網
對 NetNS 來說,要出網需要:
Host 支援 IP forwarding。
iptables
設定 POSTROUTING(SNAT/MASQUERADE)。
Namespace 設定 default route。
這些步驟實際對應到 Pod 出網的 CNI 流程。
元素
對應物理世界
重點概念
Namespace
各自的獨立網路房間
每個容器/Pod 的網路空間
veth pair
網路線,兩頭各在一房間
將 namespace 接到 bridge
bridge
集線器/交換器
Pod 所在的虛擬 switch 網段
iptables + MASQ
NAT 出網機器(路由器)
模擬 Pod 如何透過 Node 出到 Internet
ip route
GPS 導航地圖
調整路由方向決定「去哪條路」
建立 Network Namespace 1 2 3 4 5 ip netns add red ip netns add blue ip netns list
檢查 Namespace 狀態:
ip -n <namespace> addr
= ip netns exec <namespace> ip addr
ip -n <namespace> link
= ip netns exec <namespace> ip link
1 2 ip netns exec red ip addr ip netns exec blue ip link
使用 veth pair 建立兩個 namespace 的連線(建立 Peer 接口) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ip link add veth-red type veth peer name veth-blue ip link set veth-red netns red ip link set veth-blue netns blue ip -n red addr add 192.168.15.1/24 dev veth-red ip -n blue addr add 192.168.15.2/24 dev veth-blue ip -n red link set veth-red up ip -n blue link set veth-blue up
測試連線:
1 ip netns exec red ping 192.168.15.2
使用 Linux Bridge 模擬虛擬交換器(橋接多個 namespace) 當你需要 讓多個 Network Namespaces 彼此通信或接上外部網路 ,就需要在 host 上建立一個 虛擬交換器(virtual switch) ,最常見的方式是使用:
Linux Bridge(常用於 Docker)
Open vSwitch(進階 SDN 應用)
以下會以 Linux Bridge 為主,教你如何透過 ip 指令 建立內部虛擬網路 ,管理多個 netns。
名稱
功能說明
Network Namespace
一個隔離的網路環境
veth pair
虛擬網卡,一端連 netns、一端連 bridge
Bridge
虛擬交換器,連接不同的 veth 口
ip route
顯示 routing table(路由表)
arp -n
或 ip neigh
顯示 ARP table(IP 對應 MAC)
1 2 3 4 ip link add v-net-0 type bridge ip link set v-net-0 up
ip link set <interface> up
= ip link set dev <interface> up
= ip link set device <interface> up
v-net-0
: 內部橋接 red/blue 用
重新建立 veth pair 並橋接至 bridge:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ip -n red link del veth-red ip link add veth-red type veth peer name veth-red-br ip link add veth-blue type veth peer name veth-blue-br ip link set veth-red netns red ip link set veth-blue netns blue ip link set veth-red-br master v-net-0 ip link set veth-blue-br master v-net-0 ip link set veth-red-br up ip link set veth-blue-br up
在 namespace 中設定 IP 與啟動:
1 2 3 4 5 ip -n red addr add 192.168.15.1/24 dev veth-red ip -n blue addr add 192.168.15.2/24 dev veth-blue ip -n red link set veth-red up ip -n blue link set veth-blue up
與 Host 通訊 + 模擬 NAT 出網(模擬 Internet)
設定 Host 端 IP: 1 2 ip addr add 192.168.15.5/24 dev v-net-0 ping 192.168.15.1
新增 NAT 規則(允許 namespace 出網,使用 iptables): 1 iptables -t nat -A POSTROUTING -s 192.168.15.0/24 -j MASQUERADE
1 ip netns exec blue ping 192.168.1.3
ip_forward
(host 端)必須打開,否則無法從 namespace 出網# 確保 Host 可以進行 IP forwarding(必要)
echo 1 > /proc/sys/net/ipv4/ip_forward
在 namespace 中設定 default gateway: 1 ip netns exec blue ip route add default via 192.168.15.5
測試連線: 1 ip netns exec blue ping 8.8.8.8
網路診斷與排錯工具 1 2 3 4 5 6 7 8 9 10 11 arp ip netns exec red arp ip netns exec blue arp ip netns exec red route ip netns exec blue route ip netns exec red iptables -L -n -v iptables -nvL -t nat ip netns exec red ss -tnlp
常見錯誤與排錯提示
問題
原因與解法
ping
不通
interface 沒有 up
、IP 設定錯(忘記加 /24
)
無法出網
忘記設定 iptables POSTROUTING
規則
DNS 查不到
沒設 default gateway、沒設定 resolv.conf
Bridge 沒有啟用 (up)
忘了執行 ip link set v-net-0 up
CKA 考試應用場景
CKA 主題
Network Namespace 可模擬場景
CNI Plugin 原理
Pod-to-Pod 網路結構與虛擬網卡關係
DNS / 網路不通排查
查看 route / iptables / ARP 狀態
kube-proxy 行為模擬
DNAT / MASQUERADE 行為
NetworkPolicy 測試
多 namespace 流量隔離測試
進階補充:DNAT、靜態路由 1 2 3 4 5 iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.15.2:80 ip netns exec blue ip route add 192.168.1.0/24 via 192.168.15.5
Docker 與 Namespace 的關係 每個 Docker Container 都使用獨立的 Network Namespace,可用下列方式觀察:
1 2 3 4 docker run -it alpine sh ps aux ip link
Pre-Requisites – Networking in Docker Docker Networking Modes --network none
沒有網路介面,僅有 loopback (lo)。
沒有對外通訊能力。
用於測試網路隔離或安全環境。
1 docker run --network none nginx
--network host
容器與主機共用網路堆疊。
沒有容器獨立的 IP,與主機共用,亦無 NAT。
有效省略 port mapping,但多容器會有 port 衝突風險。
例如多個 Nginx 無法同時用 80 port。
1 docker run --network host nginx
--network bridge
(預設模式)
使用 Docker 預設的 bridge network (docker0
)。
容器有獨立 IP(如 172.17.0.x)。
支援 NAT,容器可透過 container name 互通。
Docker 提供內建 DNS 做 name resolution。
Docker Network 檢查指令 1 2 3 4 5 docker network ls docker inspect <container-id>
Linux Network Namespace 與 Bridge Docker 背後透過 NetNS、veth pair、Bridge 建構網路。
1 2 3 4 5 6 7 8 9 ip link ip addr ip netns ip link add docker0 type bridge
iptables + NAT(Docker Port Mapping 原理) Docker 會透過 iptables NAT 表做 DNAT,將主機 port 映射至容器(Port Mapping):
1 2 3 iptables -t nat -A PREROUTING -p tcp --dport 8080 \ -j DNAT --to-destination 172.17.0.2:80
範例:
1 2 docker run -p 8080:80 nginx
Docker 三種網路模式總整理
模式
是否有獨立 IP
是否 NAT
是否能跨容器存取
特點說明
none
❌
❌
❌
完全無網路,僅有 loopback
host
❌
❌
✅(共用主機)
效率高但無隔離,易衝突
bridge
(預設)
✅
✅
✅(同網段)
最常見,Docker 會設 bridge 與 veth
Pre-Requisites – Container Networking Interface (CNI) 什麼是 CNI?
CNI(Container Network Interface)是一套容器網路管理的標準接口,常用於 Kubernetes 和 Podman 等容器平台。
Kubernetes 本身不處理 Pod 網路 ,而是呼叫 CNI Plugin 來完成:
IP 分配
建立 veth pair
加入 Bridge
設定路由與 NAT
常見的 CNI Plugin 有:Calico、Flannel、Cilium、Weave Net 等。
手動模擬 CNI Plugin 行為(使用 Docker) Kubernetes 透過 CNI plugin 背後其實是以下這些低階操作。我們可以透過 Docker 容器手動模擬。 CNI 是 Kubernetes 與 Podman 等容器平台常用的網路管理插件架構。
步驟 1:建立沒有網路的容器
模擬 Pod 剛建立、尚未連上網路 1 docker run --network=none nginx
步驟 2:取得容器的 NetNS 1 2 3 PID=$(docker inspect -f '{{.State.Pid}}' mynginx) mkdir -p /var/run/netnsln -sf /proc/$PID /ns/net /var/run/netns/$PID
步驟 3:建立 veth pair 1 ip link add veth-host type veth peer name veth-container
步驟 4:將容器端加入 NetNS 1 ip link set veth-container netns $PID
步驟 5:設定 IP 與啟用介面
Host 端 1 2 ip addr add 10.1.1.1/24 dev veth-host ip link set veth-host up
Container 端 1 2 3 ip netns exec $PID ip addr add 10.1.1.2/24 dev veth-container ip netns exec $PID ip link set veth-container up ip netns exec $PID ip link set lo up
步驟 6:測試連線 1 2 ping 10.1.1.2 ip netns exec $PID ping 10.1.1.1
小提醒與補充
平台
網路方式
說明
Docker
bridge + iptables NAT
容器預設透過 NAT 出網
Kubernetes
CNI + Routable IP
每個 Pod 有 routable IP,不經 NAT
Kubernetes Pod-to-Pod 通訊在同一網段內不經 NAT。
CNI Plugin 的動作就是:建立 veth pair、加進 NetNS、加入 Bridge、設 IP 與 Route。