1. Linux 防火墙基础概念
1.1 防火墙的重要性
在当今的网络环境中,防火墙是保护系统安全的第一道防线。它通过控制网络流量进出系统,有效阻止未经授权的访问和恶意攻击。
1.2 iptables 与 firewalld 的关系
iptables 是 Linux 内核中网络包过滤系统的用户空间工具,而 firewalld 是基于 iptables 的高级管理工具,提供了更友好的动态管理接口。
2. iptables 配置详解
2.1 iptables 基础架构
graph TB
A[网络数据包] --> B{iptables 链选择}
B --> C[INPUT 链]
B --> D[FORWARD 链]
B --> E[OUTPUT 链]
C --> F{INPUT 规则匹配}
F --> G[规则1: 允许SSH]
F --> H[规则2: 允许HTTP]
F --> I[规则3: 默认拒绝]
G --> J[接受]
H --> J
I --> K[拒绝]
D --> L{FORWARD 规则匹配}
L --> M[规则1: 允许转发]
L --> N[规则2: 默认拒绝]
M --> O[接受]
N --> P[拒绝]
E --> Q{OUTPUT 规则匹配}
Q --> R[规则1: 允许所有]
R --> S[接受]
style A fill:#e1f5fe
style J fill:#c8e6c9
style K fill:#ffcdd2
style O fill:#c8e6c9
style P fill:#ffcdd2
style S fill:#c8e6c9
style G fill:#4fc3f7
style H fill:#4fc3f7
style I fill:#ff9800
style M fill:#4fc3f7
style N fill:#ff9800
style R fill:#4fc3f7
2.2 创建基础 iptables 配置文件
创建文件: /root/iptables-basic-setup.sh
bash
#!/bin/bash
# iptables 基础防火墙配置脚本
# 作者:Linux 系统管理员
# 描述:配置基本的防火墙规则,保护服务器安全
echo "开始配置 iptables 防火墙..."
# 1. 清除所有现有规则
echo "步骤1: 清除所有现有规则"
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# 2. 设置默认策略
echo "步骤2: 设置默认策略"
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 3. 允许本地回环接口
echo "步骤3: 配置本地回环接口规则"
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 4. 允许已建立的连接和相关的连接
echo "步骤4: 允许已建立的连接"
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 5. 允许 SSH 连接 (端口22)
echo "步骤5: 配置 SSH 访问规则"
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
# 6. 允许 HTTP 和 HTTPS 访问
echo "步骤6: 配置 Web 服务访问规则"
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
# 7. 允许 ICMP (ping)
echo "步骤7: 配置 ICMP 规则"
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# 8. 记录被拒绝的数据包
echo "步骤8: 配置日志记录规则"
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROPPED: " --log-level 4
# 9. 显示规则列表
echo "步骤9: 显示当前规则"
iptables -L -v
echo "iptables 基础配置完成!"
echo "请注意:当前 SSH 连接不会被中断,但新连接将受规则限制。"
2.3 创建高级 iptables 配置
创建文件: /root/iptables-advanced-setup.sh
bash
#!/bin/bash
# iptables 高级防火墙配置脚本
# 包含端口限制、连接限制和攻击防护
echo "开始配置高级 iptables 防火墙..."
# 清除现有规则
iptables -F
iptables -X
# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 1. 基础规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 2. 保护 against 常见攻击
echo "配置常见攻击防护..."
# 2.1 防止 SYN 洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# 2.2 防止 ping 洪水攻击
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
# 2.3 防止端口扫描
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# 3. 服务端口配置
echo "配置服务端口..."
# 3.1 SSH 保护 - 限制连接频率
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 3.2 Web 服务
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
# 3.3 数据库服务 (MySQL)
iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT
# 3.4 自定义应用端口
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -p tcp --dport 8443 -j ACCEPT
# 4. 时间限制规则示例
echo "配置时间限制规则..."
# 允许办公时间访问特定服务 (9:00-18:00)
iptables -A INPUT -p tcp --dport 9090 -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
# 5. 地理限制示例 (需要 xt_geoip 模块)
# iptables -A INPUT -p tcp --dport 80 -m geoip --src-cc CN,US,JP -j ACCEPT
# 6. 记录被拒绝的连接
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
# 保存规则
echo "保存规则..."
service iptables save
# 显示最终规则
echo "最终防火墙规则:"
iptables -L -v -n
echo "高级 iptables 配置完成!"
2.4 创建 iptables 持久化脚本
创建文件: /root/iptables-persistent-setup.sh
bash
#!/bin/bash
# iptables 规则持久化配置脚本
echo "配置 iptables 规则持久化..."
# 检查系统类型
if [ -f /etc/redhat-release ]; then
# CentOS/RHEL 系统
echo "检测到 CentOS/RHEL 系统"
# 安装 iptables-services
yum install -y iptables-services
# 保存当前规则
iptables-save > /etc/sysconfig/iptables
# 启用服务
systemctl enable iptables
systemctl start iptables
echo "规则已保存到 /etc/sysconfig/iptables"
elif [ -f /etc/debian_version ]; then
# Debian/Ubuntu 系统
echo "检测到 Debian/Ubuntu 系统"
# 安装 iptables-persistent
apt-get update
apt-get install -y iptables-persistent
# 保存规则
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
echo "规则已保存到 /etc/iptables/rules.v4"
else
echo "未知的系统类型,请手动保存规则。"
echo "可以使用: iptables-save > /path/to/iptables.rules"
exit 1
fi
# 创建备份
BACKUP_DIR="/root/iptables-backup"
mkdir -p $BACKUP_DIR
iptables-save > $BACKUP_DIR/iptables-backup-$(date +%Y%m%d-%H%M%S).rules
echo "iptables 持久化配置完成!"
echo "备份文件保存在: $BACKUP_DIR"
3. firewalld 配置详解
3.1 firewalld 核心概念
graph TB
A[firewalld 守护进程] --> B[运行时配置]
A --> C[永久配置]
B --> D[立即生效]
B --> E[重启后丢失]
C --> F[重启后生效]
C --> G[需要重载]
H[防火墙规则] --> I[ Zones 区域 ]
H --> J[ Services 服务 ]
H --> K[ Ports 端口 ]
H --> L[ Rich Rules 富规则 ]
I --> M[public]
I --> N[internal]
I --> O[dmz]
I --> P[trusted]
J --> Q[ssh]
J --> R[http]
J --> S[https]
K --> T[端口转发]
K --> U[直接规则]
L --> V[复杂规则]
L --> W[源地址限制]
L --> X[时间限制]
style A fill:#1565c0
style I fill:#00796b
style J fill:#d84315
style K fill:#6a1b9a
style L fill:#ff8f00
style M fill:#4caf50
style N fill:#4caf50
style O fill:#4caf50
style P fill:#4caf50
3.2 基础 firewalld 配置脚本
创建文件: /root/firewalld-basic-setup.sh
bash
#!/bin/bash
# firewalld 基础配置脚本
echo "开始配置 firewalld 防火墙..."
# 1. 启动和启用 firewalld
echo "步骤1: 启动 firewalld 服务"
systemctl start firewalld
systemctl enable firewalld
# 2. 检查 firewalld 状态
echo "步骤2: 检查服务状态"
firewall-cmd --state
systemctl status firewalld --no-pager -l
# 3. 查看默认区域
echo "步骤3: 查看当前区域配置"
firewall-cmd --get-default-zone
firewall-cmd --get-active-zones
# 4. 配置默认区域为 public
echo "步骤4: 配置默认区域"
firewall-cmd --set-default-zone=public
# 5. 添加基本服务
echo "步骤5: 添加基本服务到防火墙"
# 5.1 SSH 服务
firewall-cmd --permanent --add-service=ssh
echo "添加 SSH 服务"
# 5.2 HTTP 服务
firewall-cmd --permanent --add-service=http
echo "添加 HTTP 服务"
# 5.3 HTTPS 服务
firewall-cmd --permanent --add-service=https
echo "添加 HTTPS 服务"
# 6. 移除不需要的服务 (示例)
echo "步骤6: 移除不需要的服务"
firewall-cmd --permanent --remove-service=dhcpv6-client 2>/dev/null || true
# 7. 添加自定义端口
echo "步骤7: 添加自定义端口"
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --permanent --add-port=8443/tcp
echo "添加端口 8080/tcp 和 8443/tcp"
# 8. 配置富规则 (Rich Rules)
echo "步骤8: 配置富规则"
# 8.1 限制 SSH 访问来源
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept'
echo "限制 SSH 访问来源为 192.168.1.0/24"
# 8.2 拒绝其他所有流量
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" service name="ssh" drop'
echo "拒绝其他来源的 SSH 访问"
# 9. 重载防火墙配置
echo "步骤9: 重载防火墙配置"
firewall-cmd --reload
# 10. 验证配置
echo "步骤10: 验证防火墙配置"
echo "当前区域服务:"
firewall-cmd --list-services
echo "当前区域端口:"
firewall-cmd --list-ports
echo "富规则:"
firewall-cmd --list-rich-rules
echo "firewalld 基础配置完成!"
3.3 高级 firewalld 配置脚本
创建文件: /root/firewalld-advanced-setup.sh
bash
#!/bin/bash
# firewalld 高级配置脚本
# 包含多个区域配置、端口转发和高级特性
echo "开始高级 firewalld 配置..."
# 确保 firewalld 运行
systemctl start firewalld
# 1. 创建自定义区域
echo "步骤1: 创建自定义区域"
# 1.1 创建 webzone 区域
firewall-cmd --permanent --new-zone=webzone
firewall-cmd --permanent --new-zone=internal
# 1.2 配置 webzone 区域
firewall-cmd --permanent --zone=webzone --add-service=http
firewall-cmd --permanent --zone=webzone --add-service=https
firewall-cmd --permanent --zone=webzone --add-port=8080/tcp
firewall-cmd --permanent --zone=webzone --set-target=ACCEPT
# 1.3 配置 internal 区域
firewall-cmd --permanent --zone=internal --add-service=ssh
firewall-cmd --permanent --zone=internal --add-service=mysql
firewall-cmd --permanent --zone=internal --add-service=postgresql
firewall-cmd --permanent --zone=internal --add-source=192.168.1.0/24
# 2. 配置端口转发
echo "步骤2: 配置端口转发"
# 2.1 启用 IP 伪装
firewall-cmd --permanent --zone=public --add-masquerade
# 2.2 配置端口转发 (将公网80端口转发到内网服务器)
firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.100
# 3. ICMP 阻塞配置
echo "步骤3: 配置 ICMP 阻塞"
firewall-cmd --permanent --zone=public --add-icmp-block=echo-request
firewall-cmd --permanent --zone=public --add-icmp-block=echo-reply
# 4. 直接规则配置 (Direct Rules)
echo "步骤4: 配置直接规则"
# 4.1 添加直接规则到 INPUT 链
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 9090 -j ACCEPT
# 4.2 添加连接限制规则
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 22 -m state --state NEW -m recent --set --name ssh --rsource
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name ssh --rsource -j DROP
# 5. 恐慌模式配置
echo "步骤5: 配置恐慌模式"
firewall-cmd --set-panic-off
echo "恐慌模式已关闭"
# 6. 锁定配置
echo "步骤6: 配置白名单锁定"
firewall-cmd --permanent --add-lockdown-whitelist-command=/usr/bin/systemctl
firewall-cmd --permanent --add-lockdown-whitelist-command=/usr/bin/firewall-cmd
firewall-cmd --permanent --add-lockdown-whitelist-user=root
# 7. 重载配置
echo "步骤7: 重载防火墙配置"
firewall-cmd --reload
# 8. 验证高级配置
echo "步骤8: 验证高级配置"
echo "所有区域:"
firewall-cmd --list-all-zones
echo "直接规则:"
firewall-cmd --direct --get-all-rules
echo "锁定白名单:"
firewall-cmd --list-lockdown-whitelist-commands
firewall-cmd --list-lockdown-whitelist-users
echo "端口转发:"
firewall-cmd --list-forward-ports
echo "高级 firewalld 配置完成!"
3.4 firewalld 服务管理脚本
创建文件: /root/firewalld-service-management.sh
bash
#!/bin/bash
# firewalld 服务管理脚本
# 用于管理自定义服务定义
echo "开始配置 firewalld 自定义服务..."
# 创建自定义服务目录
CUSTOM_SERVICE_DIR="/etc/firewalld/services"
mkdir -p $CUSTOM_SERVICE_DIR
# 1. 创建自定义应用服务
echo "步骤1: 创建自定义服务定义"
# 1.1 创建 nodejs-app 服务
cat > $CUSTOM_SERVICE_DIR/nodejs-app.xml << EOF
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Node.js Application</short>
<description>This service allows access to Node.js web application on ports 3000 and 3001.</description>
<port protocol="tcp" port="3000"/>
<port protocol="tcp" port="3001"/>
<module name="nf_conntrack_netbios_ns"/>
</service>
EOF
# 1.2 创建 mongodb 服务
cat > $CUSTOM_SERVICE_DIR/mongodb.xml << EOF
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>MongoDB Database</short>
<description>This service allows access to MongoDB database on default port 27017.</description>
<port protocol="tcp" port="27017"/>
</service>
EOF
# 1.3 创建 redis 服务
cat > $CUSTOM_SERVICE_DIR/redis.xml << EOF
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Redis Cache</short>
<description>This service allows access to Redis caching service on port 6379.</description>
<port protocol="tcp" port="6379"/>
</service>
EOF
# 2. 设置正确的文件权限
echo "步骤2: 设置文件权限"
chown root:root $CUSTOM_SERVICE_DIR/*.xml
chmod 640 $CUSTOM_SERVICE_DIR/*.xml
# 3. 重载 firewalld 以识别新服务
echo "步骤3: 重载服务定义"
firewall-cmd --reload
# 4. 添加自定义服务到防火墙
echo "步骤4: 添加自定义服务到防火墙"
# 4.1 添加 nodejs-app 服务到 internal 区域
firewall-cmd --permanent --zone=internal --add-service=nodejs-app
# 4.2 添加 mongodb 服务到 internal 区域
firewall-cmd --permanent --zone=internal --add-service=mongodb
# 4.3 添加 redis 服务到 internal 区域
firewall-cmd --permanent --zone=internal --add-service=redis
# 5. 重载配置
echo "步骤5: 重载防火墙配置"
firewall-cmd --reload
# 6. 验证自定义服务
echo "步骤6: 验证自定义服务配置"
echo "可用的自定义服务:"
firewall-cmd --get-services | grep -E "(nodejs-app|mongodb|redis)"
echo "internal 区域的服务:"
firewall-cmd --zone=internal --list-services
echo "服务文件内容:"
for service_file in $CUSTOM_SERVICE_DIR/*.xml; do
echo "=== $service_file ==="
cat $service_file
echo
done
echo "firewalld 自定义服务配置完成!"
4. 实战配置案例
4.1 Web 服务器防火墙配置
创建文件: /root/web-server-firewall.sh
bash
#!/bin/bash
# Web 服务器专用防火墙配置
# 适用于 Apache/Nginx web 服务器
echo "开始配置 Web 服务器防火墙..."
# 检测使用的防火墙工具
if systemctl is-active --quiet firewalld; then
echo "使用 firewalld 进行配置"
FIREWALL_TYPE="firewalld"
elif systemctl is-active --quiet iptables; then
echo "使用 iptables 进行配置"
FIREWALL_TYPE="iptables"
else
echo "未发现活动的防火墙服务,将安装并配置 firewalld"
yum install -y firewalld || apt-get install -y firewalld
systemctl start firewalld
systemctl enable firewalld
FIREWALL_TYPE="firewalld"
fi
if [ "$FIREWALL_TYPE" = "firewalld" ]; then
# firewalld 配置
# 创建 web-server 区域
firewall-cmd --permanent --new-zone=web-server
# 配置 web-server 区域
firewall-cmd --permanent --zone=web-server --add-service=http
firewall-cmd --permanent --zone=web-server --add-service=https
firewall-cmd --permanent --zone=web-server --add-service=ssh
firewall-cmd --permanent --zone=web-server --add-port=8080/tcp
firewall-cmd --permanent --zone=web-server --add-port=8443/tcp
# 设置默认区域
firewall-cmd --set-default-zone=web-server
# 添加富规则保护
firewall-cmd --permanent --zone=web-server --add-rich-rule='
rule family="ipv4" source address="192.168.1.0/24" port port="22" protocol="tcp" accept'
firewall-cmd --permanent --zone=web-server --add-rich-rule='
rule family="ipv4" source address="0.0.0.0/0" port port="22" protocol="tcp" drop'
# 重载配置
firewall-cmd --reload
echo "firewalld Web 服务器配置完成"
else
# iptables 配置
# 清除现有规则
iptables -F
iptables -X
# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 基础规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Web 服务端口
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 8443 -m state --state NEW -j ACCEPT
# SSH 保护
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# 保存规则
service iptables save
echo "iptables Web 服务器配置完成"
fi
# 显示最终配置
echo "最终防火墙配置:"
if [ "$FIREWALL_TYPE" = "firewalld" ]; then
firewall-cmd --list-all
else
iptables -L -v -n
fi
echo "Web 服务器防火墙配置完成!"
4.2 数据库服务器防火墙配置
创建文件: /root/database-server-firewall.sh
bash
#!/bin/bash
# 数据库服务器专用防火墙配置
# 适用于 MySQL, PostgreSQL, MongoDB 等数据库
echo "开始配置数据库服务器防火墙..."
# 使用 firewalld 进行配置
systemctl start firewalld
systemctl enable firewalld
# 创建 database-zone 区域
firewall-cmd --permanent --new-zone=database-zone
# 配置数据库区域
firewall-cmd --permanent --zone=database-zone --add-service=ssh
firewall-cmd --permanent --zone=database-zone --add-service=mysql
firewall-cmd --permanent --zone=database-zone --add-service=postgresql
# 添加自定义数据库端口
firewall-cmd --permanent --zone=database-zone --add-port=27017/tcp # MongoDB
firewall-cmd --permanent --zone=database-zone --add-port=5432/tcp # PostgreSQL
firewall-cmd --permanent --zone=database-zone --add-port=3306/tcp # MySQL
# 设置源地址限制
firewall-cmd --permanent --zone=database-zone --add-source=192.168.1.0/24
firewall-cmd --permanent --zone=database-zone --add-source=10.0.0.0/24
# 设置默认区域为 drop
firewall-cmd --permanent --zone=database-zone --set-target=DROP
# 设置 database-zone 为默认区域
firewall-cmd --set-default-zone=database-zone
# 重载配置
firewall-cmd --reload
# 验证配置
echo "数据库区域配置:"
firewall-cmd --zone=database-zone --list-all
echo "数据库服务器防火墙配置完成!"
5. 监控和故障排除
5.1 防火墙监控脚本
创建文件: /root/firewall-monitor.sh
bash
#!/bin/bash
# 防火墙监控和状态检查脚本
echo "开始防火墙状态检查..."
# 获取当前时间
CURRENT_TIME=$(date "+%Y-%m-%d %H:%M:%S")
echo "检查时间: $CURRENT_TIME"
# 检查防火墙服务状态
echo "=== 防火墙服务状态 ==="
if systemctl is-active --quiet firewalld; then
echo "firewalld: 运行中"
systemctl status firewalld --no-pager -l | grep -E "(Active|Main PID|CGroup)"
elif systemctl is-active --quiet iptables; then
echo "iptables: 运行中"
systemctl status iptables --no-pager -l | grep -E "(Active|Main PID|CGroup)"
else
echo "警告: 未发现运行的防火墙服务"
fi
echo
# 检查当前规则
echo "=== 当前防火墙规则 ==="
if systemctl is-active --quiet firewalld; then
echo "firewalld 配置:"
firewall-cmd --list-all-zones
elif systemctl is-active --quiet iptables; then
echo "iptables 规则:"
iptables -L -v -n
fi
echo
# 检查连接状态
echo "=== 当前网络连接 ==="
ss -tunlp | head -20
echo
# 检查被拒绝的连接
echo "=== 最近被拒绝的连接 ==="
if command -v journalctl >/dev/null 2>&1; then
journalctl -u firewalld --since "1 hour ago" | grep -i "denied\|rejected" | tail -10
fi
echo
# 检查系统日志中的防火墙相关条目
echo "=== 系统日志中的防火墙条目 ==="
dmesg | grep -i "firewall\|iptables" | tail -10
echo
# 端口扫描检查
echo "=== 监听端口检查 ==="
netstat -tuln | grep LISTEN
echo "防火墙状态检查完成!"
5.2 防火墙故障排除脚本
创建文件: /root/firewall-troubleshoot.sh
bash
#!/bin/bash
# 防火墙故障排除脚本
echo "开始防火墙故障排除..."
# 1. 检查基本连接
echo "步骤1: 检查基本网络连接"
ping -c 3 8.8.8.8 > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo "✓ 外部网络连接正常"
else
echo "✗ 外部网络连接失败"
fi
# 2. 检查服务状态
echo "步骤2: 检查防火墙服务状态"
if systemctl is-active --quiet firewalld; then
echo "✓ firewalld 服务运行正常"
# 检查 firewalld 配置
if firewall-cmd --state > /dev/null 2>&1; then
echo "✓ firewalld 配置加载正常"
else
echo "✗ firewalld 配置加载失败"
fi
elif systemctl is-active --quiet iptables; then
echo "✓ iptables 服务运行正常"
else
echo "✗ 没有运行的防火墙服务"
fi
# 3. 检查规则冲突
echo "步骤3: 检查规则冲突"
if systemctl is-active --quiet firewalld && systemctl is-active --quiet iptables; then
echo "警告: firewalld 和 iptables 同时运行,可能存在冲突"
fi
# 4. 检查端口状态
echo "步骤4: 检查关键端口状态"
PORTS_TO_CHECK="22 80 443 3306"
for port in $PORTS_TO_CHECK; do
if ss -tuln | grep ":$port " > /dev/null; then
echo "✓ 端口 $port 正在监听"
else
echo "✗ 端口 $port 未监听"
fi
done
# 5. 检查 SELinux 状态
echo "步骤5: 检查 SELinux 状态"
if command -v getenforce >/dev/null 2>&1; then
selinux_status=$(getenforce)
echo "SELinux 状态: $selinux_status"
if [ "$selinux_status" = "Enforcing" ]; then
echo "注意: SELinux 处于强制模式,可能影响网络连接"
fi
fi
# 6. 诊断特定问题
echo "步骤6: 常见问题诊断"
# 检查是否有被拒绝的连接
if dmesg | grep -i "reject" > /dev/null 2>&1; then
echo "发现被拒绝的连接,查看详细信息:"
dmesg | grep -i "reject" | tail -5
fi
# 检查日志中的防火墙错误
if journalctl -u firewalld --since "1 hour ago" | grep -i "error" > /dev/null 2>&1; then
echo "发现 firewalld 错误日志:"
journalctl -u firewalld --since "1 hour ago" | grep -i "error" | tail -5
fi
echo "故障排除完成!"
6. 安全最佳实践
6.1 防火墙安全加固脚本
创建文件: /root/firewall-hardening.sh
bash
#!/bin/bash
# 防火墙安全加固脚本
echo "开始防火墙安全加固..."
# 使用 firewalld 进行加固
systemctl start firewalld
# 1. 创建安全区域
echo "步骤1: 创建安全区域结构"
# 删除默认区域(如果存在)
firewall-cmd --permanent --delete-zone=public 2>/dev/null || true
firewall-cmd --permanent --delete-zone=internal 2>/dev/null || true
# 创建新的安全区域
firewall-cmd --permanent --new-zone=external
firewall-cmd --permanent --new-zone=restricted
firewall-cmd --permanent --new-zone=management
# 2. 配置外部区域
echo "步骤2: 配置外部区域"
firewall-cmd --permanent --zone=external --add-service=http
firewall-cmd --permanent --zone=external --add-service=https
firewall-cmd --permanent --zone=external --set-target=DROP
# 3. 配置受限制区域
echo "步骤3: 配置受限制区域"
firewall-cmd --permanent --zone=restricted --add-service=ssh
firewall-cmd --permanent --zone=restricted --add-source=192.168.1.0/24
firewall-cmd --permanent --zone=restricted --set-target=ACCEPT
# 4. 配置管理区域
echo "步骤4: 配置管理区域"
firewall-cmd --permanent --zone=management --add-service=ssh
firewall-cmd --permanent --zone=management --add-service=cockpit
firewall-cmd --permanent --zone=management --add-source=10.0.0.0/24
firewall-cmd --permanent --zone=management --set-target=ACCEPT
# 5. 配置默认区域
echo "步骤5: 设置默认区域"
firewall-cmd --set-default-zone=external
# 6. 配置高级保护规则
echo "步骤6: 配置高级保护"
# 6.1 防止碎片攻击
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -f -j DROP
# 6.2 防止无效数据包
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -m state --state INVALID -j DROP
# 6.3 限制新连接速率
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp -m state --state NEW -m limit --limit 60/min --limit-burst 100 -j ACCEPT
# 7. 配置日志规则
echo "步骤7: 配置详细日志"
# 记录被拒绝的连接
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -m limit --limit 12/min -j LOG --log-prefix "FIREWALL: " --log-level 4
# 8. 禁用不必要的 ICMP 类型
echo "步骤8: 配置 ICMP 过滤"
firewall-cmd --permanent --zone=external --add-icmp-block-inversion
firewall-cmd --permanent --zone=external --remove-icmp-block=echo-request
firewall-cmd --permanent --zone=external --remove-icmp-block=echo-reply
# 9. 重载配置
echo "步骤9: 应用配置"
firewall-cmd --reload
# 10. 验证加固配置
echo "步骤10: 验证加固结果"
echo "所有区域配置:"
firewall-cmd --list-all-zones
echo "直接规则:"
firewall-cmd --direct --get-all-rules
echo "防火墙安全加固完成!"
7. 总结
本教程详细介绍了 Linux 系统中两种主要的防火墙工具:iptables 和 firewalld。通过实际的配置案例和详细的步骤说明,即使是零基础的初学者也能够按照教程完成实际的防火墙配置。
7.1 关键要点
- iptables 是底层的包过滤工具,功能强大但配置复杂
- firewalld 是基于 iptables 的高级管理工具,提供动态管理和更友好的配置接口
- 两种工具都可以有效保护服务器安全,选择取决于具体需求和个人偏好
- 持久化配置是确保防火墙规则在重启后仍然有效的关键
7.2 后续建议
- 定期审查和更新防火墙规则
- 监控防火墙日志以检测潜在的安全威胁
- 在生产环境部署前,先在测试环境验证规则
- 保持防火墙软件更新到最新版本
通过本教程的学习,您应该能够熟练配置和管理 Linux 系统的防火墙,为服务器提供坚实的安全防护。