目錄
一、 Linux 防火墻基礎
1. 防火墻基礎概念
(1)防火墻的概述與作用
(2)防火墻的結構與匹配流程
(3)防火墻的類別與各個防火墻的區別
2. iptables 的表、鏈結構
(1)規則表
(2)規則鏈
3. 數據包過濾的匹配流程
(1)規則表之間的順序
(2)規則鏈之間的順序
入站流量處理流程
出站流量處理流程
(3)規則鏈內部各條防火墻規則之間的順序
總結速記表
二、編寫防火墻規則
1. iptables 的基礎設置
(1)iptables 安裝
(2)啟動防火墻并設置開機自啟動
2. 基本語法、數據包控制類型
(1)基本語法
(2)控制類型
3. 添加·、查看、刪除規則等基本規則
(1)添加新的規則(鏈的末尾可使用“-p 協議名”作匹配條件)
(2)查看規則列表(可結合“-L”,“--line-numbers”)
(3)刪除、清空規則
(4)設置默認策略
三、規則的匹配條件(分為三大類)
1. 通用匹配
(1)協議匹配
(2)地址匹配
(3)網絡接口匹配
2. 隱含匹配
(1)端口匹配
(2)ICMP 類型匹配
3. 顯式匹配
(1)多端口匹配
(2)IP范圍匹配
(3)MAC 地址匹配
(4)狀態匹配
一、 Linux 防火墻基礎
1. 防火墻基礎概念
(1)防火墻的概述與作用
-
定義:防火墻是位于網絡邊界的?安全屏障,通過預定義規則控制進出網絡的流量。
-
核心功能:
-
訪問控制:允許或拒絕特定流量(如 IP、端口、協議)。
-
網絡地址轉換(NAT):隱藏內部網絡結構,實現 IP/端口映射。
-
流量監控:記錄網絡活動,檢測異常行為(如 DDoS 攻擊)。
-
防御攻擊:阻止惡意流量(如 SYN Flood、ICMP 洪水)。
-
(2)防火墻的結構與匹配流程
┌───────────────┐ 輸入流量 →│ 規則匹配引擎 │→ 輸出流量 └───────┬───────┘ ↓ [日志記錄/警報]
數據包 → 匹配規則 → 執行動作(ACCEPT/DROP/REJECT) ↑ 規則數據庫(表+鏈+規則)
匹配流程:
協議分析 → 規則匹配 → 執行動作(允許/拒絕/日志)
(3)防火墻的類別與各個防火墻的區別
-
iptables:傳統防火墻工具,用于管理Linux防火墻的命令程序,基于 Netfilter 框架,通過規則表(Tables)和規則鏈(Chains)管理流量。是“用戶態”(User Space ,用戶空間)的防火墻管理體;通常在/sbin/iptables 目錄下。
-
nftables:iptables 的替代品,在Linux內核中實現包過濾防火墻的內部結構,語法更簡潔,性能更優,逐步成為主流。是“內核態”(Kernel Space ,內核空間)不以程序或文件形式存在的防火墻功能體系。
-
firewalld:動態防火墻管理工具(Red Hat 系默認),支持區域(Zones)和運行時/永久配置。
-
?類型對比
工具 | 特點 | 適用場景 | |
---|---|---|---|
iptables | 基于 Netfilter 框架,直接管理規則表/鏈,語法復雜但靈活。 | 精細化控制、復雜網絡環境 | |
nftables | iptables 的替代品,統一語法、性能更優,支持多規則合并。 | 新系統、追求高效管理的場景 | |
firewalld | 動態防火墻管理工具,支持運行時/永久配置,抽象為“服務”和“區域”。 | 快速配置(如開放 Web 服務) |
2. iptables 的表、鏈結構
iptables 的作用是為了過濾機制的實現提供規則
(1)規則表
表名 | 功能 | 常見操作 |
---|---|---|
filter | 數據包過濾(默認表)確定是否放行數據包 | 允許/拒絕流量(ACCEPT/DROP) |
nat | 網絡地址轉換(NAT)修改數據包中的源、目標 IP 地址或端口。 | 端口轉發、IP 偽裝(MASQUERADE) |
mangle | 修改數據包頭部(如 TTL(生存周期)、TOS(服務類型))為數據包設置標記 | 標記數據包(MARK) |
raw | 決定是否對數據包進行狀態跟蹤 | 標記不追蹤的數據包(NOTRACK) |
(2)規則鏈
每個表包含多個鏈,鏈是規則的集合,決定數據包的處理路徑:
鏈名 | 所屬表 | 觸發場景 |
---|---|---|
POSTROUTING | mangle, nat | 數據包離開網卡前(SNAT 修改源地址) |
PREROUTING | raw, mangle, nat | 數據包進入網卡后、路由決策前(DNAT 修改目標地址) |
INPUT | filter | 數據包目標是本機地址應用(入站) |
OUTPUT | filter | 本機向外發出的數據包(出站) |
FORWARD | filter | 數據包需要轉發到其他主機(路由開啟時生效) |
鏈路由圖:
外部數據 → PREROUTING → 路由判斷 → 目標是否本機? ↓ ↙ ↘ INPUT鏈 FORWARD鏈 OUTPUT鏈 ↓ ↓ ↓ 本機進程 轉發處理 POSTROUTING → 外發
3. 數據包過濾的匹配流程
匹配流程:
數據包依次經過不同?表(raw
?→?mangle
?→?nat
?→?filter
)。
在表中按?鏈?的順序處理(如?PREROUTING
?→?INPUT
)。
鏈內規則按?從上到下?順序匹配,命中則執行動作(ACCEPT/DROP)。
(1)規則表之間的順序
數據包依次經過?raw → mangle → nat → filter?表的處理:
-
raw 表PREROUTING鏈:決定是否跳過連接追蹤(如標記?
NOTRACK
)。 -
mangle 表PREROUTING鏈:修改數據包頭部(如調整 TTL)。
-
nat 表PREROUTING鏈:執行地址轉換(如 DNAT 端口映射)。
-
filter 表INPUT鏈:最終決定是否允許數據包通過。
(2)規則鏈之間的順序
數據包根據方向觸發不同鏈:
-
入站流量(如訪問本機 Web 服務):
網卡 → PREROUTING(raw/mangle/nat) → 路由決策 → INPUT(filter) → 本地應用
-
轉發流量(如路由器轉發數據):
網卡 → PREROUTING → 路由決策 → FORWARD(filter) → POSTROUTING → 出站網卡
-
出站流量(如本機訪問外網):
本地應用 → OUTPUT(filter) → POSTROUTING(mangle/nat) → 出站網卡
入站流量處理流程
1. 網卡接收數據包 ↓ 2. raw 表的 PREROUTING 鏈 ↓ 3. mangle 表的 PREROUTING 鏈 ↓ 4. nat 表的 PREROUTING 鏈(DNAT) ↓ 5. 路由決策(目標是否為本機?) ↓ 6. 是 → filter 表的 INPUT 鏈(決定是否允許進入本機) ↓ 7. 本地應用接收
出站流量處理流程
1. 本地應用發送數據包 ↓ 2. filter 表的 OUTPUT 鏈(決定是否允許出站) ↓ 3. mangle 表的 POSTROUTING 鏈 ↓ 4. nat 表的 POSTROUTING 鏈(SNAT/MASQUERADE) ↓ 5. 數據包從網卡發出
(3)規則鏈內部各條防火墻規則之間的順序
執行原則:
從上到下逐條匹配
首次匹配后停止(ACCEPT/DROP/REJECT)
未匹配則執行鏈的默認策略(通過?
iptables -P
?設置)
總結速記表
核心概念 | 要點 |
---|---|
防火墻作用 | 訪問控制、NAT、流量監控、防御攻擊 |
表與鏈的關系 | 表按功能分類,鏈按流量方向劃分 |
匹配流程順序 | raw → mangle → nat → filter(表順序);PREROUTING → INPUT/FORWARD → POSTROUTING(鏈順序) |
安全最佳實踐 | 默認拒絕(-P DROP )、細化規則優先、定期審計規則 |
二、編寫防火墻規則
1. iptables 的基礎設置
(1)iptables 安裝
yum -y install iptables iptables-services? ? ?##注意有些系統裝過iptables,直接下一步啟動就好
(2)啟動防火墻并設置開機自啟動
systemctl stop firewalld? ? ?##關閉默認的 防火墻(firewalld),避免產生影響
systemctl disable? firewalld
systemctl start iptables.service? ? ?##啟動iptables 防火墻
systemctl enable iptables.service
2. 基本語法、數據包控制類型
(1)基本語法
iptables [-t 表名] 命令選項 [鏈名] [規則條件] [-j 控制類型 ]
參數解析:
-
-t
:指定操作表(不指定,默認為filter表) -
命令選項:
-A
(追加)/-I
(插入)/-D
(刪除)/-L
(查看)等 -
-j
:指定數據包處理動作(ACCEPT/DROP等) -
-p : 指定協議
(2)控制類型
控制類型 | 功能描述 | 典型場景 |
---|---|---|
ACCEPT | 允許通過 | 開放SSH端口(22) |
DROP | 靜默丟棄 | 防御端口掃描 |
REJECT | 拒絕并返回錯誤 | 明確拒絕HTTP請求(返回RST) |
LOG | 記錄日志(不阻斷流量)/var/log/messages | 調試防火墻規則 |
SNAT | 源地址轉換 | 內網機器訪問外網 |
DNAT | 目標地址轉換 | 外網訪問內網服務器 |
MASQUERADE | 動態源地址轉換 | 撥號上網等動態IP環境 |
3. 添加·、查看、刪除規則等基本規則
管理選項:
類別 | 選項 | 用途 |
---|---|---|
增加 | -A | 追加到最后一行 |
-I | 插入到第一行(或指定序號) | |
查看 | -L | 列出所有規則 |
-n | 以數字形式顯示 | |
-v | 詳細信息 | |
--line(--line-numbers) | 顯示序號 | |
刪除 | -D | 刪除一條(指定序號或內容) |
-F | 清空所有 | |
修改 | -R | 替換某條規則 |
設置默認 | -P | 設置默認規則 |
(1)添加新的規則(鏈的末尾可使用“-p 協議名”作匹配條件)
# 允許特定IP訪問SSH
iptables -A INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT # 插入規則到鏈首(優先級最高)
iptables -I INPUT 1 -p icmp -j DROP # 禁止所有ping # 設置端口轉發(需開啟ip_forward)
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2:80
(2)查看規則列表(可結合“-L”,“--line-numbers”)
# 查看filter表規則(默認表)
iptables -L -n --line-numbers -v # 查看nat表規則
iptables -t nat -L -n # 輸出解析:
# num pkts bytes target prot opt in out source destination
# 1 200 12000 ACCEPT tcp -- * * 192.168.1.100 0.0.0.0/0 tcp dpt:22
(3)刪除、清空規則
# 按編號刪除
iptables -D INPUT 2 # 刪除INPUT鏈第2條規則 # 按條件刪除
iptables -D INPUT -s 192.168.1.100 -j ACCEPT # 清空所有規則
iptables -F # 清空當前表 默認filter表
iptables -t nat -F # 清空nat表
(4)設置默認策略
# 設置INPUT鏈默認拒絕所有入站
iptables -P INPUT DROP # 設置OUTPUT鏈默認允許所有出站
iptables -P OUTPUT ACCEPT # 注意:默認策略應在具體規則前設置!
三、規則的匹配條件(分為三大類)
匹配條件是什么?有什么用?
1. 通用匹配(常規匹配,可直接使用)
(1)協議匹配
結合“ -p? 協議名 ”的形式指定,用來檢查數據包所使用的網絡協議(--protocol),可用協議類型在/etc/procotols 文件。
iptables -I INPUT -p icmp -j DROP //丟棄通過 icmp 協議訪問防火墻本機的數據包iptables -A FORWARD ! -p icmp -j ACCEPT //允許轉發經過防火墻的除 icmp 協議之外的數據包
(2)地址匹配
結合“-s 源地址” 或 “-d 目標地址 ”的形式指定,用來檢查數據包的源地址(--source)或目標地址(--destination)。
##拒接轉發源地址192.168.1.11的數據,允許轉發源地址位于192.168.7.0/24網段的數據
iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -A FORWARD -s 192.168.7.0/24 -j ACCEPT#遭到小規模掃描和攻擊時(例如10.20.30.0/24),封鎖IP地址
iptables -I INPUT -s 10.20.30.0/24 -j DROP
iptables -I FORWARD -s 10.20.30.0/24 -j DROP
(3)網絡接口匹配
結合“-i 接口名” 和 “-o 接口名?”的形式指定,用于檢查數據包從防火墻的哪一個接口進入或發出,分別對應入站網卡(--in-interface)、出站網卡(--out-interface)
##要丟棄從外網接口訪問防火墻本機且源地址為私有地址的數據包
iptables -A INPUT -i ens33 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i ens33 -s 172.16.0.0/16 -j DROP
iptables -A INPUT -i ens33 -s 192.168.0.0/16 DROP
2. 隱含匹配(指定的協議匹配為前提條件,無法單獨使用)
(1)端口匹配
結合“--sport 源端口” 或 “--dport 目標端口” 的形式,針對的協議為 TCP 或 UDP,用來檢查數據包的源端口或目標端口。單個端口號或以冒號“ : ”分隔,但多個端口不采用。
##允許為網段192.168.4.0/24 轉發 DNS 查詢數據包
iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.4.0/24 -p udp --sport 53 -j ACCEPT
(2)ICMP 類型匹配
結合“--icmp-type ICMP” 的形式,用于檢查ICMP數據包的類型(--icmp-type).
##禁止從其他主機ping本機,但是允許本機ping其他本機
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp -j DROP
3. 顯式匹配(要求額外的內核模塊提供支持,必須“-m 模塊名稱”形式調用)
(1)多端口匹配
結合“-m multiport --dports 端口列表”、“-m multiport --sports 端口列表”的形式,用于檢查數據包的源端口、目標端口、多個端口以逗號進行分隔。
iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
(2)IP范圍匹配
結合“-m iprange --src-range IP 范圍”、“-m iprange --dst-range IP范圍”的形式,用于檢查數據包的源地址、目標地址。
iptables -A FORWARD -p tcp -m iprange --src-range192.168.4.21-192.168.4.28 -j DROP
(3)MAC 地址匹配
結合“-m mac --mac-source MAC地址”的形式,用于檢查數據包的源MAC地址。
iptables -A INPUT -m mac --mac-source MAC地址 -j DROP
(4)狀態匹配
結合“-m state --state 連接狀態”的形式,基于iptables 的狀態跟蹤機制用來檢查數據包的連接狀態(State)。
##禁止轉發與正常TCP連接無關的非--syn請求數據包
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP##只開放本機Web服務(80端口),但對發給本機的TCP應答數據包放行
iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP