面對暴力破解、惡意爬蟲、DDoS 攻擊,iptables 提供核心層級的封包過濾能力。本文系統講解單一 IP、CIDR 網段、地理位置封鎖語法,並詳細說明規則持久化、優先序管理、解封操作與自動化防護策略。
| 目標 | 指令範例 | 說明 |
|---|---|---|
| 單一 IPv4 | iptables -I INPUT -s 203.0.113.45 -j DROP | 插入 INPUT 鏈首位,直接丟棄 |
| 單一 IPv6 | ip6tables -I INPUT -s 2001:db8::1 -j DROP | IPv6 專用指令 |
| CIDR 網段 | iptables -I INPUT -s 198.51.100.0/24 -j DROP | /24 = 256 IP,/16 = 65536 IP,/8 = 1677 萬 IP |
| 多個離散 IP | iptables -I INPUT -m multiport --src 192.0.2.1,192.0.2.5,192.0.2.10 -j DROP | multiport 模組單條規則匹配多源 |
| 特定埠封鎖 | iptables -I INPUT -s 203.0.113.45 -p tcp --dport 22 -j DROP | 僅封鎖該 IP 的 SSH 存取 |
| 記錄後丟棄 | iptables -I INPUT -s 203.0.113.45 -j LOG --log-prefix "BLOCKED: " && iptables -I INPUT -s 203.0.113.45 -j DROP | 雙規則:先記錄再丟棄,便於審計 |
-I INPUT(大寫 I):插入鏈首位,最高優先級-I INPUT 3:插入第 3 條規則之前-A INPUT(大寫 A):附加至鏈末尾,優先級最低-I INPUT 確保優先匹配;允許規則用 -A INPUT 放在封鎖規則之後
# 帶行號顯示(刪除必備)
iptables -L INPUT -n --line-numbers
# 顯示完整資訊(含封包/位元組計數)
iptables -L INPUT -n -v --line-numbers
# 僅顯示特定鏈
iptables -L FORWARD -n --line-numbers
# IPv6 對應
ip6tables -L INPUT -n --line-numbers
# 1. 確認行號
iptables -L INPUT -n --line-numbers
# 輸出範例:
# num target prot opt source destination
# 1 DROP all -- 203.0.113.45 0.0.0.0/0
# 2. 刪除第 1 條規則
iptables -D INPUT 1
iptables -D INPUT -s 203.0.113.45 -j DROP
iptables -F INPUT # 僅清空 INPUT 鏈
iptables -F # 清空所有鏈
# 儲存當前規則
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
# 開機自動載入(需安裝 iptables-persistent 或自建 systemd 服務)
# Debian/Ubuntu:
apt-get install iptables-persistent
# 安裝過程會詢問是否儲存當前規則,選 Yes
# CentOS/RHEL 7+(firewalld 共存場景)
yum install iptables-services
systemctl enable iptables
# 規則檔位於 /etc/sysconfig/iptables
cat > /etc/systemd/system/iptables-restore.service << 'EOF'
[Unit]
Description=Restore iptables rules
Before=network-pre.target
Wants=network-pre.target
[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/iptables/rules.v4
ExecStart=/sbin/ip6tables-restore /etc/iptables/rules.v6
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable iptables-restore
# 安裝
yum install fail2ban # 或 apt-get install fail2ban
# 配置 /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
action = iptables-multiport[name=sshd, port="ssh", protocol=tcp]
systemctl enable --now fail2ban
#!/bin/bash
# auto-block.sh - 每 5 分鐘由 cron 執行
LOG_FILE="/var/log/auth.log"
THRESHOLD=10
BAN_TIME=86400 # 24 小時
grep "Failed password" "$LOG_FILE" | \
awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | \
while read count ip; do
if [ "$count" -ge "$THRESHOLD" ]; then
# 檢查是否已封鎖
if ! iptables -C INPUT -s "$ip" -j DROP 2>/dev/null; then
iptables -I INPUT -s "$ip" -j DROP
logger "Auto-blocked $ip (failed attempts: $count)"
fi
fi
done
# 同步持久化
iptables-save > /etc/iptables/rules.v4
# 安裝 xtables-addons(含 geoip 模組)
yum install xtables-addons # 需 EPEL
# 或從源碼編譯
# 下載 GeoIP 資料庫
/usr/lib/xtables-addons/xt_geoip_dl
/usr/lib/xtables-addons/xt_geoip_build GeoIPCountryWhois.csv
# 封鎖中國大陸 IP(範例)
iptables -I INPUT -m geoip --src-cc CN -j DROP
iptables -P INPUT DROP,再逐項放行必要服務iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 放行已建立連線iptables -N BLACKLIST,封鎖規則統一跳轉,便於批次管理iptables-save 版本控管iptables_rejected_packets_totaliptables 封鎖是「療標」手段,根治需結合應用層 WAF、CDN 清洗、SSH 金鑰認證、Fail2Ban 自動化防暴力破解。建立「封鎖-審計-溯源-修補」閉環,才能構建立體防禦體系。