Linux之iptables命令的使用方式
iptables命令:作用與常用參數(shù)
1. iptables 的作用
iptables
是 Linux 系統(tǒng)上最常用的 防火墻工具,用于配置內(nèi)核的 netfilter 包過濾框架,主要功能包括:
- 包過濾(Packet Filtering):允許/拒絕網(wǎng)絡(luò)數(shù)據(jù)包(如防火墻規(guī)則)。
- 網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT):實現(xiàn) SNAT(源地址轉(zhuǎn)換)、DNAT(目標地址轉(zhuǎn)換)。
- 端口轉(zhuǎn)發(fā)(Port Forwarding):將外部請求轉(zhuǎn)發(fā)到內(nèi)部服務(wù)器。
- 流量統(tǒng)計(Traffic Accounting):記錄數(shù)據(jù)包和字節(jié)計數(shù)。
- 流量整形(Traffic Shaping):結(jié)合
tc
實現(xiàn) QoS。
2. iptables 的 5 個關(guān)鍵鏈(Chains)
iptables
規(guī)則基于 表(Tables) 和 鏈(Chains) 組織,默認有 5 個鏈:
鏈名 | 作用 |
---|---|
INPUT | 處理 進入本機 的數(shù)據(jù)包(如 SSH、HTTP 請求)。 |
OUTPUT | 處理 從本機發(fā)出 的數(shù)據(jù)包(如 ping、curl 請求)。 |
FORWARD | 處理 經(jīng)過本機路由 的數(shù)據(jù)包(如網(wǎng)關(guān)服務(wù)器)。 |
PREROUTING | 在路由決策前修改數(shù)據(jù)包(DNAT、端口轉(zhuǎn)發(fā))。 |
POSTROUTING | 在數(shù)據(jù)包離開前修改源地址(SNAT、MASQUERADE)。 |
3. iptables 的 4 個核心表(Tables)
表名 | 作用 |
---|---|
filter | 默認表,用于包過濾(允許/拒絕流量)。 |
nat | 用于網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)。 |
mangle | 修改數(shù)據(jù)包內(nèi)容(如 TTL、TOS)。 |
raw | 繞過連接跟蹤(conntrack),用于高性能場景。 |
4. iptables 常用參數(shù)
(1)通用參數(shù)
參數(shù) | 作用 |
---|---|
-t <表名> | 指定操作的表(如 -t nat、-t filter,默認 filter)。 |
-A <鏈名> | 追加 規(guī)則到鏈尾(如 -A INPUT)。 |
-I <鏈名> [規(guī)則號] | 插入 規(guī)則到鏈首或指定位置(如 -I INPUT 2)。 |
-D <鏈名> <規(guī)則號> | 刪除 指定規(guī)則(如 -D INPUT 3)。 |
-L | 列出 規(guī)則(-L INPUT 查看特定鏈)。 |
-F | 清空 鏈中的所有規(guī)則(-F INPUT 清空 INPUT 鏈)。 |
-P <鏈名> <動作> | 設(shè)置鏈的默認策略(如 -P INPUT DROP)。 |
-v | 顯示詳細信息(如數(shù)據(jù)包計數(shù) pkts 和字節(jié) bytes)。 |
-n | 禁用 DNS 反向解析,加快輸出速度。 |
(2)規(guī)則匹配參數(shù)
參數(shù) | 作用 |
---|---|
-p <協(xié)議> | 匹配協(xié)議(如 -p tcp、-p udp、-p icmp)。 |
--dport <端口> | 匹配目標端口(需配合 -p tcp/udp,如 --dport 80)。 |
--sport <端口> | 匹配源端口(如 --sport 22)。 |
-s <IP> | 匹配源 IP(如 -s 192.168.1.100)。 |
-d <IP> | 匹配目標 IP(如 -d 10.0.0.1)。 |
-i <網(wǎng)卡> | 匹配輸入網(wǎng)卡(如 -i eth0)。 |
-o <網(wǎng)卡> | 匹配輸出網(wǎng)卡(如 -o wlan0)。 |
-m <模塊> | 使用擴展模塊(如 -m state --state ESTABLISHED)。 |
(3)動作(Target)參數(shù)
參數(shù) | 作用 |
---|---|
-j ACCEPT | 允許數(shù)據(jù)包通過。 |
-j DROP | 丟棄數(shù)據(jù)包(無響應(yīng))。 |
-j REJECT | 拒絕數(shù)據(jù)包(返回 ICMP 拒絕消息)。 |
-j LOG | 記錄日志(/var/log/messages)。 |
-j DNAT | 目標地址轉(zhuǎn)換(如 -j DNAT --to-destination 192.168.1.2:80)。 |
-j SNAT | 源地址轉(zhuǎn)換(如 -j SNAT --to-source 1.2.3.4)。 |
-j MASQUERADE | 動態(tài) SNAT(適用于撥號或 DHCP 獲取 IP)。 |
5. 常用示例
(1)查看規(guī)則
iptables -L -n -v # 查看 filter 表規(guī)則(默認) iptables -t nat -L -n -v # 查看 nat 表規(guī)則 iptables -L INPUT -n -v # 查看 INPUT 鏈規(guī)則
(2)允許/拒絕流量
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允許 SSH iptables -A INPUT -p tcp --dport 80 -j DROP # 拒絕 HTTP iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 允許局域網(wǎng)訪問
(3)NAT 與端口轉(zhuǎn)發(fā)
# SNAT(內(nèi)網(wǎng)機器通過網(wǎng)關(guān)訪問外網(wǎng)) iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # DNAT(將外網(wǎng) 80 端口轉(zhuǎn)發(fā)到內(nèi)網(wǎng) 192.168.1.2) iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.1.2:80
(4)保存與恢復(fù)規(guī)則
iptables-save > /etc/iptables.rules # 保存規(guī)則 iptables-restore < /etc/iptables.rules # 恢復(fù)規(guī)則
心得:
iptables 核心功能:包過濾、NAT、端口轉(zhuǎn)發(fā)、流量統(tǒng)計。
關(guān)鍵表與鏈:filter
、nat
、mangle
、raw
+ INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING
。
高頻參數(shù):
-A
(追加規(guī)則)、-I
(插入規(guī)則)、-D
(刪除規(guī)則)。-p
(協(xié)議)、--dport
(端口)、-s/-d
(IP)。-j ACCEPT/DROP/REJECT/DNAT/SNAT
。
進階建議:
- 學(xué)習(xí)
nftables
(iptables
的下一代替代品)。 - 使用
fail2ban
動態(tài)封禁惡意 IP。 - 結(jié)合
conntrack
監(jiān)控連接狀態(tài)。
iptables 頻繁查詢對系統(tǒng)性能的影響及優(yōu)化建議
頻繁執(zhí)行該命令可能會對系統(tǒng)性能(尤其是 DNS 服務(wù)器)造成負面影響
1. iptables -t nat -nvL 的 CPU 開銷
1.1 命令執(zhí)行過程
iptables -t nat -nvL
是一個只讀查詢命令,主要功能是:
- 遍歷
nat
表的所有規(guī)則(DNAT/SNAT 等)。 - 計算并顯示每個規(guī)則的 數(shù)據(jù)包計數(shù)(pkts) 和 字節(jié)計數(shù)(bytes)。
1.2 CPU 資源占用分析
規(guī)則遍歷開銷:
- 如果
nat
表規(guī)則較多(如數(shù)千條),每次執(zhí)行iptables -nvL
都需要遍歷整個規(guī)則鏈,消耗 CPU 時間。
原子計數(shù)器讀取:
iptables
的pkts/bytes
計數(shù)器是原子變量(atomic),內(nèi)核需要安全讀取這些值,可能觸發(fā) CPU 緩存同步(尤其在多核系統(tǒng)上)。
1.3 對 DNS 服務(wù)器的影響
DNS 服務(wù)器(如 BIND、CoreDNS)通常是 CPU 密集型 服務(wù),依賴快速處理 UDP 查詢。如果 iptables -nvL
高頻執(zhí)行(如每秒多次),可能導(dǎo)致:
- CPU 時間片爭搶:DNS 工作線程的 CPU 時間被
iptables
占用。 - 查詢延遲增加:DNS 響應(yīng)時間從毫秒級上升,甚至觸發(fā)客戶端超時重試,進一步加劇負載。
示例量化分析:
- 假設(shè)
nat
表有 1000 條規(guī)則,單次iptables -nvL
耗時 5ms。 - 每秒執(zhí)行 10 次 → 占用 50ms CPU 時間/秒(約 5% 單核 CPU)。
- 在 高負載 DNS 服務(wù)器 上,額外 5% CPU 占用可能導(dǎo)致 尾延遲(P99)顯著上升。
2. iptables 的內(nèi)核鎖競爭問題
2.1 xtables 鎖機制
iptables
通過內(nèi)核的 xt_table
鎖(互斥鎖) 保護規(guī)則表的讀寫一致性:
- 讀操作(如
iptables -L
)和 寫操作(如iptables -A
)會競爭同一把鎖。 - 舊版內(nèi)核(< 5.3)使用全局鎖,所有
iptables
操作串行化,即使只是查詢也會阻塞規(guī)則更新。
2.2 鎖競爭對 DNS 的影響
如果 DNS 服務(wù)器與 iptables
規(guī)則管理運行在同一臺機器上,可能出現(xiàn):
DNS 線程阻塞:
- 當
iptables -nvL
執(zhí)行時,若后臺有腳本修改規(guī)則(如iptables -A
),查詢線程會被阻塞,直到鎖釋放。 - 表現(xiàn):DNS 查詢延遲波動(如 P99 從 10ms 升至 100ms)。
極端情況:丟包或超時:
- 若規(guī)則更新極頻繁(如 Kubernetes
kube-proxy
動態(tài)調(diào)整規(guī)則),iptables -L
可能長時間阻塞,甚至導(dǎo)致 DNS 查詢超時。
如何檢測鎖競爭?
# 使用 perf 監(jiān)控 xtables 鎖等待(需內(nèi)核支持) perf probe -a 'xt_table_lock' perf stat -e 'probe:xt_table_lock' -a sleep 10
3. 優(yōu)化建議
3.1 降低查詢頻率
避免每秒多次查詢,改為 每分鐘 1 次 或 僅在需要時執(zhí)行:
# 示例:Crontab 每分鐘記錄一次 * * * * * /sbin/iptables -t nat -nvL >> /var/log/iptables-nat.log
3.2 使用更高效的工具
改用 nftables
(現(xiàn)代 Linux 默認防火墻,鎖機制更高效):
nft list table ip nat # 替代 iptables -t nat -nvL
使用 conntrack
監(jiān)控連接狀態(tài)(避免遍歷規(guī)則):
conntrack -L -j # 以 JSON 格式顯示 NAT 會話
3.3 優(yōu)化系統(tǒng)環(huán)境
減少 iptables
規(guī)則規(guī)模:
- 合并冗余規(guī)則,使用
ipset
優(yōu)化大型規(guī)則集。
分離關(guān)鍵服務(wù):
- 將 DNS 服務(wù)器與
iptables
管理節(jié)點隔離,避免資源競爭。
監(jiān)控與告警:
- 使用
htop
、dstat
觀察 CPU 和鎖競爭情況:
dstat -tc --top-cpu # 查看 CPU 占用最高的進程
心得:
問題 | 影響 | 解決方案 |
---|---|---|
CPU 占用高 | DNS 查詢延遲增加,可能超時 | 降低查詢頻率,改用 nftables |
內(nèi)核鎖競爭 | DNS 線程阻塞,響應(yīng)變慢或丟包 | 減少規(guī)則規(guī)模,分離 DNS 與防火墻節(jié)點 |
I/O 壓力 | 日志寫入沖突,可能耗盡磁盤 | 限制日志大小,使用 logrotate |
最終建議
- 偶爾查詢
iptables -t nat -nvL
無影響,但避免高頻執(zhí)行。 - 長期優(yōu)化:遷移到
nftables
,提升查詢效率并減少鎖競爭。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
environments was not found on the java.library.path 問題的解決方法
The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path 問題的解決方法,需要的朋友可以參考下2016-08-08Windows Apache2.4 VC9(ApacheHaus)詳細安裝配置教程
這篇文章主要介紹了Windows Apache2.4 VC9(ApacheHaus)詳細安裝配置教程,需要的朋友可以參考下2017-09-09linux 下jenkins項目搭建過程(centos7為例 )
本文以centos7為例給大家介紹linux 下jenkins項目搭建過程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2020-10-10Linux+php+apache+oracle環(huán)境搭建之CentOS下安裝Oracle數(shù)據(jù)庫
研究了兩天Linux下安裝Oracle,重裝了兩次虛擬機,終于安裝成功。很有收獲的。記錄下安裝過程。大神們?nèi)缬懈玫姆绞?,請?lián)系我!2014-08-08jmeter 在linux服務(wù)器的安裝和運行教程圖解
本文通過圖文并茂的形式給大家介紹了jmeter 在linux服務(wù)器的安裝和運行的,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-07-07如何從windows上傳數(shù)據(jù)到linux上
本文介紹了如何使用WinSCP將數(shù)據(jù)從Windows上傳到Linux系統(tǒng),重點是Linux的基礎(chǔ)知識和實驗環(huán)境(Windows 11專業(yè)版,Kali Linux 2024),通過直接拖拽文件的方式,可以方便快捷地完成數(shù)據(jù)傳輸2024-12-12解決-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 權(quán)限不夠問題
這篇文章主要介紹了解決-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 權(quán)限不夠的問題,需要的朋友可以參考下2019-09-09