認識 Router 基礎功能以及其拓樸
背景知識
網卡 (network card) 通常會有一個網路線孔 (port),不常見的也有 Dual-port network card,目標是增加頻寬或節省 PCI 插槽 - 英特爾發表雙埠伺服器網路卡,節省伺服器PCI插槽 - iThome。
Interface 就是我們在 ifconfig 可能會看到的像是 etho0,一個網卡的一個 port 可以設定多個界面,像是
- eth0: WAN 111.111.111.111
- eth0:1 WAN 222.222.222.222
- eth0:2 LAN 192.168.1.1/24
這就是 IP Alias,L3 層的一個實體 Port 有不同的介面。
在 L2 也有類似的一個實體 Port with 多個介面,那較做 VLAN,但跟這邊的不太一樣,VLAN 是完全隔離封包,IP Alias 只是有不同別名,這邊不多談。
常見 Router 可能會有三個介面:
- WAN Interface (eth1 或 pppoe-wan): 負責對外連向 ISP
- LAN Interface (br-lan): 負責對內連接你的電腦、NAS
- WLAN Interface (wlan0/wlan1): 負責無線 Wi-Fi 訊號
如果你翻開 Router 背後,你可能會看到 1 個藍色的孔 (WAN) 和 4 個黑色的孔 (LAN 1-4)。這代表有 5 個 Physical Ports,家用路由器內部通常有一個交換機晶片。那 4 個 LAN Port 在物理上是獨立的,但在邏輯上被「橋接 (Bridge)」在一起,歸屬於同一個名為 LAN 的介面。
Talbe
- MAC table: port 對應 MAC,用在 L2 switch
- ARP table: IP 對應 MAC,用在 router or 電腦上面
- Routing table: IP 對應 next hop IP + interface (optional),用在 router or 電腦上面
Router
Router(路由器)的核心任務是「連接不同的網路」並「決定封包該往哪裡走」,他在 LAN 裡面就是負責管理 LAN 的長官,一個 LAN 可能會有多個 Router,有時候你的 LAN 需要連接到不同的外部網路,你的 Server 可以根據目的地來決定走哪台。例如:要去 Google 走 Router A,要去校內網站走 Router B。
Default Gateway
它的任務: 當 Server 想要發送一個封包時,它會先檢查目的地 IP。
- 本地(Local): 如果目的地在同一個網段,它就直接透過 ARP 找對方的 MAC 地址送過去
- 外地(Remote): 如果目的地不在本地,Server 就會把封包丟給 Default Gateway(當 Server 決定要把封包丟給 Gateway 時,它在做的事情確實是:「在不改變 IP 表頭的情況下,把 MAC 表頭換成 Gateway 的)
Server 有多張介面的時候,怎麼知道用哪一個:
這就是 Routing Table(路由表) 的工作。當 Server 有多張網卡(例如 eth0, eth1)時,它會進行以下「三步走」的邏輯判定:
第一步:查看目的地 IP(LPM 匹配) 系統會先拿目的地 IP ($8.8.8.8$) 去比對路由表。如果目的地不在任何已知的特定網段(例如你的 $1.1.1.x$),它就會命中最後一條路:Default Route (0.0.0.0/0)。
第二步:找出 Gateway IP 的「出口」 每一條路由規則(包括 Default Route)都會綁定一個 Next Hop(下一跳) 和一個 Interface(介面)。 • 規則範例: default via 1.1.1.1 dev eth0 • 這條規則直接告訴系統:如果要走預設路徑,請從 eth0 出去。
第三步:如果規則沒寫死 Interface 怎麼辦?
如果路由表只寫了 default via 1.1.1.1,OS 核心會進行 「递归路由查找」:
- 系統問:「我要找 $1.1.1.1$,哪張網卡接在 $1.1.1.x$ 這個網段上?」
- 系統查到 eth0 的 IP 是 1.1.1.2/24,屬於同一個網段。
- 結論: 必須從 eth0 發出 ARP 請求並送出封包。
Public IP
在這種情況,Router 不做 NAT,只是負責轉發。
當一個封包抵達網卡(NIC),系統會依序進行以下判斷:
- Layer 2 檢查
- 檢查 dst MAC 是不是自己 or 廣播
- L3 檢查
- 檢查 dst IP 是不是自己
- 不是看有沒有開啟轉發 (ip_forwarding)
- 有開啟繼續轉發,改寫
- 改寫 TTL
- 有設定 NAT 做 NAT
- 看 Rouing Table 找 Next Hop IP and 出口 interface
- 查 ARP Table 找到下一跳的 MAC 地址,換上新的 src MAC and dst MAC
MAC 會一直變動,IP 除非有 NAT 不然不會變動。

如上架構圖,第一階段:Server (1.1.1.2) 的決策與封裝
當 Server 準備送出封包給 Google ($8.8.8.8$):
- L3 路由判定: Server 發現 $8.8.8.8$ 與自己在不同網段($1.1.1.x/24$),於是查路由表,決定交給 Default Gateway ($1.1.1.1$)。
- L2 地址解析 (ARP): Server 檢查 ARP Table。 ◦ If Miss: 發出 ARP Request:「誰有 $1.1.1.1$ 的 MAC?」 ◦ Response: 收到 Router LAN 埠的 MAC ($a.a.a.a$)。
- 封裝封包 (L3 + L2): ◦ IP Header: $src=1.1.1.2, dst=8.8.8.8$ (不變) ◦ Ethernet Header: $src_MAC=c.c.c.c, dst_MAC=a.a.a.a$
第二階段:Router (9.9.9.9 / 1.1.1.1) 的轉發決策
當 Router 收到封包:
- L2 拆封與檢查: Router 看到 $dst_MAC$ 是 $a.a.a.a$,確定是給自己的,於是拆掉 L2 外殼,露出裡面的 IP 封包。
- L3 處理 (核心動作): ◦ TTL 遞減: 將 IP Header 中的 TTL 值減 1。 ◦ 查路由表: 發現要去 Google 必須從 WAN 埠($9.9.9.9$)出去,下一跳 (Next Hop) 是 ISP Router。
- L2 重新封裝: Router 查詢 ARP Table 獲得 ISP Router 的 MAC 地址(假設是 $d.d.d.d$)。 ◦ IP Header: $src=1.1.1.2, dst=8.8.8.8$ (維持原樣,因為沒有 NAT) ◦ Ethernet Header: $src_MAC=b.b.b.b$ (WAN 埠 MAC), $dst_MAC=d.d.d.d$ (ISP MAC)
這是一個非常標準的 Layer 3 轉發(L3 Forwarding) 流程。在沒有 NAT 的情況下,Router 的角色就像是「接力賽的隊員」,它只負責把棒子(IP 封包)交給下一個人,而不會去動棒子裡面的內容。
進來則是相反。
Private IP
這種情況,LAN 可能都是私有 IP,所以 Router 除了要做轉發,還要做 NAT。
在出去的時候,會作 Source NAT,更改 src IP 變成公有 IP,多個私有 IP 共享公有 IP。
進來的時候比較複雜,可能會有
- Network Address Port Translation,多個私有 IP 共享「一個」公網 IP,靠不同的 Port 來區分。家用的 Router 幾乎都是這種
- Static NAT (1:1): 一個私有 IP 固定對應一個公網 IP。封包還是會改寫 IP,但 Port 通常不變。這對你的 Twinkle 實驗中「想讓 Server 有公網身分」很有用
會把 dst IP or dst port 改變。
其他
Router 除了 NAT and 轉發,還可以。
- ACL
- BGP Flowspec: 由器可以透過 BGP 協定告訴上游:針對特定的惡意流量直接進行丟棄或限流
- 防禦偽造 (uRPF): 檢查封包進來的介面是否與路由表的回程路徑一致,藉此擋掉偽造源 IP 的 Spoofing 攻擊
- QoS
- 各種動態路由協定 (Dynamic Routing Protocols)
- DHCP
- DNS Replay/Proxy: 幫內網設備代問 DNS 伺服器,並快取結果以加速連線
- Inter-VLAN Routing: 在不同 VLAN 標籤(Tag)之間進行路由轉換,打破 Layer 2 的隔離
- 加密: 高階的 Router 可以直接在上面做 VPN or GRE or IP Tunnel 等