整理一份正在使用的防火墙配置脚本
服务器环境: 常规Centos8
项目有使用Docker容器, 存在互联多主机
强制使用白名单防护
食用方式
1. 先停止firewalld(如果有)
systemctl stop firewalld
2. 禁止firewalld自启动
systemctl disable firewalld
3. 安装iptables
rpm -Uvh iptables*.rpm
4. 启用iptables
systemctl enable iptables
systemctl start iptables
systemctl status iptables
5. 重启docker服务(如果有)
systemctl restart docker
6. 添加ip白名单, 执行脚本
chmod +x iptables.sh
sh iptables.shiptables.sh脚本内容如下:
#!/bin/bash
echo "[INFO] 初始化 iptables 防火墙规则..."
# ===== 清空主要链,但保留 DOCKER/DOCKER-USER 等特殊链 =====
iptables -F INPUT
iptables -F FORWARD
iptables -F OUTPUT
# 如果存在就清空,不存在就忽略
# 不清 DOCKER 链,避免影响 Docker 网络
iptables -F DOCKER-USER 2>/dev/null || true
iptables -t nat -F PREROUTING
iptables -t nat -F POSTROUTING
iptables -t nat -F OUTPUT
# 将docker0及其子网的出网流量封包为宿主机ip, 根据实际情况修改docker0虚拟网卡ip
iptables -t nat -A POSTROUTING -s 172.16.0.0/12 -j MASQUERADE
# ===== 设置默认策略 =====
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# ===== 基本规则 =====
iptables -A INPUT -i lo -j ACCEPT # 允许本地回环
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 允许放行已建立的连接
# ===== SSH 端口(永远放行)=====
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# ===== 容器访问宿主机 & 容器互联:允许常见 Docker bridge 网段 =====
for subnet in {17..31}; do
iptables -A INPUT -s 172.$subnet.0.0/16 -j ACCEPT
iptables -A FORWARD -s 172.$subnet.0.0/16 -j ACCEPT
done
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# ===== 白名单配置 =====
WHITELIST=(
"192.168.234.59"
"192.168.51.171"
"192.168.101.158"
)
for ip in "${WHITELIST[@]}"; do
iptables -A INPUT -p tcp -s "$ip" --dport 80:30000 -j ACCEPT
done
# ===== 明确拒绝其他访问(可选,实际 DROP 策略已经生效)=====
iptables -A INPUT -j DROP
iptables -A FORWARD -j DROP
# ===== 持久化配置 =====
service iptables save
# ===== 显示结果 =====
echo "[INFO] iptables 配置完成,当前规则如下:"
iptables -L -n -v --line-numbers