Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Linux 防火牆白名單實戰:iptables 精準放行指定 IP 存取核心埠

編輯:Linux 系統常見問題解答

生產資料庫(3306)、管理介面(22、4750)絕不可裸奔全網。本文示範如何用 iptables 建立「白名單鏈」,僅允許受信 IP 存取敏感埠,其餘一律拒絕,並提供持久化、驗證與自動化腳本。

核心邏輯

INPUT → RH-Firewall-1-INPUT → whitelist 鏈(信任 IP → ACCEPT) → 其他規則 → REJECT

完整規則範例(/etc/sysconfig/iptables)

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]

# 1. 建立白名單鏈
-N whitelist
-A whitelist -s 10.202.106.1 -j ACCEPT
-A whitelist -s 10.202.106.2 -j ACCEPT
-A whitelist -s 10.202.106.3 -j ACCEPT
-A whitelist -s 10.202.106.4 -j ACCEPT
-A whitelist -s 10.202.106.5 -j ACCEPT
-A whitelist -s 10.202.106.6 -j ACCEPT
-A whitelist -s 10.202.106.7 -j ACCEPT

# 2. 主鏈引用
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT

# 3. 基礎放行
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT   # ESP
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT   # AH
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT  # mDNS
-A RH-Firewall-1-INPUT -p udp --dport 631 -j ACCEPT                   # IPP
-A RH-Firewall-1-INPUT -p tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 4. 公開服務(全網可存)
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 4750 -j ACCEPT

# 5. 敏感埠 → 白名單鏈
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j whitelist

# 6. 預設拒絕
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT

關鍵指令解析

-N whitelist-A whitelist -s 10.202.106.1 -j ACCEPT-A RH-Firewall-1-INPUT ... --dport 3306 -j whitelist-m state --state NEW--reject-with icmp-host-prohibited
指令作用
建立使用者自訂鏈
將信任 IP 加入白名單鏈
針對 3306 埠跳轉至白名單鏈判斷
僅匹配新連線(非 ESTABLISHED/RELATED)
回傳 ICMP 管理禁止,比 DROP 更利於客戶端快速失敗

動態管理白名單(不重載整張規則)

# 新增信任 IP
iptables -A whitelist -s 10.202.106.100 -j ACCEPT

# 刪除信任 IP(按行號)
iptables -L whitelist --line-numbers
iptables -D whitelist 3

# 查看白名單命中統計
iptables -L whitelist -n -v
# pkts bytes target prot opt in out source destination
#   12  720 ACCEPT all  --  *  *  10.202.106.1  0.0.0.0/0

持久化與自動化

CentOS 7 / RHEL 7(iptables-service)

service iptables save
# 或
iptables-save > /etc/sysconfig/iptables

systemd 服務單元

cat > /etc/systemd/system/iptables-whitelist.service <<'EOF'
[Unit]
Description=Load iptables whitelist rules
Before=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/sbin/iptables-restore /etc/sysconfig/iptables
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl enable iptables-whitelist

白名單自動同步腳本(從 CMDB/API 拉取)

#!/bin/bash
# sync_whitelist.sh — 每 5 分鐘跑一次
API="https://cmdb.internal/api/allowed_ips?service=mysql"
CHAIN="whitelist"

# 1. 取得最新清單(每行一個 IP/CIDR)
mapfile -t NEW_IPS < <(curl -sf "$API" | jq -r '.[]')

# 2. 取得當前規則
mapfile -t CUR_IPS < <(iptables -S $CHAIN | grep '^-A' | awk '{print $4}')

# 3. 計算差集
add_ips=(); del_ips=()
for ip in "${NEW_IPS[@]}"; do [[ " ${CUR_IPS[*]} " =~ " $ip " ]] || add_ips+=("$ip"); done
for ip in "${CUR_IPS[@]}"; do [[ " ${NEW_IPS[*]} " =~ " $ip " ]] || del_ips+=("$ip"); done

# 4. 應用變更
for ip in "${add_ips[@]}"; do iptables -A $CHAIN -s "$ip" -j ACCEPT; logger "whitelist + $ip"; done
for ip in "${del_ips[@]}"; do iptables -D $CHAIN -s "$ip" -j ACCEPT; logger "whitelist - $ip"; done

# 5. 持久化
iptables-save > /etc/sysconfig/iptables

驗證清單

  • ✅ iptables -L whitelist -n -v 看到預期 IP 與封包計數
  • ✅ 白名單 IP mysql -h -u... 連線成功
  • ✅ 非白名單 IP telnet 3306 顯示 Connection refused 或 ICMP 禁止
  • ✅ 重啟機器後 iptables -L 規則依然存在

結語: 「預設拒絕、白名單放行」是資料庫、管理埠的鐵律。用獨立鏈隔離白名單規則,配合動態同步腳本,即可實現「人員異動即時生效、審計有據、重啟不丟」的企業級防火牆治理。

Copyright © Windows教程網 All Rights Reserved