---
# System prepended metadata

title: W8 Firewall + iptable

---

# W8 Firewall + iptable
### 什麼是防火牆?
> 為了防護內網跟外網的屏障
> 管理黑白名單

### 防火牆類型

| 防火牆類型 | OSI 層級 | 作用重點 / 功能簡化 |
|---|---|---|
| 無狀態防火牆 (Stateless Firewall) | L3 ~ L4 網路 / 傳輸層 | 依 IP / Port 過濾封包，不追蹤連線狀態 |
| 具狀態防火牆 (Stateful Firewall) | L3 ~ L4 網路 / 傳輸層 | 過濾封包 + 追蹤連線狀態，阻擋非法連線 |
| Web 應用防火牆 (WAF) | L7 應用層 | 偵測 HTTP/HTTPS 流量，阻止 Web 攻擊與漏洞利用 |
| Proxy | L7 應用層 | 代理應用層請求、代為傳送流量，隔離內外網，控制使用者或保護伺服器 |


Netfilter
>Linux核心中的封包安全框架

>*Hook是處理流程中設定的檢查點，用來攔截、檢查或處理封包。

iptables
> 屬於netfilters的UI介面

table(依功能分類)、Chain(指定在特定hook點觸發)、rules(規則)

## iptables的五大table整理
fliter
> 封包過濾

nat
> 修改封包來源或port號

mangle
>不常用
>用來修改封包表頭

raw
> 主要用來控制哪些封包需要用來進行連線追蹤

security
> 給封包加上安全標記

TTL (封包有一個跳點，如果扣到剩0，就會被丟掉

iptables 預先定義的五個chain
1. PREROUTING 封包剛進入系統
2. INPUT 系統判斷是給本機的封包
3. FORWARD 過濾要轉送的封包
4. OUTPUT 系統自己產生的封包要送出去
5. POSTROUTING 封包準備要離開系統

| 預設的五個 chain | 時機 | 對應的 Netfilter hook 名稱 |
|---|---|---|
| PREROUTING | 封包剛進入系統（還沒決定要送給誰） | `NF_INET_PRE_ROUTING` |
| INPUT | 系統判斷是給「本機」的封包 | `NF_INET_LOCAL_IN` |
| FORWARD | 系統判斷要「轉發」給別台機器 | `NF_INET_FORWARD` |
| OUTPUT | 系統自己產生的封包要送出去 | `NF_INET_LOCAL_OUT` |
| POSTROUTING | 封包準備要離開系統 | `NF_INET_POST_ROUTING` |



ICMP echo request (type=8)

NAT概念
> 網路位置轉換
:::info
#### 為什麼要有NAT?
IPV4的網路不夠用
:::
* SNAT來源
* DNAT目的

fliter table
>INPUT+FORWARD+OUTPUT
* INPUT - 針對「目的地是本機」的封包。
>有人從外部要SSH到你的主機
* FORWARD - 針對「需要轉送(路由)」的封包
>主機作為路由器，把封包從eth0轉發到eth1
* OUTPUT - 針對「由本機產生、要送出去」的封包
>自己執行 ping 8.8.8.8 時發出的封包


nat table
PREROUTING+POSTOUTING
* Prerouting：封包剛進主機時，路由判斷前
* Postrouting：封包準備送出的最後一刻


Policy
- INPUT OUTPUT FORWARD 預設為 accept
> 檢視: `sudo iptables -L`

### Target
| Target | 用途 / 行為 | 說明 |
|---|---|---|
| ACCEPT | 允許封包 | 封包通過防火牆 |
| DROP | 丟棄封包 | 不回應發送端，直接丟棄封包 |
| REJECT | 拒絕封包 | 回應回傳 RST 封包，告知封包被拒絕 |
| SNAT | 修改來源位址 | 改變封包來源 IP，用於內網上網 |
| DNAT | 修改目的位址 | 改變封包目的 IP，用於轉送流量 |
| MASQUERADE | 動態修改來源位址 | 自動獲取網卡 IP |
| REDIRECT | 封包導向本機 | 將封包導向指定的 port |
| LOG | 記錄封包 | 記錄封包至系統日誌 |
| 其他 chain 的名稱 | 轉換到指定 chain |  |




### IPTables常用指令參數
> 通常規則處發後即結束判斷
### Rule 操作
* -L ---list 顯示所有規則
* -A / ---append  將規則附加至規則鏈的最後面
```
#在 INPUT chain 附加允許 SSH 的規則
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
```
* -R / ---replace 取代指定位置的規則(需加規則號碼)
```
#將 INPUT chain  第二條規則替換成封鎖 HTTP
sudo iptables -R INPUT -p tcp --dport 80 -j DROP
```
* -D / ---delete 刪除指定規則(可用規則號碼或完整規則內容)
```
#刪除 INPUT chain 第三條規則
sudo iptables -D INPUT 3
#或刪除符合條件的規則
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
```
* -F / ---flush 清空指定規則鏈內的所有規則
```
#清空 INPUT chain 所有規則
sudo iptables -F INPUT
```
* -t (table) 指定table，預設為filter 

iptable 儲存規則
使用iptables-save儲存規則
1.
2.
3.還原、套用規則(restore、apply)