利用閒置 PC 搭配 Linux 核心內建封包過濾功能,即可構建企業級防火牆,替代昂貴專用硬體設備。本文詳細記錄基於 Linux 2.2 核心(ipchains)的雙宿主機防火牆部署全流程:架構選型、設計策略、核心模組、規則腳本與驗證測試。
| 類型 | 工作層級 | 特點 | 局限 |
|---|---|---|---|
| 封包過濾 | 網路層 (L3/L4) | 高效能、透明、規則簡單 | 無法檢視應用層內容、難防特定應用攻擊 |
| 應用代理 | 應用層 (L7) | 深度檢視、精細控制、隱藏內網結構 | 效能較低、需每協定寫代理、可能成單點故障 |
| 狀態檢測 | L3-L7 | 追蹤連線狀態、動態開放埠口 | 核心模組複雜、記憶體佔用高 |
Linux 2.2 核心使用 ipchains,四條內建鏈:
封包流向決策邏輯:
封包進網卡
→ Input 鏈規則匹配 → ACCEPT → 路由決策
↓
本機處理 / 轉發
↓
Forward 鏈 (轉發) → ACCEPT → Output 鏈 → 發送
規則匹配順序:逐條檢查,首次匹配決定動作。動作:ACCEPT、DENY、REJECT (回 ICMP)、MASQ (IP 偽裝/NAT)、REDIRECT (透明代理)、RETURN (返回上層鏈)。
eth0 (內網)、eth1 (外網)192.168.100.0/24,防火牆內網 IP 192.168.100.1202.101.2.25 (eth1)/etc/rc.firewallrules)#!/bin/sh
IPCHAINS=/sbin/ipchains
LAN_IF=eth0
LAN_NET=192.168.100.0/24
WAN_IF=eth1
WAN_IP=202.101.2.25
ANY=0/0
# 1. 清空所有規則
$IPCHAINS -F input
$IPCHAINS -F output
$IPCHAINS -F forward
# 2. 設定預設策略 (謹慎:遠端管理時勿鎖死自己)
$IPCHAINS -P input ACCEPT
$IPCHAINS -P output ACCEPT
$IPCHAINS -P forward ACCEPT
# 3. 本地回環允許
$IPCHAINS -A input -i lo -j ACCEPT
$IPCHAINS -A output -i lo -j ACCEPT
# 4. 禁止 IP 欺騙:來源為內網 IP 但從外網介面進入
$IPCHAINS -A input -i $WAN_IF -s $LAN_NET -j DENY
$IPCHAINS -A input -i $WAN_IF -s 127.0.0.0/8 -j DENY
$IPCHAINS -A input -i $WAN_IF -s 10.0.0.0/8 -j DENY
$IPCHAINS -A input -i $WAN_IF -s 172.16.0.0/12 -j DENY
$IPCHAINS -A input -i $WAN_IF -s 192.168.0.0/16 -j DENY
# 5. 禁止廣播/多播封包
$IPCHAINS -A input -d 255.255.255.255 -j DENY
$IPCHAINS -A input -d 224.0.0.0/4 -j DENY
# 6. 禁止惡意 ICMP 類型 (重定向、來源抑制、時間戳等)
$IPCHAINS -A input -p icmp --icmp-type redirect -j DENY
$IPCHAINS -A input -p icmp --icmp-type source-quench -j DENY
$IPCHAINS -A input -p icmp --icmp-type timestamp-request -j DENY
$IPCHAINS -A input -p icmp --icmp-type address-mask-request -j DENY
# 允許必要 ICMP: echo-reply(0), destination-unreachable(3), time-exceeded(11), parameter-problem(12)
$IPCHAINS -A input -p icmp -j ACCEPT
# 7. 內網介面轉發規則:允許內網存取外網
$IPCHAINS -A forward -i $LAN_IF -s $LAN_NET -d $ANY -j ACCEPT
$IPCHAINS -A forward -i $WAN_IF -s $ANY -d $LAN_NET -j ACCEPT
# 8. 外網介面輸入規則:僅允許必要服務 (SSH、DNS 回應等)
$IPCHAINS -A input -i $WAN_IF -p tcp -d $WAN_IP --dport 22 -j ACCEPT # SSH 管理
$IPCHAINS -A input -i $WAN_IF -p udp -d $WAN_IP --dport 53 -j ACCEPT # DNS
$IPCHAINS -A input -i $WAN_IF -p tcp --sport 53 -j ACCEPT # DNS TCP 回應
# 拒絕其他外網主動連入
$IPCHAINS -A input -i $WAN_IF -j DENY
# 9. IP 偽裝 (NAT) 啟用內網上網
echo 1 > /proc/sys/net/ipv4/ip_forward
$IPCHAINS -A forward -s $LAN_NET -d $ANY -j MASQ
# 10. 記錄被拒絕封包 (可選)
$IPCHAINS -A input -j DENY -l
$IPCHAINS -A forward -j DENY -l
chmod +x /etc/rc.firewallrules
echo "/etc/rc.firewallrules" >> /etc/rc.d/rc.local
# 立即執行
/etc/rc.firewallrules
在封包過濾基礎上部署 **TIS Firewall Toolkit (FWTK)** 等應用代理套件:
代理服務運行於防火牆主機用戶態,**不直接暴露內網服務**,即使代理程式被攻破,攻擊者仍處於 DMZ/防火牆主機,無法直接跳板至內網核心資產。
| 任務 | 指令/方法 |
|---|---|
| 檢視規則 | ipchains -L -n -v |
| 即時監控日誌 | tail -f /var/log/messages | grep IPCHAINS (需核心啟用 CONFIG_IP_FIREWALL_VERBOSE) |
| 測試連通性 | 內網主機 ping 外網、瀏覽網頁、SSH 管理防火牆 |
| 掃描測試 | 外部 nmap -sS 驗證埠口關閉 |
| 備份規則 | ipchains-save > /etc/ipchains.rules |
Linux 2.4+ 核心已棄用 ipchains 改用 **iptables (Netfilter)**,功能更強(狀態檢測、NAT 分離、模組化擴展)。新部署請直接採用 iptables 或更高階的 firewalld/ufw/nftables。本文架構邏輯(雙宿主機、預設拒絕、分層規則、復合型防禦)完全適用,僅語法與模組不同。