網路層與路由#

網路層負責跨網段的資料傳輸,核心功能是路由選擇。本章涵蓋網關、靜態路由、動態路由和 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" --- AS300

BGP 的特點:

  • 考慮策略而非純粹的距離
  • 可以控制哪些路由對外公開
  • 是互聯網的骨幹協定

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

NAT 深入:SNAT/DNAT/NAPT 與埠耗盡#

上一節介紹了 NAT 的基本類型。這一節深入幾個實務上真正會「踩到坑」的議題:SNAT 與 DNAT 的場景差異、NAPT 為何會耗盡埠、NAT 對 P2P 與特定協定的影響。

SNAT 與 DNAT 的場景區分#

SNAT 與 DNAT 改寫的方向相反,對應的需求也相反:

類型改寫對象觸發方向典型場景
SNAT來源位址內網主動連外網多台內網主機共用公網 IP 上網
DNAT目標位址外網主動連內網把公網埠映射到內網伺服器

關鍵在於「誰先發起連線」:內網主動出去用 SNAT(隱藏內網來源),外網主動進來用 DNAT(把對外的公網位址導向內網服務)。一個對外提供服務、又要讓內部上網的閘道,往往兩者同時設定。

NAPT 轉換表怎麼運作#

NAPT(也稱 PAT,埠位址轉換)讓多台內網主機共用一個公網 IP,靠的是在轉換時改寫來源埠,並用一張轉換表記住對應關係:

flowchart LR
    A["192.168.1.10:5000"] --> N["NAT 閘道<br/>公網 IP 203.0.113.1"]
    B["192.168.1.20:5000"] --> N
    N --> W["外部伺服器:443"]
    N -. "改寫來源埠並記表" .-> T["轉換表<br/>203.0.113.1:40001 → 192.168.1.10:5000<br/>203.0.113.1:40002 → 192.168.1.20:5000"]

即使兩台內網主機都用了相同的本地埠 5000,NAT 也會分配不同的公網埠(40001、40002)加以區分。回傳封包到達時,NAT 依「公網 IP:埠」反查表,還原成正確的內網位址與埠。一條連線在表中的識別是「協定 + 公網埠 + 對端 IP:埠」的組合。

單一公網 IP 的埠上限與耗盡#

由於 NAPT 靠埠號區分連線,而埠號是 16 位元,理論上限約 65535 個(實際可用範圍更小,需扣掉保留埠)。這帶來一個常被忽略的瓶頸:

  • 連線數受限於可用埠數量。當大量內網主機、或單一主機開出海量短連線(如爬蟲、壓力測試、微服務間呼叫)時,可能把公網埠用光,新連線無法建立——即埠耗盡(Port Exhaustion)
  • 大量 TIME_WAIT 狀態的連線會長時間佔用埠,加劇耗盡。

埠耗盡的症狀很隱晦:服務「偶發」連不上、建立連線間歇性失敗,但 CPU 與頻寬都正常。排查時應檢查 NAT 設備的轉換表用量(conntrack -L | wc -l)與 TIME_WAIT 連線數。緩解方式包括增加公網 IP(擴大埠池)、縮短連線回收時間、改用長連線或連線池。

NAT 穿透與 P2P#

NAT 對「外網主動連內網」並不友善:內網主機沒有可直接被連到的公網位址。這讓 P2P(如視訊通話、線上遊戲對戰)難以直連,因此衍生出 NAT 穿透技術——STUN 協助雙方探知自己的公網位址與埠以嘗試打洞,打洞失敗時則退而透過 TURN 伺服器中繼流量。

Hairpin NAT(髮夾彎)#

內網主機想用公網位址訪問同一內網內的另一台伺服器時(例如用對外網址連自家伺服器),流量需要從內網出去、又「彎回」內網,形似髮夾,故稱 Hairpin NAT(或 NAT loopback)。

flowchart LR
    C["內網用戶端<br/>192.168.1.50"] -->|"連 203.0.113.1:443"| N["NAT 閘道"]
    N -->|"DNAT 後彎回內網"| S["內網伺服器<br/>192.168.1.100"]
    S -->|"回應"| N
    N -->|"還原"| C

並非所有閘道都支援 Hairpin NAT。不支援時,內網裝置就無法透過公網網址存取自家伺服器,常見的權宜之計是用內部 DNS(split-horizon DNS)把該網址在內網解析成內網 IP,避免流量繞經 NAT。

對 FTP / SIP 等協定的影響#

有些應用層協定會把 IP 位址與埠號寫進封包內容(payload),而 NAT 預設只改寫 IP 標頭,不動 payload,於是內層帶的私有位址送到對端後根本無法回連:

  • FTP 主動模式:用戶端在資料通道中告知伺服器自己的 IP 與埠,伺服器據此回連——但那是私有位址,連不通。
  • SIP(VoIP):訊令中攜帶媒體流的位址與埠,經 NAT 後同樣失效,導致「電話接通了卻沒聲音」。

解法是 NAT 設備內建 ALG(Application Layer Gateway),識別並一併改寫 payload 中的位址;或在應用層採用對 NAT 友善的設計(如 FTP 被動模式、SIP 搭配 STUN/TURN)。

路由選擇流程#

當一個資料包需要轉發時,路由器的決策流程:

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