Linux 防火墙双雄:iptables 与 firewalld 配置案例详解

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 关键要点

  1. iptables 是底层的包过滤工具,功能强大但配置复杂
  2. firewalld 是基于 iptables 的高级管理工具,提供动态管理和更友好的配置接口
  3. 两种工具都可以有效保护服务器安全,选择取决于具体需求和个人偏好
  4. 持久化配置是确保防火墙规则在重启后仍然有效的关键

7.2 后续建议

  • 定期审查和更新防火墙规则
  • 监控防火墙日志以检测潜在的安全威胁
  • 在生产环境部署前,先在测试环境验证规则
  • 保持防火墙软件更新到最新版本

通过本教程的学习,您应该能够熟练配置和管理 Linux 系统的防火墙,为服务器提供坚实的安全防护。

相关推荐
张小姐的猫30 分钟前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生1 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.112 小时前
linux基础IO
linux·运维·服务器
BelongPanda4 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯4 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_777998344 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器
yunwei374 小时前
eBPF 教程:检查 exec 后真正安装的可执行镜像
linux·开源
笑锝没心没肺5 小时前
yum update 报错:GPG key retrieval failed: [Errno 14] HTTPS Error 404 - Not Found
linux·运维·服务器
AAA@峥5 小时前
CentOS Stream8 基于 Packstack 搭建 OpenStack 云平台全流程实战
linux·centos·openstack
汤永红5 小时前
gtk-x11-2.0.so.0
linux·运维·服务器