生產資料庫(3306)、管理介面(22、4750)絕不可裸奔全網。本文示範如何用 iptables 建立「白名單鏈」,僅允許受信 IP 存取敏感埠,其餘一律拒絕,並提供持久化、驗證與自動化腳本。
INPUT → RH-Firewall-1-INPUT → whitelist 鏈(信任 IP → ACCEPT) → 其他規則 → REJECT
*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
| 指令 | 作用 |
|---|---|
| 建立使用者自訂鏈 | |
| 將信任 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
service iptables save
# 或
iptables-save > /etc/sysconfig/iptables
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
#!/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 與封包計數mysql -h -u... 連線成功telnet 3306 顯示 Connection refused 或 ICMP 禁止iptables -L 規則依然存在結語: 「預設拒絕、白名單放行」是資料庫、管理埠的鐵律。用獨立鏈隔離白名單規則,配合動態同步腳本,即可實現「人員異動即時生效、審計有據、重啟不丟」的企業級防火牆治理。