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