#!/bin/bash
# iptables_hardening.sh
# 執行前請確認當前 SSH 端口已在允許列表,否則會斷開連接
IPT=/sbin/iptables
# 1. 清空現有規則
$IPT -F
$IPT -X
$IPT -Z
$IPT -t nat -F
$IPT -t mangle -F
# 2. 設定預設策略(先設 ACCEPT 避免鎖死,最後再改 DROP)
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
# 3. 基礎信任鏈
$IPT -A INPUT -i lo -j ACCEPT # 本地回環
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已建立/相關連接
$IPT -A OUTPUT -j ACCEPT # 本機向外全放行
# 4. 防掃描規則(放在最前,匹配即丟棄)
$IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP # Nmap FIN/URG/PSH (Xmas)
$IPT -A INPUT -p tcp --tcp-flags ALL ALL -j DROP # Xmas Tree
$IPT -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP # Another Xmas
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # Null Scan
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP # SYN/RST
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP # SYN/FIN
# 5. SYN Flood 防護(限流)
$IPT -N SYN_FLOOD
$IPT -A SYN_FLOOD -p tcp --syn -m limit --limit 1/s --limit-burst 4 -j RETURN
$IPT -A SYN_FLOOD -p tcp -j REJECT --reject-with tcp-reset
$IPT -A INPUT -p tcp -m state --state NEW -j SYN_FLOOD
# 6. Ping of Death / ICMP Flood 防護
$IPT -N BAD_PING
$IPT -A BAD_PING -p icmp --icmp-type echo-request -m limit --limit 1/s -j RETURN
$IPT -A BAD_PING -p icmp -j REJECT
$IPT -A INPUT -p icmp --icmp-type echo-request -m state --state NEW -j BAD_PING
# 7. 業務端口放行(按需修改)
$IPT -A INPUT -p tcp --dport 22 -j ACCEPT # SSH (建議改非標準端口)
$IPT -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
$IPT -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
$IPT -A INPUT -p tcp --dport 3306 -s 10.0.0.0/8 -j ACCEPT # MySQL 僅內網
$IPT -A INPUT -p tcp --dport 6379 -s 10.0.0.0/8 -j ACCEPT # Redis 僅內網
# 多端口合寫
$IPT -A INPUT -p tcp -m multiport --dports 80,443,8080 -j ACCEPT
# 8. 允許 DNS 回應 (UDP 53)
$IPT -A INPUT -p udp --sport 53 -j ACCEPT
# 9. 設定最終預設拒絕
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
# 10. 保存規則
service iptables save # CentOS 6/7
# 或
iptables-save > /etc/sysconfig/iptables # 通用
echo "Rules applied. Current filter table:"
$IPT -L -n -v --line-numbers
IP6T=/sbin/ip6tables
$IP6T -F; $IP6T -X; $IP6T -Z
$IP6T -P INPUT ACCEPT; $IP6T -P OUTPUT ACCEPT; $IP6T -P FORWARD ACCEPT
$IP6T -A INPUT -i lo -j ACCEPT
$IP6T -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IP6T -A INPUT -p ipv6-icmp -j ACCEPT # IPv6 鄰居發現等依賴 ICMPv6,建議全放行或精細放行
$IP6T -A INPUT -p tcp --dport 22 -j ACCEPT
$IP6T -A INPUT -p tcp --dport 80 -j ACCEPT
$IP6T -A INPUT -p tcp --dport 443 -j ACCEPT
$IP6T -P INPUT DROP; $IP6T -P FORWARD DROP
service ip6tables save
nmap -sS -p 1-65535 YOUR_IP 應只見開放端口。hping3 -S -p 80 --flood YOUR_IP 測試 SYN Flood 限流(需授權環境)。ping -f YOUR_IP 測試 ICMP 限流。yum install iptables-services && systemctl enable --now iptables。apt install iptables-persistent,規則存放 /etc/iptables/rules.v4 / rules.v6。此模板涵蓋「掃描識別、SYN Flood 限流、ICMP 限流、業務放行、默認拒絕」五大核心防護面。實際部署時請根據資產清單精細化端口與來源 IP 白名單,並定期審計規則冗餘與衝突。