萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux iptables 防火牆 IP 封鎖完整指南:單一 IP、IP 段、CIDR 封鎖與持久化

iptables 精準封鎖惡意 IP 完整實戰手冊

面對暴力破解、惡意爬蟲、DDoS 攻擊,iptables 提供核心層級的封包過濾能力。本文系統講解單一 IP、CIDR 網段、地理位置封鎖語法,並詳細說明規則持久化、優先序管理、解封操作與自動化防護策略。

核心封鎖語法速查

目標指令範例說明
單一 IPv4iptables -I INPUT -s 203.0.113.45 -j DROP插入 INPUT 鏈首位,直接丟棄
單一 IPv6ip6tables -I INPUT -s 2001:db8::1 -j DROPIPv6 專用指令
CIDR 網段iptables -I INPUT -s 198.51.100.0/24 -j DROP/24 = 256 IP,/16 = 65536 IP,/8 = 1677 萬 IP
多個離散 IPiptables -I INPUT -m multiport --src 192.0.2.1,192.0.2.5,192.0.2.10 -j DROPmultiport 模組單條規則匹配多源
特定埠封鎖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 / iptables-restore(標準做法)


# 儲存當前規則
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

方案二:systemd 服務單元自建


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

進階:自動化封鎖腳本

Fail2Ban 整合(推薦生產環境)


# 安裝
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

自腳本:分析日誌自動封鎖高頻攻擊 IP


#!/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

地理位置封鎖(GeoIP)


# 安裝 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

最佳實踐總結

  1. 預設拒絕策略: iptables -P INPUT DROP,再逐項放行必要服務
  2. 狀態檢測: iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 放行已建立連線
  3. 分組管理: 建立自訂鏈 iptables -N BLACKLIST,封鎖規則統一跳轉,便於批次管理
  4. 定期審計: 每週匯出規則 iptables-save 版本控管
  5. 監控告警: 整合 Prometheus node_exporter 監控 iptables_rejected_packets_total

結語

iptables 封鎖是「療標」手段,根治需結合應用層 WAF、CDN 清洗、SSH 金鑰認證、Fail2Ban 自動化防暴力破解。建立「封鎖-審計-溯源-修補」閉環,才能構建立體防禦體系。

copyright © 萬盛學電腦網 all rights reserved