Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

iptables 防火牆配置完全指南:從基礎規則到 NAT、防掃描、抗 DDoS 進階實戰

編輯:關於伺服器

iptables 是 Linux 核心 Netfilter 框架的使用者空間管理工具,掌握其配置是 Linux 伺服器安全的核心技能。本文系統整理 filter 表 (存取控制)、nat 表 (地址轉換)、mangle 表 (封包標記) 核心應用場景,提供生產級規則集範本,涵蓋 預設拒絕策略、狀態檢測、埠敲門、防掃描、SYN Flood 緩解、NAT 閘道、透明代理 等實戰需求。

核心概念速覽

表鏈用途
filterINPUT, FORWARD, OUTPUT存取控制 (防火牆核心)
natPREROUTING, POSTROUTING, OUTPUTDNAT/SNAT/REDIRECT (地址/埠轉換)
mangle所有鏈TOS/TTL/Mark 修改 (策略路由、QoS)
rawPREROUTING, OUTPUT連線追蹤豁免 (NOTRACK)

規則匹配順序: 同一鏈內**由上而下**順序匹配,首條匹配生效。**預設政策 (Policy)** 在無規則匹配時生效。

生產級 filter 表規則集範本 (/etc/sysconfig/iptables 或 iptables-save 輸出)

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# === 自定義鏈:提高可讀性與效能 ===
:LOG_DROP - [0:0]
:SYN_FLOOD - [0:0]
:PORT_SCAN - [0:0]

# === 通用通用允許 ===
# 本地回環介面 (關鍵!缺少會導致本地服務異常)
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

# 已建立/相關連線 (狀態檢測核心)
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# ICMP 必需類型 (允許 ping、MTU 發現、重導向)
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 5 -j ACCEPT
-A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
-A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
-A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT

# === 公開服務埠 (根據實際業務調整) ===
# SSH (建議修改非 22 埠,並限制來源 IP)
-A INPUT -p tcp -m tcp --dport 2222 -m state --state NEW -m recent --name SSH_ATTACK --set
-A INPUT -p tcp -m tcp --dport 2222 -m state --state NEW -m recent --name SSH_ATTACK --update --seconds 60 --hitcount 4 -j LOG_DROP
-A INPUT -p tcp -m tcp --dport 2222 -m state --state NEW -j ACCEPT

# HTTP/HTTPS
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT

# MySQL (僅內網存取)
-A INPUT -s 10.0.0.0/8 -p tcp -m tcp --dport 3306 -m state --state NEW -j ACCEPT
-A INPUT -s 192.168.0.0/16 -p tcp -m tcp --dport 3306 -m state --state NEW -j ACCEPT

# DNS (若本機跑權威/遞歸 DNS)
# -A INPUT -p udp -m udp --dport 53 -j ACCEPT
# -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT

# === 防掃描與異常封包 ===
# 針對新連線非 SYN 封包 (可能掃描/攻擊)
-A INPUT -p tcp ! --syn -m state --state NEW -j LOG_DROP

# 碎片封包限速
-A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

# 針對常見惡意埠 (Back Orifice, NetBus, SubSeven 等)
-A INPUT -p tcp -m multiport --dports 31337,27444,27665,20034,9704,12345,12346 -j LOG_DROP

# === SYN Flood 緩解 (簡易版,大流量需上層防護) ===
-A INPUT -p tcp --syn -m state --state NEW -j SYN_FLOOD
-A SYN_FLOOD -m limit --limit 200/s --limit-burst 300 -j RETURN
-A SYN_FLOOD -j LOG_DROP

# === 埠敲門 (Port Knocking) 範例:敲 1000→2000→3000 開放 SSH 10 秒 ===
# -A INPUT -p tcp --dport 1000 -m recent --name KNOCK1 --set -j DROP
# -A INPUT -p tcp --dport 2000 -m recent --name KNOCK1 --rcheck --seconds 10 -m recent --name KNOCK2 --set -j DROP
# -A INPUT -p tcp --dport 3000 -m recent --name KNOCK2 --rcheck --seconds 10 -m recent --name KNOCK3 --set -j DROP
# -A INPUT -p tcp --dport 2222 -m recent --name KNOCK3 --rcheck --seconds 10 -j ACCEPT

# === 記錄並丟棄 (統一出口) ===
-A LOG_DROP -m limit --limit 10/min -j LOG --log-prefix "IPT_DROP: " --log-level 4
-A LOG_DROP -j DROP

# === 無效狀態封包 ===
-A INPUT -m state --state INVALID -j LOG_DROP
-A FORWARD -m state --state INVALID -j LOG_DROP
-A OUTPUT -m state --state INVALID -j LOG_DROP

COMMIT

NAT 表配置範本 (閘道/伺服器映射)

*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# === SNAT: 內網機器出網 (eth0 外網卡, eth1 內網卡) ===
-A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# 或固定公網 IP
# -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.10

# === DNAT: 公開內網 Web 伺服器 (80/443) ===
-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
-A PREROUTING -i eth0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.1.10:443
# 對應 FORWARD 鏈需允許
# -A FORWARD -i eth0 -o eth1 -d 192.168.1.10 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
# -A FORWARD -i eth0 -o eth1 -d 192.168.1.10 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT

# === 透明代理 (REDIRECT 本機埠) ===
# -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-ports 3128

# === 防止外網用內網 IP 欺騙 (PREROUTING 入口過濾) ===
-A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
-A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
-A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP
-A PREROUTING -i eth0 -s 127.0.0.0/8 -j DROP
-A PREROUTING -i eth0 -s 169.254.0.0/16 -j DROP
-A PREROUTING -i eth0 -s 224.0.0.0/4 -j DROP
-A PREROUTING -i eth0 -s 240.0.0.0/4 -j DROP

COMMIT

規則持久化與管理

  • CentOS/RHEL 7+: service iptables save (存至 /etc/sysconfig/iptables),systemctl enable iptables
  • Debian/Ubuntu: apt-get install iptables-persistent,規則存 /etc/iptables/rules.v4
  • 通用: iptables-save > /etc/iptables.rules,啟動腳本 iptables-restore < /etc/iptables.rules
  • 動態管理工具: firewalld (RHEL 7+ 預設)、ufw (Ubuntu)、shorewall、ferm —— 生產環境建議使用聲明式工具而非手寫規則。

進階防護:ipset + iptables 應對大量 IP 封禁

當封禁 IP 達千上萬條,逐條 iptables 規則效能極差。使用 ipset 建立哈希集合,單條規則匹配集合:

ipset create blacklist hash:ip maxelem 1000000
ipset add blacklist 1.2.3.4
ipset add blacklist 5.6.7.8
# 批量匯入
cat bad_ips.txt | xargs -I{} ipset add blacklist {}

iptables -I INPUT -m set --match-set blacklist src -j DROP

配合 fail2ban action ipset 實現高效能動態封禁。

常見錯誤與避坑

錯誤後果正確做法
遠端配置時先設 INPUT DROP 再加 SSH 允許規則瞬間斷線,鎖在外面先加允許規則,再設政策;或用 iptables -I INPUT 1 ... 插入首條
缺少 -i lo -j ACCEPT本地服務互訪失敗 (MySQL localhost、Redis、PHP-FPM socket)永遠首條加入 loopback 允許
只設 filter 表,FORWARD DROP 但未開啟轉發NAT/閘道功能不生效echo 1 > /proc/sys/net/ipv4/ip_forward 永久寫入 /etc/sysctl.conf
規則順序錯誤 (如 ESTABLISHED 在 DROP 之後)正常回包被丟棄,連線中斷ESTABLISHED/RELATED 永遠放在最前面
不儲存規則直接重啟規則全部丟失配置持久化工具/服務

iptables 是雙面刃:配得好是堅不可摧的盾,配不好把自己關在門外。**生產環境建議:聲明式工具 + 版本控制 + CI/CD 部署 + 分級測試 (測試環境 → 預發 → 生產)**。掌握核心邏輯 (狀態檢測、預設拒絕、最小權限),再配合 ipset/fail2ban/云防火牆,構建纏深防禦體系。

Copyright © Windows教程網 All Rights Reserved