iptables 教學:5 步設定 Linux 防火牆保護 Server

## 前言 如果你有打理過 Linux server,你一定聽過 iptables 呢個名。iptables 係 Linux kernel 內建嘅防火牆工具,由 1998 年 Linux 2.4 kernel 開始就存在,到今日依然係大部份 Linux distro 嘅預設防火牆方案。無論你係用 Ubuntu、Debian、CentOS 定係 Raspberry Pi,iptables 都喺背後默...

前言

如果你有打理過 Linux server,你一定聽過 iptables 呢個名。iptables 係 Linux kernel 內建嘅防火牆工具,由 1998 年 Linux 2.4 kernel 開始就存在,到今日依然係大部份 Linux distro 嘅預設防火牆方案。無論你係用 Ubuntu、Debian、CentOS 定係 Raspberry Pi,iptables 都喺背後默默幫你過濾流量。

但好多 IT 人都係「裝完 server 就咁用」,完全冇理過 iptables 嘅設定。今日我就同大家由零開始,step-by-step 教你點樣用 iptables 保護你部 server,等黑客冇咁易撞入嚟。

iptables 基本概念:Table、Chain、Rule

iptables 嘅運作邏輯好簡單:佢用「表格(table)」去組織「鏈(chain)」,每條鏈入面有一堆「規則(rule)」。當 network packet 經過你部機,iptables 就會逐條 rule 去 match,match 到就執行對應動作(ACCEPT / DROP / REJECT)。

主要有三個 default chain:

– **INPUT** — 處理入站流量(外面想入你部機)
– **OUTPUT** — 處理出站流量(你部機想出去)
– **FORWARD** — 處理轉發流量(你部機做 router 嗰陣)

最常用嘅 table 係 **filter**(預設),專門用嚟決定允許定拒絕 traffic。

下面係 iptables 嘅基本語法:

iptables -A <CHAIN> -p <PROTOCOL> --dport <PORT> -j <ACTION>

參數解釋:
– `-A` = Append(加一條 rule 去 chain 尾)
– `-p` = Protocol(tcp / udp / icmp)
– `–dport` = Destination Port(目標 port)
– `-j` = Jump(執行咩動作:ACCEPT / DROP / REJECT)

iptables:Step 1:睇下而家有咩 Rules

首先,check 下你部機現有嘅 iptables rules:

sudo iptables -L -v -n

`-L` = List rules,`-v` = verbose(睇埋 packet count),`-n` = numeric(唔做 DNS lookup,快好多)。

如果你見到所有 chain 嘅 policy 都係 ACCEPT 而且冇任何 rule,即係你部機係「中門大開」狀態 — 任何 traffic 都可以入嚟。呢個時候你應該盡快 set up 基本防護。

iptables:Step 2:設定預設 Policy 為 DROP

最基本嘅安全原則:先拒絕一切,再按需要開放。咁樣就算你漏咗 set 某啲 rule,default 都係安全嘅。

sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

⚠️ 注意:OUTPUT 我哋 keep ACCEPT,因為大部份情況下你部 server 需要主動出街(update package、send email 等等)。如果你做緊高安全環境,可以將 OUTPUT 都 set DROP 再逐個開放。

**警告:如果你係經 SSH 連入去做呢個設定,做之前一定要先 set 好下一條 rule!否則你會即時斷線。**

iptables:Step 3:開放基本必要 Ports

Set 咗 default DROP 之後,你要手動開放必要嘅 ports:

# 允許 loopback(本機內部通訊)
sudo iptables -A INPUT -i lo -j ACCEPT

# 允許已經建立嘅連線繼續(非常重要!)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 開放 SSH(port 22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 開放 HTTP/HTTPS(如果你有 web server)
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

`ESTABLISHED,RELATED` 呢條 rule 好重要 — 佢容許已經建立嘅 connection 繼續通行(例如你 SSH 入去之後嘅 return traffic),唔使每條 connection 都重新 match rules。

iptables:Step 4:防止常見攻擊 — 限制 SSH 暴力破解

SSH brute force 係最常見嘅攻擊之一。你可以用 iptables 限制 SSH connection rate:

# 每分鐘最多 3 個新 SSH connection,超過就 DROP
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP

呢兩條 rule 會:
1. 記錄每一個新 SSH connection(–set)
2. 如果 60 秒內有超過 3 個新 connection,第 4 個開始全部 DROP

比起 fail2ban,iptables 嘅 rate limiting 係 kernel-level,效能更好,適合高流量環境。

iptables:Step 5:Save Rules 令佢重啟後仍生效

iptables rules 係儲存喺 memory,reboot 就會消失。你要手動 save:

**Ubuntu/Debian:**

sudo apt install iptables-persistent
sudo netfilter-persistent save

**CentOS/RHEL:**

sudo service iptables save

完成!而家你部 server 已經有基本嘅 iptables 防護。當然,呢個只係入門 — 進階仲有 port knocking、geo-IP blocking、DDoS mitigation 等等。但作為第一步,你已經由「中門大開」變成「有基本防護」,黑客要撞入嚟就難好多喇。

總結

iptables 係 Linux 管理員嘅基本功,花半個鐘學識佢,可以幫你擋走大量自動化攻擊。記住黃金法則:**Default DROP,按需要開放**。唔好偷懶用 default ACCEPT — 你永遠唔知邊個 port 會俾人 scan 到。

🔗 參考資料:NVD NIST 漏洞資料庫

有問題歡迎留言討論!如果你想學進階 iptables 玩法(geo-IP blocking、port knocking),留言話我知,下次再寫。

#Linux #防火牆 #Server #IT教學 #自動化

iptables 教學:5 步設定 Linux 防火牆保護 Server - 文章重點速覽 infographic

相關閱讀: