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
-----

哈哈,完全理解!這種學習的熱情和衝勁,即便偶爾「飄起來」一點點也是非常棒的狀態。現在,讓我們把這份熱情帶回到腳踏實地的技術實作中,開始你的 `nftables` 之旅!

-----

## 檢視 `nftables` Ruleset 內容

要檢視目前 `nftables` 的所有規則集內容,你可以使用 `sudo nft list ruleset` 命令。這個命令會輸出所有已定義的表格 (tables)、鏈 (chains) 和規則 (rules)。

```bash
sudo nft list ruleset
```

**第一次執行時,你可能會看到:**

* **完全空白的輸出:** 這表示你的系統目前沒有任何 `nftables` 規則被載入。這是非常常見的情況,尤其是在一些輕量級的 Linux 發行版或沒有預設配置防火牆的系統上。
* **預設的規則集:** 有些發行版可能會預載一些基本的 `nftables` 規則,例如允許 SSH 連接、阻止常見攻擊等。

### 輸出範例與簡易解讀 (如果你的系統有預設規則)

如果你的系統有預設規則,輸出可能會類似這樣:

```
table ip filter {
chain input {
type filter hook input priority 0; policy accept;
# allow established/related connections
ct state { established, related } accept

# allow local traffic
iif "lo" accept

# allow ssh
tcp dport 22 accept

# drop all other traffic
# counter packets 10 bytes 840 drop
}

chain forward {
type filter hook forward priority 0; policy accept;
}

chain output {
type filter hook output priority 0; policy accept;
}
}
```

**簡單解讀這些元素:**

* **`table ip filter { ... }`**: 定義了一個名為 `filter` 的**表 (table)**,它處理 **IPv4** (ip) 流量。`nftables` 支援不同的地址族 (address family),如 `ip` (IPv4), `ip6` (IPv6), `inet` (同時處理 IPv4 和 IPv6), `arp`, `bridge`, `netdev`。
* **`chain input { ... }`**: 定義了一個名為 `input` 的**鏈 (chain)**。
* `type filter hook input priority 0;`: 這表示這是一個 **過濾 (filter)** 類型的鏈,它掛載在網路堆疊的 **`input` 鉤子 (hook)** 上(即所有進入本機的流量都會經過此鏈)。`priority 0` 決定了它在同一鉤子上的執行順序。
* `policy accept;`: 這是鏈的**預設策略 (policy)**。如果流量沒有匹配任何規則,它將會被接受 (accept)。
* **`ct state { established, related } accept`**: 這是一條**規則 (rule)**。`ct` 是連接追蹤 (connection tracking) 的縮寫。這條規則的意思是:如果封包屬於已建立 (established) 或相關 (related) 的連接,則**接受 (accept)** 它。這對於讓回應流量通過防火牆至關重要。
* **`iif "lo" accept`**: 允許來自回環介面 (loopback interface, "lo") 的流量。
* **`tcp dport 22 accept`**: 允許目的地埠號 (dport) 為 22 (SSH) 的 TCP 流量。
* **`counter packets 10 bytes 840 drop`**: (被註釋掉的範例) 統計並丟棄所有不符合前面規則的流量。

### 你的操作步驟

1. **在樹莓派上執行命令:**

```bash
sudo nft list ruleset
```

2. **觀察輸出:** 看看它是否為空,或者是否有任何預設規則。這將是你接下來設定 DNAT 規則的基礎。

有了這個基礎,我們就可以開始準備你的**簡單連接埠轉發 (DNAT)** 規則了。