目錄
1. 工作原理?
2. 核心架構(四表五鏈)
2.1?四張表(優先級從高到低)
2.2 五條內置鏈(數據包流向)
3. Iptables規則
3.1 規則的匹配條件與目標動作
常見匹配條件(用于篩選數據包)
常見目標動作(滿足條件后對數據包的處理)
3.2 規則的匹配順序與默認策略
4. 操作命令
5. 工作流程
6. 常見案例
6.1 基礎防火墻配置(只允許必要服務)
6.2 端口轉發(將外部 80 端口轉發到內部服務器 192.168.8.8:8080)
6.3 共享上網(局域網通過網關訪問公網,網關公網 IP 為 88.88.88.88)
6.4 刪除指定表指定鏈的規則
6.5 日志記錄
6.6 防暴力破解(限制 SSH 連接頻率)
6.7 禁止特定 IP / 網段訪問
6.8 只允許特定 IP 訪問敏感端口
6.9 單向通信控制(如禁止外部 ping 本機,但本機可 ping 外部)
6.10?保存與恢復規則
6.11 清空與重置規則
7. 高級應用案例
7.1 精細化流量控制與狀態管理
場景:企業內網多區域隔離與訪問控制
7.2 帶寬限制與流量整形(結合?tc)
場景:限制非核心業務(如下載)的帶寬,保障核心服務(如數據庫)
7.3 高級 NAT 應用(端口復用、雙向 NAT)
1. 端口復用(一個公網端口映射到內網多個服務)
2. 雙向 NAT(內外網 IP 雙向轉換)
7.4 透明代理與流量劫持
場景:強制內網所有 HTTP 流量經過代理服務器(10.0.0.10:3128)
7.5 入侵檢測與自動防御(結合腳本)
場景:自動封禁 10 分鐘內 SSH 失敗超過 5 次的 IP
7.6 特定協議的深度過濾(如 FTP、DNS)
場景:允許 FTP 服務(支持主動 / 被動模式)
7.7 容器與虛擬化環境的網絡隔離
場景:限制 Docker 容器只能訪問特定外網 IP
7.8 高可用集群中的規則同步
1. 工作原理?
????????iptables 是 Linux 系統中一款經典的防火墻管理工具,它通過操作內核中的?Netfilter?框架(Linux 內核的數據包處理引擎),實現對網絡數據包的過濾、轉發、地址轉換等功能。簡單來說,Netfilter 是內核中負責 “干活” 的組件,而 iptables 是用戶空間中用于 “指揮” Netfilter 的工具。
2. 核心架構(四表五鏈)
2.1?四張表(優先級從高到低)
表名 | 功能描述 | 典型應用場景 |
---|---|---|
raw | 連接跟蹤(conntrack)前的預處理 | 禁用連接追蹤(NOTRACK ) |
mangle | 修改數據包(TTL、TOS、MARK等) | 流量標記(QoS)、拆包重組 |
nat | 網絡地址轉換(SNAT/DNAT) | 端口轉發、IP 偽裝(MASQUERADE) |
filter | 包過濾(允許/拒絕/丟棄) | 防火墻規則 |
2.2 五條內置鏈(數據包流向)
鏈名 | 觸發時機 |
---|---|
PREROUTING | 數據包進入網卡后、路由決策前(raw → mangle → nat) |
INPUT | 路由決策后,目標是本機的數據包(mangle → filter) |
FORWARD | 路由決策后,目標非本機的數據包(mangle → filter) |
OUTPUT | 本機進程發出的數據包(raw → mangle → nat → filter) |
POSTROUTING | 數據包離開網卡前(mangle → nat) |
3. Iptables規則
對數據包的具體處理邏輯,規則是鏈中的 “指令”,每條規則由匹配條件和目標動作兩部分組成:
- 匹配條件:定義數據包的特征(如源 IP、目的端口、協議等)。
- 目標動作:滿足條件時對數據包的處理方式(如允許、拒絕、修改地址等)。
3.1 規則的匹配條件與目標動作
常見匹配條件(用于篩選數據包)
-
基本匹配條件(無需額外模塊,直接使用):
-s 源IP
:指定數據包的源 IP(如?-s 192.168.1.100
)。-d 目標IP
:指定數據包的目標 IP(如?-d 8.8.8.8
)。-p 協議
:指定協議(如?-p tcp
、-p udp
、-p icmp
)。--sport 源端口
:指定源端口(僅用于 TCP/UDP,如?--sport 80
)。--dport 目標端口
:指定目標端口(如?--dport 22
,表示 SSH 端口)。-i 入站網卡
:數據包進入的網卡(如?-i eth0
)。-o 出站網卡
:數據包離開的網卡(如?-o eth1
)。
-
擴展匹配條件(需加載擴展模塊,用?
-m 模塊名
?指定):- 多端口匹配(
-m multiport
):如?--dports 80,443
(匹配 80 或 443 端口)。 - IP 范圍匹配(
-m iprange
):如?--src-range 192.168.1.1-192.168.1.10
(源 IP 在該范圍)。 - 狀態匹配(
-m state
):如?--state NEW,ESTABLISHED
(匹配新連接或已建立的連接)。
- 多端口匹配(
常見目標動作(滿足條件后對數據包的處理)
- ACCEPT:允許數據包通過,繼續后續流程。
- DROP:直接丟棄數據包,不返回任何響應(對方會等待超時)。
- REJECT:拒絕數據包,并返回 “拒絕” 響應(如 ICMP 不可達),對方能立即知道被拒絕。
- SNAT:修改數據包的源 IP(源地址轉換),常用于局域網共享上網(如?
--to-source 公網IP
)。 - DNAT:修改數據包的目的 IP 或端口(目的地址轉換),常用于端口轉發(如?
--to-destination 192.168.1.2:8080
)。 - MASQUERADE:動態 SNAT(適用于公網 IP 不固定的場景,如 ADSL 撥號,無需指定具體 IP)。
- LOG:將數據包信息記錄到系統日志(
/var/log/messages
),不影響數據包處理(需配合其他動作使用)。
3.2 規則的匹配順序與默認策略
- 匹配順序:鏈中的規則按 “從上到下” 依次匹配,一旦匹配成功,立即執行對應動作,不再檢查后續規則。因此,規則的順序至關重要(如 “允許 SSH” 需放在 “拒絕所有” 之前)。
- 默認策略:當數據包不匹配鏈中任何規則時,執行的默認動作(用?
-P
?設置)。例如:iptables -t filter -P INPUT DROP
(filter 表 INPUT 鏈默認拒絕所有未匹配的數據包)。
4. 操作命令
操作目的 | 命令示例 |
---|---|
查看規則(默認 filter 表) | iptables -L (詳細信息加?-v ,顯示編號加?--line-numbers ) |
查看指定表的規則 | iptables -t nat -L (查看 nat 表規則) |
添加規則(末尾) | iptables -A INPUT -p tcp --dport 22 -j ACCEPT (允許 SSH 入站) |
插入規則(指定位置) | iptables -I INPUT 1 -p icmp -j ACCEPT (在 INPUT 鏈第 1 位允許 ping) |
刪除規則(按編號) | iptables -D INPUT 2 (刪除 INPUT 鏈第 2 條規則) |
清空所有規則 | iptables -F (清空當前表,指定表加?-t 表名 ) |
設置默認策略 | iptables -P OUTPUT ACCEPT (OUTPUT 鏈默認允許) |
保存規則(CentOS) | service iptables save (保存到?/etc/sysconfig/iptables ) |
恢復規則(Ubuntu) | iptables-restore < /etc/iptables.rules (從文件恢復) |
5. 工作流程
-
規則匹配順序:
-
按表優先級:
raw → mangle → nat → filter
-
按鏈內順序:從上到下逐條匹配,命中即執行動作(
ACCEPT/DROP/REJECT
等)
-
-
默認策略:鏈末尾的?
POLICY
(如?INPUT DROP
)
6. 常見案例
6.1 基礎防火墻配置(只允許必要服務)
# 設置默認策略(INPUT/Forward 拒絕,OUTPUT 允許)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT# 允許已建立的連接(避免影響現有通信)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT# 允許本地回環(避免影響本機服務通信)
iptables -A INPUT -i lo -j ACCEPT# 允許 SSH 連接(端口 22,限制來源 IP 更安全)
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT # 僅允許內網 SSH
# 若需公網訪問,替換為:iptables -A INPUT -p tcp --dport 22 -j ACCEPT# 允許 HTTP/HTTPS 服務(Web 服務器)
iptables -A INPUT -p tcp --dports 80,443 -j ACCEPT# 允許 ICMP 協議(允許 ping 本機)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
6.2 端口轉發(將外部 80 端口轉發到內部服務器 192.168.8.8:8080)
# 開啟內核轉發(臨時生效,重啟失效)
echo 1 > /proc/sys/net/ipv4/ip_forward# 在 nat 表 PREROUTING 鏈設置 DNAT(修改目的地址)
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.8.8:8080# 允許轉發流量(filter 表 FORWARD 鏈)
iptables -A FORWARD -p tcp -d 192.168.8.8 --dport 8080 -j ACCEPT
6.3 共享上網(局域網通過網關訪問公網,網關公網 IP 為 88.88.88.88)
# 開啟內核轉發
echo 1 > /proc/sys/net/ipv4/ip_forward# 在 nat 表 POSTROUTING 鏈設置 SNAT(修改源地址為網關公網 IP)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 88.88.88.88
# 若公網 IP 不固定(如撥號),用 MASQUERADE 替代 SNAT:
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
6.4 刪除指定表指定鏈的規則
[root@lmzf ~]# iptables -t raw -L Bitdefender-80-out --line-numbers
# Warning: iptables-legacy tables present, use iptables-legacy to see them
Chain Bitdefender-80-out (0 references)
num target prot opt source destination
1 NFQUEUE tcp -- anywhere anywhere tcp dpt:http flags:FIN,SYN,RST,ACK/SYN ! owner GID match bitdefender NFQUEUE num 0
[root@lmzf ~]# iptables -t raw -D Bitdefender-80-out 1
[root@lmzf ~]# iptables -t raw -L Bitdefender-80-out --line-numbers
# Warning: iptables-legacy tables present, use iptables-legacy to see them
6.5 日志記錄
為了監控和調試目的,你可能希望記錄某些類型的流量。可以使用 LOG
目標來記錄匹配的數據包。例如,記錄所有嘗試ping本機的行為:
iptables -A INPUT -p icmp --icmp-type echo-request -j LOG --log-prefix "ICMP packet: "
監控特定流量
# 記錄所有訪問 22 端口的流量(日志存于 /var/log/messages)
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH_ACCESS: " --log-level info# 記錄被拒絕的數據包(便于排查攻擊)
iptables -A INPUT -j LOG --log-prefix "DROPPED_PACKET: " --log-level warning
6.6 防暴力破解(限制 SSH 連接頻率)
# 限制每分鐘最多 10 次 SSH 連接,突發不超過 3 次
iptables -A INPUT -p tcp --dport 22 -m limit --limit 10/min --limit-burst 3 -j ACCEPT
# 超過限制的連接直接丟棄
iptables -A INPUT -p tcp --dport 22 -j DROP
6.7 禁止特定 IP / 網段訪問
# 禁止單個 IP(10.0.0.5)訪問本機
iptables -A INPUT -s 10.0.0.5 -j DROP# 禁止整個網段(192.168.2.0/24)訪問本機 80 端口
iptables -A INPUT -s 192.168.2.0/24 -p tcp --dport 80 -j DROP
6.8 只允許特定 IP 訪問敏感端口
# 僅允許管理員 IP(10.0.0.100)訪問 MySQL 端口(3306)
iptables -A INPUT -s 10.0.0.100 -p tcp --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP # 拒絕其他所有 IP
6.9 單向通信控制(如禁止外部 ping 本機,但本機可 ping 外部)
# 禁止外部 ping 本機(拒絕 ICMP 請求)
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP# 允許本機 ping 外部(不限制 ICMP 響應)
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT # 允許響應包進入
6.10?保存與恢復規則
# 保存規則(CentOS)
service iptables save # 保存到 /etc/sysconfig/iptables# 保存規則(通用方式)
iptables-save > /etc/iptables.rules# 恢復規則
iptables-restore < /etc/iptables.rules
6.11 清空與重置規則
# 清空所有規則(默認表)
iptables -F# 清空指定表的規則(如 nat 表)
iptables -t nat -F# 重置鏈的默認策略(如 INPUT 鏈恢復為 ACCEPT)
iptables -P INPUT ACCEPT
7. 高級應用案例
7.1 精細化流量控制與狀態管理
基于連接狀態(state
?模塊)和更細粒度的匹配條件,實現復雜業務邏輯的流量管控,適用于多服務、多網段的復雜網絡環境。
場景:企業內網多區域隔離與訪問控制
例如,將內網劃分為 “辦公區”“服務器區”“DMZ 區”,通過 iptables 實現:
- 僅允許辦公區訪問服務器區的特定服務(如 MySQL 3306 端口),且需驗證源 IP 和連接狀態;
- 禁止服務器區主動訪問辦公區,但允許辦公區發起的 “已建立連接”(如服務器響應辦公區的查詢);
- DMZ 區(如 Web 服務器)僅允許公網訪問 80/443 端口,且僅能主動訪問服務器區的特定接口(如數據庫查詢)。
核心配置思路:
# 1. 創建自定義鏈(簡化規則管理)
iptables -N OFFICE_TO_SERVER # 辦公區到服務器區的規則鏈
iptables -N DMZ_TO_SERVER # DMZ到服務器區的規則鏈# 2. 辦公區(192.168.1.0/24)到服務器區(10.0.0.0/24)的規則
iptables -A OFFICE_TO_SERVER -s 192.168.1.0/24 -d 10.0.0.0/24 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OFFICE_TO_SERVER -j DROP # 默認拒絕其他流量# 3. DMZ區(172.16.0.0/24)到服務器區的規則(僅允許特定接口)
iptables -A DMZ_TO_SERVER -s 172.16.0.0/24 -d 10.0.0.0/24 -p tcp --dport 3306 -m state --state ESTABLISHED -j ACCEPT # 僅允許響應
iptables -A DMZ_TO_SERVER -j DROP# 4. 將自定義鏈掛到 FORWARD 鏈
iptables -A FORWARD -i eth1 -o eth2 -j OFFICE_TO_SERVER # eth1=辦公區網卡,eth2=服務器區網卡
iptables -A FORWARD -i eth0 -o eth2 -j DMZ_TO_SERVER # eth0=DMZ區網卡
7.2 帶寬限制與流量整形(結合?tc
)
iptables 本身不直接支持帶寬限制,但可與 Linux 流量控制工具?tc
(traffic control)協同,通過標記數據包(mark
?模塊),讓?tc
?對標記的流量進行限速或整形。
場景:限制非核心業務(如下載)的帶寬,保障核心服務(如數據庫)
實現思路:
- 用 iptables 標記非核心業務的數據包(如端口 8080 的下載流量);
- 用?
tc
?對標記的數據包設置帶寬上限(如 1Mbps)。
配置示例:
# 1. iptables 標記下載流量(mark 值為 100)
iptables -t mangle -A PREROUTING -p tcp --dport 8080 -j MARK --set-mark 100# 2. tc 對標記 100 的流量限速(假設出口網卡為 eth0)
tc qdisc add dev eth0 root handle 1: htb default 10
tc class add dev eth0 parent 1: classid 1:10 htb rate 1000Mbps # 總帶寬
tc class add dev eth0 parent 1:10 classid 1:100 htb rate 1Mbps # 下載流量上限
tc filter add dev eth0 parent 1: protocol ip prio 1 handle 100 fw flowid 1:100 # 匹配 mark=100
7.3 高級 NAT 應用(端口復用、雙向 NAT)
超出基礎端口轉發的復雜 NAT 場景,適用于公網 IP 有限或需隱藏內網拓撲的場景。
1. 端口復用(一個公網端口映射到內網多個服務)
例如,公網 IP 的 443 端口同時映射到內網的 Web 服務器(443)和郵件服務器(993),通過 “源 IP 匹配” 區分流量:
# 公網 IP:203.0.113.1
# 規則:來自 1.2.3.4 的 443 請求轉發到內網 Web 服務器(192.168.1.10:443)
iptables -t nat -A PREROUTING -d 203.0.113.1 -s 1.2.3.4 -p tcp --dport 443 -j DNAT --to 192.168.1.10:443
# 其他 IP 的 443 請求轉發到郵件服務器(192.168.1.20:993)
iptables -t nat -A PREROUTING -d 203.0.113.1 -p tcp --dport 443 -j DNAT --to 192.168.1.20:993
2. 雙向 NAT(內外網 IP 雙向轉換)
適用于內網與外部網絡存在 IP 沖突的場景(如內網和合作方內網均使用 192.168.1.0/24),通過雙向轉換避免沖突:
# 外部訪問內網:將外部請求的目的 IP(203.0.113.100)轉換為內網 IP(192.168.1.5)
iptables -t nat -A PREROUTING -d 203.0.113.100 -j DNAT --to 192.168.1.5
# 內網響應外部:將內網源 IP(192.168.1.5)轉換為外部可見 IP(203.0.113.100)
iptables -t nat -A POSTROUTING -s 192.168.1.5 -j SNAT --to 203.0.113.100
7.4 透明代理與流量劫持
將特定流量(如 HTTP/HTTPS)透明轉發到代理服務器(如 Squid、Nginx),用戶無需手動配置代理,適用于企業上網審計、廣告過濾等場景。
場景:強制內網所有 HTTP 流量經過代理服務器(10.0.0.10:3128)
# 1. 開啟內核轉發
echo 1 > /proc/sys/net/ipv4/ip_forward# 2. 攔截內網 HTTP 流量(80 端口),轉發到代理服務器
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 80 -j DNAT --to 10.0.0.10:3128# 3. 允許代理服務器響應內網(避免被默認策略拒絕)
iptables -A FORWARD -s 10.0.0.10 -d 192.168.1.0/24 -p tcp --sport 3128 -j ACCEPT
7.5 入侵檢測與自動防御(結合腳本)
通過 iptables 日志記錄異常流量,結合腳本實時分析并自動添加封禁規則,抵御掃描、暴力破解等攻擊。
場景:自動封禁 10 分鐘內 SSH 失敗超過 5 次的 IP
實現思路:
- iptables 記錄 SSH 失敗日志(如密碼錯誤);
- 定時腳本(如?
cron
)分析日志,統計失敗次數; - 對超閾值的 IP 自動添加 iptables DROP 規則。
核心配置:
# 1. 記錄 SSH 失敗日志(假設 SSH 服務日志含 "Failed password")
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH_FAILED: "# 2. 檢測腳本(示例,需保存為 /usr/local/bin/ban_ssh.sh 并添加執行權限)
#!/bin/bash
# 提取 10 分鐘內失敗次數 >5 的 IP
awk '/SSH_FAILED/ && /Failed password/ {print $11}' /var/log/messages | grep -oE '([0-9]+\.){3}[0-9]+' | sort | uniq -c | awk '$1>5 {print $2}' | while read ip; do# 若未封禁則添加規則if ! iptables -C INPUT -s $ip -j DROP >/dev/null 2>&1; theniptables -A INPUT -s $ip -j DROPecho "Banned $ip at $(date)" >> /var/log/ssh_ban.logfi
done# 3. 添加 cron 任務(每 5 分鐘執行一次)
echo "*/5 * * * * root /usr/local/bin/ban_ssh.sh" >> /etc/crontab
7.6 特定協議的深度過濾(如 FTP、DNS)
針對多端口或動態端口協議(如 FTP、SIP),結合 iptables 擴展模塊(如?ip_conntrack_ftp
)實現精準控制。
場景:允許 FTP 服務(支持主動 / 被動模式)
FTP 主動模式使用 21 端口控制連接,數據連接由服務器主動發起(端口 20);被動模式數據端口隨機,需內核跟蹤動態端口:
# 1. 加載 FTP 連接跟蹤模塊
modprobe ip_conntrack_ftp# 2. 允許 FTP 控制連接(21 端口)
iptables -A INPUT -p tcp --dport 21 -j ACCEPT# 3. 允許 FTP 數據連接(依賴跟蹤模塊自動識別動態端口)
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
7.7 容器與虛擬化環境的網絡隔離
在 Docker、KVM 等虛擬化環境中,通過 iptables 控制宿主機與容器、容器之間的網絡訪問,彌補虛擬化平臺自帶防火墻的不足。
場景:限制 Docker 容器只能訪問特定外網 IP
Docker 會自動創建?DOCKER
?鏈,可在其上附加規則:
# 1. 清空 Docker 轉發鏈(避免默認放通)
iptables -F FORWARD# 2. 允許容器(172.17.0.0/16)訪問特定 IP(8.8.8.8)
iptables -A FORWARD -s 172.17.0.0/16 -d 8.8.8.8 -j ACCEPT# 3. 允許已建立的連接響應
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT# 4. 默認拒絕其他轉發流量
iptables -P FORWARD DROP
7.8 高可用集群中的規則同步
在主備架構(如 Keepalived 雙機熱備)中,通過腳本或工具(如?csync2
)同步 iptables 規則,確保主備切換時防火墻策略一致。
示例流程:
- 主節點修改規則后,通過?
iptables-save > /etc/iptables.rules
?保存; - 用?
csync2
?將規則文件同步到備節點; - 備節點通過?
iptables-restore < /etc/iptables.rules
?加載規則; - 結合?
inotify
?監控文件變化,實現實時同步。