網路層與路由#
網路層負責跨網段的資料傳輸,核心功能是路由選擇。本章涵蓋網關、靜態路由、動態路由和 NAT 技術。
網關的角色#
什麼是網關#
網關(Gateway) 是連接不同網段的設備,通常是路由器的一個網口。
┌─────────────────────────────────────────────────────────────┐
│ 區域網 A(192.168.1.0/24) │
│ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │ PC1 │ │ PC2 │ │ PC3 │ │
│ └──┬──┘ └──┬──┘ └──┬──┘ │
│ └────────┴────────┴──────┬─────────────────────────────│
│ │ │
│ ┌──────┴──────┐ │
│ │ 網關 │ │
│ │ 192.168.1.1 │ │
│ └──────┬──────┘ │
└──────────────────────────────┼──────────────────────────────┘
│
[外部網路]網關位址必須和本機在同一網段。例如
192.168.1.0/24網段的網關通常是192.168.1.1。
路由器的本質#
路由器本質上是一台有多個網卡的設備,每個網卡連接一個區域網:
┌─────────────────────────────────┐
│ 路由器 │
│ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │
│ │eth0│ │eth1│ │eth2│ │eth3│ │
│ └─┬─┘ └─┬─┘ └─┬─┘ └─┬─┘ │
└────┼──────┼──────┼──────┼──────┘
│ │ │ │
區域網A 區域網B 區域網C 區域網D
- 每個網口都是所連接區域網的網關
- 路由器負責在不同網段之間轉發資料包MAC 與 IP 的變化規則#
轉發過程中的變化#
| 項目 | 經過路由器時 | 說明 |
|---|---|---|
| MAC 位址 | 一定會變 | 每跳都更新為下一跳的 MAC |
| IP 位址 | 看情況 | 轉發網關不變,NAT 網關會變 |
歐洲十國遊模式(轉發網關)#
IP 位址全程不變,只有 MAC 位址在每一跳更新:
sequenceDiagram
participant A as PC-A<br/>192.168.1.101
participant RA as 路由器A
participant RB as 路由器B
participant B as PC-B<br/>192.168.4.101
A->>RA: MAC: PC-A → 路由器A<br/>IP: 192.168.1.101 → 192.168.4.101
Note over RA: MAC 改寫,IP 不變
RA->>RB: MAC: 路由器A → 路由器B<br/>IP: 192.168.1.101 → 192.168.4.101
Note over RB: MAC 改寫,IP 不變
RB->>B: MAC: 路由器B → PC-B<br/>IP: 192.168.1.101 → 192.168.4.101玄奘西行模式(NAT 網關)#
IP 位址會被轉換:
sequenceDiagram
participant A as PC-A<br/>192.168.1.101
participant NAT as NAT 路由器
participant B as 外部伺服器<br/>203.0.113.50
A->>NAT: 來源IP: 192.168.1.101<br/>目標IP: 203.0.113.50
Note over NAT: NAT 轉換<br/>來源IP 改為公網IP
NAT->>B: 來源IP: 183.134.189.34(公網)<br/>目標IP: 203.0.113.50
B->>NAT: 來源IP: 203.0.113.50<br/>目標IP: 183.134.189.34
Note over NAT: 反向轉換<br/>目標IP 還原為內網IP
NAT->>A: 來源IP: 203.0.113.50<br/>目標IP: 192.168.1.101私有 IP 位址(如 192.168.x.x)無法在公網路由,必須轉換為公網 IP。
路由表與路由規則#
路由表結構#
# 查看路由表
ip route show
route -n
# 典型輸出
default via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
10.0.0.0/8 via 192.168.1.254 dev eth0每條路由規則包含:
| 欄位 | 說明 | 範例 |
|---|---|---|
| 目標網段 | 想去哪裡 | 10.0.0.0/8 |
| 出口設備 | 從哪個網口出去 | dev eth0 |
| 下一跳 | 下一個路由器位址 | via 192.168.1.254 |
設定靜態路由#
# 加入路由
ip route add 10.176.48.0/20 via 10.173.32.1 dev eth0
# 刪除路由
ip route del 10.176.48.0/20
# 加入預設路由
ip route add default via 192.168.1.1策略路由#
除了根據目標 IP 路由,還可以根據其他條件選擇路由表:
# 建立路由表
echo "200 custom" >> /etc/iproute2/rt_tables
# 根據來源位址選擇路由表
ip rule add from 192.168.1.0/24 table 200
# 在自訂表中設定路由
ip route add default via 10.0.0.1 table 200策略路由應用場景
雙線接入:公司有兩條互聯網線路
- 來自 192.168.1.x 的流量走電信線路
- 來自 192.168.2.x 的流量走聯通線路
ip rule add from 192.168.1.0/24 table telecom
ip rule add from 192.168.2.0/24 table unicom
ip route add default via 電信網關IP table telecom
ip route add default via 聯通網關IP table unicom動態路由協定#
為什麼需要動態路由#
- 網路拓撲可能變化
- 手動維護路由表太複雜
- 需要自動發現最優路徑
兩類核心演算法#
| 演算法 | 原理 | 代表協定 | 適用場景 |
|---|---|---|---|
| 距離向量 | 每個路由器告知鄰居到所有目標的距離 | RIP, BGP | 簡單網路, 跨域 |
| 鏈結狀態 | 每個路由器廣播自己的鏈結狀態,各自計算最短路徑 | OSPF, IS-IS | 資料中心, 企業網 |
OSPF 協定#
OSPF(Open Shortest Path First) 是內部網關協定(IGP),廣泛用於資料中心:
flowchart TD
S1["1. 發現鄰居:向鄰居發送 Hello 包"] --> S2["2. 建立鄰接關係:交換資料庫描述"]
S2 --> S3["3. 同步鏈結狀態資料庫:所有路由器擁有相同的網路拓撲視圖"]
S3 --> S4["4. 計算最短路徑:使用 Dijkstra 演算法"]
S4 --> S5["5. 更新路由表:根據計算結果更新"]當存在多條相同代價的路徑時,OSPF 支援負載均衡,這對高可用性很重要。
BGP 協定#
BGP(Border Gateway Protocol) 是外部網關協定,用於自治系統(AS)之間:
flowchart LR
subgraph AS100["AS 100 - 企業網路"]
R1["路由器1"] -. "iBGP" .- R2["路由器2"]
end
subgraph AS200["AS 200 - 電信骨幹"]
R3["骨幹路由器"]
end
subgraph AS300["AS 300 - 雲服務商"]
R4["雲端路由器"]
end
AS100 -- "eBGP" --- AS200
AS200 -- "eBGP" --- AS300BGP 的特點:
- 考慮策略而非純粹的距離
- 可以控制哪些路由對外公開
- 是互聯網的骨幹協定
NAT 網路位址轉換#
NAT 類型#
| 類型 | 說明 | 應用場景 |
|---|---|---|
| SNAT | 來源位址轉換 | 內網訪問外網 |
| DNAT | 目標位址轉換 | 外網訪問內網服務 |
| NAPT | 埠號位址轉換 | 多內網主機共用一個公網 IP |
NAPT 工作原理#
內網 NAT 路由器 外網
┌─────────┐ ┌────────────┐ ┌─────────┐
│192.168.1.10:5000│ ───────→ │ │ ────────────→ │ │
│ │ │ 轉換表: │ 公網IP:10001 │ Web伺服器│
│192.168.1.20:6000│ ───────→ │ 10001→1.10:5000│ ─────────→ │ │
│ │ │ 10002→1.20:6000│ │ │
└─────────────────┘ └────────────┘ └─────────┘
- NAT 路由器維護轉換表,記錄內外網位址和埠號的對應關係
- 回傳的資料包根據轉換表反向轉換Linux NAT 設定#
# 開啟 IP 轉發
echo 1 > /proc/sys/net/ipv4/ip_forward
# SNAT:內網訪問外網
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# DNAT:將外網 8080 埠映射到內網 192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 192.168.1.100:80路由選擇流程#
當一個資料包需要轉發時,路由器的決策流程:
flowchart TD
A[1. 提取目標 IP 位址] --> B[2. 查詢路由表<br/>尋找最長匹配前綴]
B --> C{找到匹配項?}
C -->|是| D[3. 確定出口和下一跳]
C -->|否| E{有預設路由?}
E -->|是| D
E -->|否| F[丟棄封包]
D --> G[4. ARP 解析下一跳的 MAC 位址]
G --> H[5. 更新 MAC 頭<br/>從指定埠發送]每經過一個路由器,IP 頭的 TTL 減 1。當 TTL 為 0 時丟棄資料包,防止無限循環。
常用診斷指令#
# 查看路由表
ip route show
netstat -rn
# 追蹤路由路徑
traceroute www.google.com
mtr www.google.com
# 查看 NAT 轉換表(Linux)
conntrack -L
# 測試連通性
ping -c 4 192.168.1.1本章小結#
| 概念 | 關鍵點 |
|---|---|
| 網關 | 連接不同網段的設備,是路由器的網口 |
| 路由表 | 包含目標網段、出口設備、下一跳三要素 |
| 靜態路由 | 手動設定,適合簡單網路 |
| 動態路由 | OSPF 用於內部,BGP 用於自治系統間 |
| NAT | 位址轉換,解決 IP 位址不足問題 |
| MAC 變化 | 每跳必變;IP 變化取決於是否 NAT |