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 系统的防火墙,为服务器提供坚实的安全防护。

相关推荐
KV_T2 小时前
centos运维常用命令
linux·运维·centos
dessler2 小时前
MYSQL-主键(Primary Key)
linux·运维·mysql
LCG元2 小时前
Nginx 配置入门到实战:从静态网站到负载均衡
linux
代码程序猿RIP3 小时前
【Linux面经】OSI七层模型和TCP/IP四层体系结构
linux·网络·面试·面经
我什么都学不会3 小时前
DNS主从服务器练习
linux·运维·服务器
不会kao代码的小王3 小时前
零基础也能搭博客?
linux·windows·后端
weixin_462446235 小时前
ubuntu/kali安装k8s
linux·ubuntu·kubernetes
lys_8286 小时前
【linux】解决NAT模型下使用Xshell连接虚拟机显示22端口connection failed问题
linux·运维·服务器
序属秋秋秋7 小时前
《Linux系统编程之系统导论》【冯诺依曼体系结构 + 操作系统基本概述】
linux·运维·服务器·c语言·ubuntu·操作系统·冯诺依曼体系结构