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

1. Linux 防火墙基础概念

1.1 防火墙的重要性

在当今的网络环境中,防火墙是保护系统安全的第一道防线。它通过控制网络流量进出系统,有效阻止未经授权的访问和恶意攻击。

1.2 iptables 与 firewalld 的关系

iptables 是 Linux 内核中网络包过滤系统的用户空间工具,而 firewalld 是基于 iptables 的高级管理工具,提供了更友好的动态管理接口。

2. iptables 配置详解

2.1 iptables 基础架构

网络数据包

iptables 链选择

INPUT 链

FORWARD 链

OUTPUT 链

INPUT 规则匹配

规则1: 允许SSH

规则2: 允许HTTP

规则3: 默认拒绝

接受

拒绝

FORWARD 规则匹配

规则1: 允许转发

规则2: 默认拒绝

接受

拒绝

OUTPUT 规则匹配

规则1: 允许所有

接受

2.2 创建基础 iptables 配置文件

创建文件: /root/iptables-basic-setup.sh


#!/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


#!/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


#!/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 核心概念

firewalld 守护进程

运行时配置

永久配置

立即生效

重启后丢失

重启后生效

需要重载

防火墙规则

Zones 区域

Services 服务

Ports 端口

Rich Rules 富规则

public

internal

dmz

trusted

ssh

http

https

端口转发

直接规则

复杂规则

源地址限制

时间限制

3.2 基础 firewalld 配置脚本

创建文件: /root/firewalld-basic-setup.sh


#!/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


#!/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


#!/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


#!/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


#!/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


#!/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


#!/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


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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值