# 認識 Router 基礎功能以及其拓樸


## 背景知識

網卡 (network card) 通常會有一個網路線孔 (port)，不常見的也有 Dual-port network card，目標是增加頻寬或節省 PCI 插槽 - [英特爾發表雙埠伺服器網路卡，節省伺服器PCI插槽 - iThome](https://www.ithome.com.tw/news/6003)。

Interface 就是我們在 ifconfig 可能會看到的像是 etho0，一個網卡的一個 port 可以設定多個界面，像是

1. eth0: WAN 111.111.111.111
2. eth0:1 WAN 222.222.222.222
3. eth0:2 LAN 192.168.1.1/24

這就是 IP Alias，L3 層的一個實體 Port 有不同的介面。

在 L2 也有類似的一個實體 Port with 多個介面，那較做 VLAN，但跟這邊的不太一樣，VLAN 是完全隔離封包，IP Alias 只是有不同別名，這邊不多談。

常見 Router 可能會有三個介面：

1. WAN Interface (eth1 或 pppoe-wan): 負責對外連向 ISP
2. LAN Interface (br-lan): 負責對內連接你的電腦、NAS
3. 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.1.x$ 這個網段上？」
2. 系統查到 eth0 的 IP 是 1.1.1.2/24，屬於同一個網段。
3. 結論： 必須從 eth0 發出 ARP 請求並送出封包。

### Public IP

在這種情況，Router 不做 NAT，只是負責轉發。

{{< admonition type=info >}}
當一個封包抵達網卡（NIC），系統會依序進行以下判斷：

1. Layer 2 檢查
   1. 檢查 dst MAC 是不是自己 or 廣播
2. L3 檢查
   1. 檢查 dst IP 是不是自己
   2. 不是看有沒有開啟轉發 (ip_forwarding)
   3. 有開啟繼續轉發，改寫
      1. 改寫 TTL
      2. 有設定 NAT 做 NAT
      3. 看 Rouing Table 找 Next Hop IP and 出口 interface
      4. 查 ARP Table 找到下一跳的 MAC 地址，換上新的 src MAC and dst MAC

MAC 會一直變動，IP 除非有 NAT 不然不會變動。
{{< /admonition >}}

![alt text](image.png)

如上架構圖，第一階段：Server (1.1.1.2) 的決策與封裝

當 Server 準備送出封包給 Google ($8.8.8.8$)：

1. L3 路由判定： Server 發現 $8.8.8.8$ 與自己在不同網段（$1.1.1.x/24$），於是查路由表，決定交給 Default Gateway ($1.1.1.1$)。
2. L2 地址解析 (ARP)： Server 檢查 ARP Table。
    ◦ If Miss: 發出 ARP Request：「誰有 $1.1.1.1$ 的 MAC？」
    ◦ Response: 收到 Router LAN 埠的 MAC ($a.a.a.a$)。
3. 封裝封包 (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 收到封包：

1. L2 拆封與檢查： Router 看到 $dst\_MAC$ 是 $a.a.a.a$，確定是給自己的，於是拆掉 L2 外殼，露出裡面的 IP 封包。
2. L3 處理 (核心動作)：
    ◦ TTL 遞減： 將 IP Header 中的 TTL 值減 1。
    ◦ 查路由表： 發現要去 Google 必須從 WAN 埠（$9.9.9.9$）出去，下一跳 (Next Hop) 是 ISP Router。
3. 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。

進來的時候比較複雜，可能會有

1. Network Address Port Translation，多個私有 IP 共享「一個」公網 IP，靠不同的 Port 來區分。家用的 Router 幾乎都是這種
2. Static NAT (1:1): 一個私有 IP 固定對應一個公網 IP。封包還是會改寫 IP，但 Port 通常不變。這對你的 Twinkle 實驗中「想讓 Server 有公網身分」很有用

會把 dst IP or dst port 改變。

### 其他

Router 除了 NAT and 轉發，還可以。

1. ACL
2. BGP Flowspec: 由器可以透過 BGP 協定告訴上游：針對特定的惡意流量直接進行丟棄或限流
3. 防禦偽造 (uRPF): 檢查封包進來的介面是否與路由表的回程路徑一致，藉此擋掉偽造源 IP 的 Spoofing 攻擊
4. QoS
5. 各種動態路由協定 (Dynamic Routing Protocols)
6. DHCP
7. DNS Replay/Proxy: 幫內網設備代問 DNS 伺服器，並快取結果以加速連線
8. Inter-VLAN Routing： 在不同 VLAN 標籤（Tag）之間進行路由轉換，打破 Layer 2 的隔離
9. 加密: 高階的 Router 可以直接在上面做 VPN or GRE or IP Tunnel 等

