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 工作線程的 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 線程阻塞:
- 當(dāng)
iptables -nvL執(zhí)行時(shí),若后臺(tái)有腳本修改規(guī)則(如iptables -A),查詢(xú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 線程阻塞,響應(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)鏈接庫(kù)使用類(lèi)模板的快速排序算法
這篇文章主要介紹了Linux下編譯使用靜態(tài)鏈接庫(kù)-當(dāng)靜態(tài)鏈接庫(kù)遇到模板類(lèi)的快速算法問(wèn)題。2017-11-11
apache啟用gzip壓縮的實(shí)現(xiàn)方法
對(duì)于部署在Linux服務(wù)器上的PHP程序,在服務(wù)器支持的情況下,我們建議你開(kāi)啟使用Gzip Web壓縮,以前腳本之家介紹了iis中的開(kāi)啟方法,這篇文章主要介紹了linux中apache的開(kāi)啟方法2013-06-06
Ubuntu交換區(qū)(Swap)擴(kuò)容實(shí)現(xiàn)方式
本文介紹了如何在Linux系統(tǒng)中調(diào)整Swap分區(qū)和Swap文件的大小,包括關(guān)閉當(dāng)前Swap、刪除舊的Swap、創(chuàng)建新的Swap(文件或分區(qū))、格式化新Swap、啟用新Swap、驗(yàn)證新Swap狀態(tài)以及編輯fstab文件以確保新Swap在開(kāi)機(jī)時(shí)自動(dòng)掛載2026-02-02
xampp apache啟動(dòng)失效問(wèn)題的解決方法
在windows上使用xampp搭建php的開(kāi)發(fā)環(huán)境,后來(lái)又安裝了oracle 10g。2009-10-10
Linux持續(xù)集成自動(dòng)化安裝Maven的方法
今天小編就為大家分享一篇關(guān)于Linux持續(xù)集成自動(dòng)化安裝Maven的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-03-03
UNEXPECTED INCONSISTENCY: RUN fsck MANUALLY
這篇文章主要介紹了UNEXPECTED INCONSISTENCY: RUN fsck MANUALLY,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07

