1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
---
是的,你的理解非常正確!**內網穿透服務(如 Ngrok、Cloudflare Tunnel 等)在技術層面上,確實是透過「反向代理 (Reverse Proxy)」技術來實現的。** 而它之所以能「穿過路由器的 IP 中介(管理)」,關鍵在於連接發起的方向性。

---

### 代理 (Proxy) 的運作原理

「代理」這個詞在電腦網路中有很多涵義,但核心思想是:**代替你的設備去發出或接收網路請求。**

代理可以分為兩大類:

1. **正向代理 (Forward Proxy):**
* **運作原理:** 這是我們最常聽到的「代理伺服器」。想像你在公司內部想訪問外部網站。你所有的請求不是直接發給網站伺服器,而是先發給公司的**代理伺服器**。代理伺服器再代你向外部網站發出請求,收到回應後再轉發給你。
* **目的:**
* **繞過防火牆/審查:** 訪問一些被本地網路限制的網站。
* **隱藏真實 IP:** 外部網站只看到代理伺服器的 IP。
* **緩存加速:** 代理伺服器可以緩存常見內容,加快重複訪問速度。
* **內容過濾/監控:** 公司可以透過代理過濾惡意內容或監控員工上網行為。
* **方向:** **內部用戶**主動向**外部服務**發出請求,代理伺服器位於用戶端和互聯網之間。

2. **反向代理 (Reverse Proxy):**
* **運作原理:** 想像你有一台對外的網站伺服器,但你不想讓外部用戶直接連接到它,或者你想在它前面增加一層保護和分發。這時,你會在你的網站伺服器前面部署一個**反向代理伺服器**。外部用戶的請求是先發給反向代理伺服器,反向代理伺服器再將請求轉發給**後端的真實伺服器**,並將真實伺服器的回應轉發給外部用戶。
* **目的:**
* **負載均衡:** 將請求分發到多個後端伺服器,避免單點過載。
* **安全性增強:** 隱藏後端真實伺服器的 IP 地址,作為第一道防線抵禦攻擊。SSL 卸載 (SSL Offloading)。
* **內容緩存:** 提高響應速度。
* **單點入口:** 為多個後端服務提供統一的訪問入口。
* **內網穿透:** 這就是我們討論的 Ngrok 的實現原理。
* **方向:** **外部用戶**主動向**內部服務**發出請求,反向代理伺服器位於互聯網和服務器之間。

---

### 內網穿透服務 (Ngrok) 如何透過反向代理實現「穿過路由器 IP 中介」?

關鍵點在於:**連接發起的方向是從內網向外網,而不是從外網向內網。**

1. **打破「牆壁」的關鍵:內網主動發起連接 (Tunneling)**
* 你的樹莓派(運行 Ngrok 客戶端)處於路由器 NAT 的內部。
* 路由器和 NAT 的「牆壁」是**阻止外部主動發起的連接進入內部網路**。
* 但是,路由器和 NAT **允許內部網路的設備主動向外部網際網路發起連接**。
* Ngrok 的魔力就在於,樹莓派上的 Ngrok 客戶端,會**主動地**向位於公共網際網路上的 Ngrok 伺服器**建立一個持續的、加密的長連接**(這個連接就像一條「隧道」)。這個「主動連接」的動作可以輕鬆穿透你的路由器 NAT。

2. **Ngrok 伺服器作為反向代理:**
* Ngrok 在公共網際網路上的伺服器,本身就是一個大型的**反向代理伺服器**。
* 當你的樹莓派成功建立這個隧道後,Ngrok 伺服器會給你分配一個公共的 URL (例如 `https://xxxxxx.ngrok-free.app`)。
* 當外部用戶(例如你的朋友)訪問這個 URL 時,他們的 HTTP 請求實際上是**發送到了 Ngrok 的反向代理伺服器**。

3. **流量的反向傳輸:**
* Ngrok 的反向代理伺服器收到外部請求後,它會利用之前樹莓派主動建立的那個「隧道」,**將這個 HTTP 請求從隧道中反向地傳輸到你的樹莓派上的 Ngrok 客戶端。**
* 樹莓派上的 Ngrok 客戶端收到請求後,再將其轉發給樹莓派本地的網頁服務(例如埠 80)。
* 網頁服務生成響應後,再透過 Ngrok 客戶端,經由隧道傳回 Ngrok 伺服器,最後由 Ngrok 伺服器轉發給外部用戶。

---

### 圖解:

```
[ 外部用戶的瀏覽器 ]
| HTTP 請求
V
[ Ngrok 反向代理伺服器 ] <-- (這是位於公共網際網路上的)
|
| (透過樹莓派主動建立的加密隧道)
|
V
[ 你的路由器 / 手機 AP ] -- (NAT 層) -- [ 樹莓派上的 Ngrok 客戶端 ]
| |
| HTTP 請求轉發 (內部網路) | 將請求轉發給本地服務
V V
[ 樹莓派上的網頁服務 ]
```

### 為什麼它可以「穿過路由器的 IP 中介」?

* **主動連接 vs. 被動接收:** 路由器的 NAT 是為了阻止來自**外部主動發起的**、未經允許的連接。但它不會阻止**內部設備主動向外部發起**連接。Ngrok 就是利用了這一點:你的樹莓派是主動發起連線到 Ngrok 伺服器。
* **隧道本身是合法流量:** 對於路由器和 NAT 來說,樹莓派發出的這個 Ngrok 隧道連接,只是一個普通的「出站」網路連接,就像你瀏覽網頁一樣,是完全合法的。路由器不會去檢查這個連接的「內容」是不是一個反向代理的隧道。
* **無須 Port Forwarding:** 因為連接的方向是從內向外,所以你不需要在路由器上設定任何 Port Forwarding 規則。路由器只需要知道如何將樹莓派的「出站」流量發送出去即可。

所以,Ngrok 這樣的服務並不是「直接穿過」路由器的管理,而是**巧妙地利用了 NAT 的工作原理和連接發起的方向性**,建立了一個持續的「出站」連接作為隧道,然後利用外部的反向代理伺服器來實現外部流量的「反向」進入。