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)文章
Ubuntu交換區(qū)(Swap)擴容實現(xiàn)方式
本文介紹了如何在Linux系統(tǒng)中調(diào)整Swap分區(qū)和Swap文件的大小,包括關(guān)閉當前Swap、刪除舊的Swap、創(chuàng)建新的Swap(文件或分區(qū))、格式化新Swap、啟用新Swap、驗證新Swap狀態(tài)以及編輯fstab文件以確保新Swap在開機時自動掛載2026-02-02
UNEXPECTED INCONSISTENCY: RUN fsck MANUALLY
這篇文章主要介紹了UNEXPECTED INCONSISTENCY: RUN fsck MANUALLY,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07

