iptables 是 Linux 核心層封包過濾框架,掌握其 四表五鏈 架構與規則撰寫邏輯,即可構建企業級主機防火牆。本文系統整理核心概念、指令語法、擴充模組與實戰範本。
封包流向
┌─────────────────┐
│ raw 表 │ (連線追蹤前處理)
└────────┬────────┘
│
┌────────▼────────┐
│ mangle 表 │ (修改封包標記/TOS/TTL)
└────────┬────────┘
│
┌──────────────┼──────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ nat 表 │ │ filter表 │ │ nat 表 │
│ PREROUTING│ │ INPUT │ │ POSTROUTING│
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
▼ ▼ ▼
[路由決定] [本地進程] [輸出介面]
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ nat 表 │ │ filter表 │ │ mangle表 │
│ OUTPUT │ │ OUTPUT │ │ OUTPUT │
└──────────┘ └──────────┘ └──────────┘
│ │
▼ ▼
[路由決定] [本地產生]
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ filter表 │ │ nat 表 │
│ FORWARD │ │ POSTROUTING│
└──────────┘ └──────────┘
INPUT (進站)、FORWARD (轉發)、OUTPUT (出站) —— 主要防火牆邏輯PREROUTING (DNAT)、POSTROUTING (SNAT/Masquerade)、OUTPUT (本機發出 DNAT)NOTRACK 繞過連線追蹤、TRACE 除錯iptables [-t 表] 命令 鏈 條件 -j 目標
# 命令
-A 附加規則至鏈末尾
-I 插入規則至指定位置 (預設鏈首)
-D 刪除規則 (按編號或完整匹配)
-R 替換指定編號規則
-L 列出規則 (-n 數位顯示 -v 詳述 --line-numbers 編號)
-F 清空鏈規則
-Z 歸零計數器
-N 新增使用者自訂鏈
-X 刪除使用者自訂鏈 (無引用時)
-P 設定鏈預設政策
-E 重命名鏈
| 模組 | 關鍵參數 | 用途 |
|---|---|---|
state / conntrack | --state NEW,ESTABLISHED,RELATED,INVALID | 連線狀態防火牆 (核心) |
tcp | --dport 80 --sport 1024:65535 --tcp-flags SYN,RST,ACK SYN | TCP 連接埠/旗標 |
udp | --dport 53 | UDP 連接埠 |
icmp | --icmp-type echo-request | ICMP 類型 |
iprange | --src-range 192.168.1.10-192.168.1.20 | IP 範圍 (非 CIDR) |
recent | --name ATTACK --set --rcheck --seconds 60 --hitcount 10 | 近期連線限制 (防暴力破解) |
limit | --limit 5/min --limit-burst 10 | 速率限制 (日誌/防洩漏) |
owner | --uid-owner 1000 | 進程擁有者匹配 |
string | --string "malware" --algo bm | 應用層內容匹配 |
time | --timestart 09:00 --timestop 18:00 | 時間段控制 |
ACCEPT:放行DROP:靜默丟棄 (無回應)REJECT:拒絕並回應 (ICMP port-unreachable / TCP RST)LOG:記錄核心日誌 (配合 --log-prefix)RETURN:返回呼叫鏈REDIRECT:重導向本機埠 (透明代理)MASQUERADE:動態 SNAT (動態 IP 上網)DNAT:目的地址轉換 (端口映射)MARK:打標記供策略路由/QoS#!/bin/bash
IPT=/sbin/iptables
# 1. 清空預設規則
$IPT -F
$IPT -X
$IPT -Z
# 2. 設定預設政策 (拒絕進站/轉發,允許出站)
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
# 3. 信任本地回環
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# 4. 允許已建立/相關連線
$IPT -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 5. 允許 ICMP (ping/MTU探測)
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
# 6. 開放必要服務 (範例)
$IPT -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT # SSH
$IPT -A INPUT -p tcp --dport 80,443 -m conntrack --ctstate NEW -j ACCEPT # HTTP/HTTPS
# 7. 防暴力破解 (SSH 最近 60 秒超過 3 次新連線即封鎖 10 分鐘)
$IPT -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --name SSH_ATTACK --set
$IPT -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --name SSH_ATTACK --update --seconds 600 --hitcount 4 -j DROP
# 8. 記錄被拒絕封包 (限速避免日誌洩漏)
$IPT -A INPUT -m limit --limit 5/min -j LOG --log-prefix "IPT_INPUT_DROP: " --log-level 4
# 9. 儲存規則 (CentOS/RHEL)
service iptables save
# 或 iptables-save > /etc/sysconfig/iptables
ip6tables 語法相同,地址為 IPv6 格式iptables-save/restore、systemd 服務、/etc/iptables/rules.v4 (Debian/Ubuntu)ipset 管理大量 IP 黑白名單ufw (Ubuntu)、firewalld (RHEL/CentOS 7+)、shorewall、fermiptables 核心在於 四表五鏈流向 + 狀態匹配 (conntrack) + 精準目標動作。建立「預設拒絕、最小授權、記錄異常、限速防洩漏」防禦心模,配合 ipset 與前端工具落地,即可構建堅固主機防火牆。
Ubuntu 下安裝與使用 LIBSVM 完整教學(含 Python 工具)
CentOS VPS 下 yum 下載緩慢?安裝 Axel 多線程插件大幅加速
Linux cp 硬連結實戰:零磁碟空間實現大檔案 HTTP 下載
Linux tcpdump 進階用法:選項詳解、過濾語法、抓包存檔、Wireshark 離線分析工作流
Linux 殭屍進程深度解析:產生機制、核心原理與四種徹底解決方案
Linux 核心 Oops 錯誤訊息完整解讀:從空指標範例看 Call Trace、錯誤碼與 Tainted 旗標含義