導讀:全面掌握 iptables:從基礎到實踐
在 Linux 系統中,iptables
?是一個非常強大的工具,它不僅是系統管理員用來構建和管理網絡防火墻的首選工具,而且也是一個功能豐富的網絡流量處理系統。無論是進行包過濾、監控網絡流量、還是實現復雜的網絡地址轉換 (NAT),iptables
?都能提供靈活的解決方案。本文將帶你深入理解?iptables
?的組成結構,掌握其常用命令,并通過具體的使用場景展示如何在實際中應用這些知識。
目錄
導讀:全面掌握 iptables:從基礎到實踐
一、iptables 的主要組成
表 (Tables)
鏈 (Chains)
規則 (Rules)
用戶定義的鏈
二、常用 iptables 命令
基本 iptables 命令格式
查看規則
添加規則
刪除規則
修改規則
插入規則
設置默認策略
保存和恢復規則
清空規則
端口重定向和 NAT
高級匹配和限速
日志記錄
狀態檢查
時間條件匹配
接口匹配
用戶自定義鏈
保存和加載規則
清空和重置
三、使用場景舉例
1. 基本的主機防護
允許特定的服務訪問
2. 防止 DDoS 攻擊
限制 SSH 連接嘗試
3. 端口轉發
將 80 端口轉發到 8080 端口
4. 網絡地址轉換 (NAT)
共享互聯網訪問
5. 日志和審計
記錄被拒絕的包
6. 使用時間條件控制訪問
在工作時間外允許 SSH 訪問
7. 防火墻繞過
臨時開放所有訪問
8. 防止 ICMP 泛洪攻擊
限制 ICMP 回顯請求
9. 多網卡策略路由
根據源 IP 使用特定的網絡接口
10. 容器和虛擬化環境
允許特定容器訪問外部網絡
iptables
?是 Linux 操作系統中的一個非常強大的防火墻工具,它使用表格來組織防火墻規則,這些表格中的規則用于決定如何處理穿過防火墻的數據包。iptables
?基于 Netfilter,Netfilter 是 Linux 內核的一個部分,負責處理通過網絡棧的所有數據包。通過使用?iptables
,系統管理員可以定義規則,這些規則決定了如何處理進入、穿過和離開網絡的數據包。
一、iptables
的主要組成
表 (Tables)
iptables
?的規則分布在不同的“表”中,這些表是處理特定類型數據包的集合。每個表包含一個或多個“鏈”,這些鏈定義了數據包流經網絡棧的不同點在何處應用這些規則。
-
filter
?表- 用途: 主要用于決定數據包的基本處理,如是否允許數據包通過。
- 包含的鏈:
INPUT
: 處理進入本機的數據包。FORWARD
: 處理經過本機路由到其他網絡的數據包。OUTPUT
: 處理由本機產生的數據包。
-
nat
?表- 用途: 用于網絡地址轉換(NAT),包括源地址和目標地址的轉換,主要用于路由設備。
- 包含的鏈:
PREROUTING
: 用于目標地址轉換(DNAT),處理進入網絡接口的數據包。POSTROUTING
: 用于源地址轉換(SNAT),處理即將離開網絡接口的數據包。OUTPUT
: 對于生成自本地進程的數據包,處理其目標地址轉換。
-
mangle
?表- 用途: 用于修改數據包的服務類型(TOS)字段或其他 IP 頭信息,主要用于特殊的路由標記。
- 包含的鏈:
PREROUTING
: 修改進入網絡接口的數據包。INPUT
: 修改到達本機的數據包。FORWARD
: 修改經過本機的數據包。OUTPUT
: 修改本機產生的數據包。POSTROUTING
: 修改即將離開本機的數據包。
-
raw
?表- 用途: 主要用于配置免除連接跟蹤的數據包,可以用來提高性能。
- 包含的鏈:
PREROUTING
: 設置進入網絡接口前的數據包是否避開狀態跟蹤。OUTPUT
: 設置由本機產生的數據包是否避開狀態跟蹤。
-
security
?表- 用途: 用于設置強制訪問控制網絡規則,通常與 SELinux 安全策略配合使用。
- 包含的鏈:
INPUT
: 設置進入本機的數據包的安全標記。FORWARD
: 設置經過本機的數據包的安全標記。OUTPUT
: 設置本機產生的數據包的安全標記。
鏈 (Chains)
表中的每個鏈代表數據包處理的一個階段。預定義的鏈有:
PREROUTING
: 用于處理進入網絡接口的數據包,主要用于?nat
?和?mangle
?表。INPUT
: 處理到達本機的數據包,用于?filter
,?mangle
, 和?security
?表。FORWARD
: 處理經過本機路由到其他網絡的數據包,用于?filter
,?mangle
, 和?security
?表。OUTPUT
: 處理本機產生的數據包,用于?filter
,?nat
,?mangle
,?raw
, 和?security
?表。POSTROUTING
: 處理即將離開網絡接口的數據包,用于?nat
?和?mangle
?表。
規則 (Rules)
規則定義了對特定條件下的數據包應該執行的操作。每條規則都關聯到一個鏈,規則包含兩個主要部分:
-
匹配條件: 定義了哪些數據包會被規則匹配。匹配條件可以包括多種屬性:
- 源和目標 IP 地址 (
-s
,?-d
) - 源和目標端口 (
--sport
,?--dport
) - 協議類型 (
-p
), 如 TCP (tcp
), UDP (udp
), ICMP (icmp
) - 網絡接口 (
-i
,?-o
) - 更多復雜匹配,如連接狀態 (
-m state --state
), 包大小 (-m length --length
), 時間段 (-m time --timestart
)
- 源和目標 IP 地址 (
-
目標 (Targets): 當規則匹配到一個數據包時,定義了應采取的行動。常見的內置目標有:
ACCEPT
: 允許數據包通過。DROP
: 靜默丟棄數據包,不給發送方任何響應。REJECT
: 拒絕數據包,并向發送方發送一個錯誤響應。LOG
: 記錄數據包的信息,然后繼續處理該數據包。MASQUERADE
: 用于動態 NAT,隱藏數據包的源 IP。REDIRECT
: 修改數據包的目標 IP/端口為本機,用于本地端口重定向。
用戶定義的鏈
用戶可以定義自己的鏈來組織復雜的規則集。這允許更靈活的管理,例如創建一個專用鏈處理特定類型的流量,然后在預定義鏈中調用這個用戶鏈。
二、常用 iptables
命令
iptables
?是一個功能強大的工具,用于在 Linux 上管理網絡包過濾和 NAT 規則。以下是詳細解釋?iptables
?的常用命令和參數,幫助你更好地理解如何使用這個工具。
基本 iptables
命令格式
iptables [option] [chain] [matching criteria] [action]
- [option]: 指定命令的選項,如?
-A
?(添加)、-D
?(刪除)、-L
?(列出) 等。 - [chain]: 指定規則應用于哪個鏈,如?
INPUT
,?FORWARD
,?OUTPUT
?等。 - [matching criteria]: 指定匹配數據包的條件,如?
-p tcp
?(匹配 TCP 協議的數據包)。 - [action]: 指定當匹配到數據包時執行的動作,如?
-j ACCEPT
?(接受數據包)。
查看規則
-
查看所有規則
iptables -L -n -v
-L
: 列出所有規則。-v
: 顯示詳細信息,包括通過每條規則的數據包和字節數。-n
: 使用數字顯示 IP 地址和端口,不進行域名解析,以加快顯示速度。
-
查看特定表的規則
iptables -t nat -L
-t nat
: 指定要查看的表,這里是?nat
?表。
添加規則
-
允許進入的 SSH 連接
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT
: 在?INPUT
?鏈末尾添加規則。-p tcp
: 匹配 TCP 協議的數據包。--dport 22
: 匹配目的端口為 22 的數據包。-j ACCEPT
: 對匹配的數據包執行?ACCEPT
?動作。
-
允許出去的 HTTP 連接
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
-A OUTPUT
: 在?OUTPUT
?鏈末尾添加規則。-p tcp
: 匹配 TCP 協議的數據包。--dport 80
: 匹配目的端口為 80 的數據包。
刪除規則
-
刪除特定的規則
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
-D INPUT
: 從?INPUT
?鏈刪除規則。- 其余參數定義了要刪除的規則的匹配條件和動作。
-
按編號刪除規則
首先,使用?
-L --line-numbers
?查看規則及其編號:iptables -L INPUT -n --line-numbers
然后,根據編號刪除規則:
iptables -D INPUT 1
- 刪除?
INPUT
?鏈中編號為 1 的規則。
- 刪除?
修改規則
-
使用編號修改規則
iptables -R INPUT 1 -p tcp --dport 22 -j DROP
-R INPUT 1
: 在?INPUT
?鏈中替換編號為 1 的規則。-p tcp --dport 22
: 匹配 TCP 協議且目的端口為 22 的數據包。-j DROP
: 新的動作是丟棄數據包。
插入規則
-
在鏈的特定位置插入規則
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
-I INPUT 1
: 在?INPUT
?鏈的第 1 位置插入規則。-p tcp --dport 80
: 匹配 TCP 協議且目的端口為 80 的數據包。
設置默認策略
-
設置鏈的默認策略
iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT
-P INPUT DROP
: 設置?INPUT
?鏈的默認策略為?DROP
。-P FORWARD DROP
: 設置?FORWARD
?鏈的默認策略為?DROP
。-P OUTPUT ACCEPT
: 設置?OUTPUT
?鏈的默認策略為?ACCEPT
。
保存和恢復規則
-
保存當前的規則
iptables-save > /etc/iptables.rules
iptables-save
: 輸出當前的?iptables
?規則。- 重定向到?
/etc/iptables.rules
?文件中保存。
-
從文件恢復規則
iptables-restore < /etc/iptables.rules
iptables-restore
: 從輸入讀取規則并應用。/etc/iptables.rules
: 包含要恢復的規則。
清空規則
-
清空所有規則
iptables -F
-F
: 清空(Flush)所有鏈的所有規則。
-
清空特定表的規則
iptables -t nat -F
-t nat
: 指定清空?nat
?表的規則。
-
刪除所有非默認鏈
iptables -X
-X
: 刪除所有用戶定義的鏈。
端口重定向和 NAT
-
將外部端口 80 重定向到本地的 8080 端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
-t nat
: 在?nat
?表操作。-A PREROUTING
: 在?PREROUTING
?鏈末尾添加規則。-p tcp --dport 80
: 匹配目的端口為 80 的 TCP 數據包。-j REDIRECT --to-port 8080
: 重定向這些數據包到本機的 8080 端口。
-
源 NAT (SNAT): 修改源 IP 地址
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
-A POSTROUTING
: 在?POSTROUTING
?鏈末尾添加規則。-o eth0
: 匹配從?eth0
?網絡接口發出的數據包。-j MASQUERADE
: 對這些數據包執行地址偽裝,常用于動態 IP 地址。
-
目標 NAT (DNAT): 修改目標 IP 地址
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
-A PREROUTING
: 在?PREROUTING
?鏈末尾添加規則。-p tcp --dport 8080
: 匹配目的端口為 8080 的 TCP 數據包。-j DNAT --to-destination 192.168.1.10:80
: 修改數據包的目標 IP 和端口。
高級匹配和限速
-
防止 SSH 爆破攻擊
為了防止 SSH 爆破,我們可以使用?
recent
?模塊來跟蹤來自同一 IP 地址的連接嘗試。如果在指定時間內超過了特定次數的連接嘗試,則暫時拒絕來自該 IP 的連接。iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j DROP
-m state --state NEW
: 只匹配新建連接。-m recent --set
: 對匹配的每個新連接,記錄其信息。-m recent --update
: 更新最近的信息,并檢查條件。--seconds 60
: 指定時間窗口為 60 秒。--hitcount 10
: 如果在 60 秒內同一 IP 嘗試新建連接超過 10 次,則匹配此規則。-j DROP
: 拒絕這些匹配的數據包。
日志記錄
iptables
?支持將匹配的數據包信息記錄到系統日志中,這對于調試和安全監控非常有用。
-
記錄被拒絕的數據包信息
iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
-j LOG
: 使用 LOG 目標記錄數據包信息。--log-prefix "IPTables-Dropped: "
: 指定日志記錄的前綴,便于在日志文件中搜索。--log-level 4
: 指定日志的級別(4 表示 warning 級別)。
狀態檢查
利用?state
?模塊,可以匹配數據包的連接跟蹤狀態,這是構建復雜防火墻規則的基礎。
-
允許基于狀態的數據包傳輸
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-m state --state ESTABLISHED,RELATED
: 匹配狀態為?ESTABLISHED
?或?RELATED
?的數據包。ESTABLISHED
: 表示數據包是屬于已經建立的連接。RELATED
: 表示數據包是與現有的連接相關的(例如,FTP 數據連接)。
時間條件匹配
使用?time
?模塊可以基于時間條件匹配數據包,這可以用于實現基于時間的訪問控制策略。
-
只在工作時間允許 HTTP 訪問
iptables -A INPUT -p tcp --dport 80 -m time --timestart 09:00 --timestop 17:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
-m time
: 使用時間模塊。--timestart 09:00 --timestop 17:00
: 指定允許匹配的開始和結束時間。--weekdays Mon,Tue,Wed,Thu,Fri
: 指定允許匹配的星期幾。
接口匹配
可以根據數據包使用的網絡接口進行匹配。
-
允許來自特定接口的數據包
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
-i eth0
: 只匹配通過?eth0
?網絡接口進入的數據包。-p tcp --dport 80
: 匹配目的端口為 80 的 TCP 數據包。
用戶自定義鏈
用戶可以定義自己的鏈來組織規則,這可以使規則集更加結構化和模塊化。
-
定義和使用自定義鏈
iptables -N LOGGING iptables -A INPUT -j LOGGING iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "Input-Dropped: " iptables -A LOGGING -j DROP
-N LOGGING
: 創建一個名為?LOGGING
?的新鏈。-A LOGGING -m limit --limit 2/min -j LOG
: 在?LOGGING
?鏈中,使用?limit
?模塊限制日志記錄的速率,防止日志文件快速增長。-j DROP
: 在?LOGGING
?鏈的最后,丟棄所有數據包。
保存和加載規則
iptables
?規則默認在系統重啟后不會保存。你需要手動保存規則,并在系統啟動時加載它們。
-
保存規則到文件
iptables-save > /etc/iptables.rules
iptables-save
: 輸出當前的所有?iptables
?規則。>
: 重定向輸出到文件?/etc/iptables.rules
。
-
加載規則從文件
iptables-restore < /etc/iptables.rules
iptables-restore
: 從給定的輸入加載?iptables
?規則。< /etc/iptables.rules
: 從文件?/etc/iptables.rules
?讀取規則。
清空和重置
有時你可能需要清空所有規則,重置?iptables
?到初始狀態。
-
清空所有規則和自定義鏈
iptables -F iptables -X
-F
: 清空所有鏈的所有規則。-X
: 刪除所有用戶定義的鏈。
三、使用場景舉例
使用?iptables
?的場景非常多樣,覆蓋從簡單的主機防火墻到復雜的網絡路由和 NAT 配置。下面是一些具體的使用場景,展示如何利用?iptables
?解決實際問題。
1. 基本的主機防護
在這個場景中,我們利用?iptables
?設置基本的網絡訪問控制,以保護主機不受未授權訪問。
允許特定的服務訪問
假設你想在一臺服務器上開放 SSH (端口 22) 和 HTTP (端口 80) 服務,同時拒絕所有其他未經授權的入站連接。
# 設置默認策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT# 允許本地回環接口
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT# 允許已建立的和相關的連接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT# 允許 SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT# 允許 HTTP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT# Optional: 允許 HTTPS
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
2. 防止 DDoS 攻擊
使用?iptables
?限制單個源 IP 的連接頻率,以防止簡單的 DDoS 攻擊或 SSH 爆破。
限制 SSH 連接嘗試
# 允許每個 IP 每分鐘最多新建 3 個 SSH 連接
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
這種設置能夠有效減少暴力破解 SSH 密碼的風險。
3. 端口轉發
在某些情況下,你可能需要將到達某個端口的流量重定向到另一個端口上,例如將 80 端口的 HTTP 流量轉發到 8080 端口。
將 80 端口轉發到 8080 端口
# 在 nat 表的 PREROUTING 鏈上添加規則
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
這個操作常用于服務器上運行的 Web 應用程序,該程序綁定于非標準端口,而你希望通過標準端口訪問。
4. 網絡地址轉換 (NAT)
在家庭或小型辦公室網絡中,經常需要設置 NAT 來共享訪問互聯網的路徑。以下是一個簡單的源 NAT(SNAT)配置的例子。
共享互聯網訪問
假設?eth1
?是內部網絡接口,eth0
?是連接到互聯網的接口。
# 啟用 IP 轉發
echo 1 > /proc/sys/net/ipv4/ip_forward# 設置 MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE# 允許內部網絡訪問外部
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT# 允許已建立的連接回流
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
這個配置允許內部網絡通過?eth0
?接口訪問外部網絡。
5. 日志和審計
記錄某些類型的網絡活動對于調試和安全監控都是非常有用的。
記錄被拒絕的包
# 記錄被拒絕的入站連接嘗試
iptables -A INPUT -j LOG --log-prefix "IPTables-Input-Denied: " --log-level 4
# 記錄被拒繪的轉發連接嘗試
iptables -A FORWARD -j LOG --log-prefix "IPTables-Forward-Denied: " --log-level 4
這些規則會將所有被?INPUT
?和?FORWARD
?鏈拒絕的嘗試記錄到系統日志中。
6. 使用時間條件控制訪問
在某些環境中,你可能希望基于時間來控制網絡訪問。
在工作時間外允許 SSH 訪問
# 工作時間外允許 SSH
iptables -A INPUT -p tcp --dport 22 -m time --timestart 18:00 --timestop 09:00 -j ACCEPT
這條規則允許在晚上 6:00 到早上 9:00 之間進行 SSH 訪問。
7. 防火墻繞過
在某些情況下,你可能需要臨時開放或關閉防火墻的某些規則,而不是永久修改配置。
臨時開放所有訪問
如果需要臨時允許所有流量(例如,進行某些特殊操作),可以設置:
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT# 清空所有規則
iptables -F
然后,在操作完成后,恢復原來的規則。
8. 防止 ICMP 泛洪攻擊
ICMP 泛洪是一種常見的拒絕服務攻擊方法。
限制 ICMP 回顯請求
# 限制 ICMP echo-request 消息
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
這些規則限制了每秒處理的 ICMP echo 請求(ping 請求)的數量,從而減輕了泛洪的影響。
9. 多網卡策略路由
在擁有多個網絡接口的服務器上,你可能需要根據數據包的來源或目的地來選擇不同的路由。
根據源 IP 使用特定的網絡接口
# 對于從特定源 IP 發出的數據包,使用特定接口
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth1 -j MASQUERADE
這個規則設置了源 NAT,允許從?192.168.100.0/24
?網段出來的數據包通過?eth1
?接口發送。
10. 容器和虛擬化環境
在使用 Docker 或其他容器技術時,經常需要配置?iptables
?來管理和隔離網絡流量。
允許特定容器訪問外部網絡
# 假設容器的虛擬網絡接口是 veth1234
iptables -t nat -A POSTROUTING -s 172.17.0.2/32 -o eth0 -j MASQUERADE
這條規則允許 IP 地址為?172.17.0.2
?的容器通過?eth0
?接口訪問外部網絡。
通過這些場景,你可以看到?iptables
?的多樣性和強大功能,它能夠滿足從簡單到復雜的多種網絡需求。