温馨提示×

centos防火墙自动化运维

小樊
47
2025-11-01 12:51:31
栏目: 智能运维

CentOS防火墙自动化运维实践指南

一、基础自动化运维工具准备

CentOS系统默认使用firewalld作为防火墙管理工具,其支持动态规则调整(无需重启服务)的特性,为自动化运维提供了便利。要实现自动化管理,需先确保firewalld服务正常运行并开启开机自启:

# 启动firewalld服务
systemctl start firewalld
# 设置开机自启
systemctl enable firewalld
# 验证服务状态
systemctl status firewalld

此外,可通过firewall-cmd命令(无需root权限即可查看状态,但修改规则需root)进行日常规则管理,如开放/关闭端口、查询状态等。

二、常见自动化运维场景实现

1. 端口自动管理

端口的开放与关闭是防火墙最频繁的操作,可通过firewall-cmd--permanent参数实现永久生效,并通过--reload重载配置使更改立即生效:

# 永久开放TCP 80(HTTP)、443(HTTPS)端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
# 永久关闭TCP 23(Telnet)端口(避免明文传输风险)
firewall-cmd --zone=public --remove-port=23/tcp --permanent
# 重载配置使更改生效
firewall-cmd --reload
# 验证端口开放状态
firewall-cmd --zone=public --list-ports

注意--permanent参数确保规则在防火墙重启后仍有效,而--reload不会中断现有连接。

2. 规则批量执行

对于多台服务器的统一配置,可通过Shell脚本批量执行firewall-cmd命令。例如,批量开放一组常用端口(80、443、22):

#!/bin/bash
PORTS=("80/tcp" "443/tcp" "22/tcp")
for PORT in "${PORTS[@]}"; do
    firewall-cmd --zone=public --add-port="$PORT" --permanent
done
firewall-cmd --reload
echo "端口开放完成"

将脚本保存为open_ports.sh,赋予执行权限(chmod +x open_ports.sh)后,即可在多台服务器上运行。

3. 恶意IP自动封禁

针对SSH等服务的暴力破解攻击,可通过firewalldipset机制实现自动封禁。以下是一个完整的自动封禁脚本:

#!/bin/bash
# 定义封禁阈值(3小时内失败次数超过5次)和时间范围
THRESHOLD=5
TIME_RANGE="3 hours ago"
LOG_FILE="/var/log/secure"
IPSET_NAME="sshblack"
# 获取恶意IP列表(通过grep过滤Failed password记录,awk提取IP并统计)
MALICIOUS_IPS=$(awk -v start="$(date -d "$TIME_RANGE" '+%b %d %H:%M:%S')" -v end="$(date '+%b %d %H:%M:%S')" \
    '$0 >= start && $0 <= end && /Failed password/ {print $(NF-3)}' "$LOG_FILE" | sort | uniq -c | sort -k1nr | awk -v thresh="$THRESHOLD" '$1 > thresh {print $2}')
# 将恶意IP添加到ipset
for IP in $MALICIOUS_IPS; do
    firewall-cmd --permanent --ipset="$IPSET_NAME" --add-entry="$IP"
done
# 重载firewalld使封禁生效
firewall-cmd --reload
echo "恶意IP封禁完成:$MALICIOUS_IPS"

将该脚本添加到cron定时任务(如每5分钟执行一次),即可实现自动检测并封禁恶意IP:

*/5 * * * * /path/to/auto_block_ssh.sh >> /var/log/auto_block.log 2>&1

说明ipsetfirewalld的高级功能,用于高效管理大量IP地址,比直接添加iptables规则更节省资源。

三、自动化运维进阶技巧

1. 使用Python脚本简化管理

对于习惯用Python的运维人员,可通过firewall模块(需安装:pip install firewall)编写Python脚本管理防火墙。例如:

import firewall

def configure_firewall():
    # 添加允许规则(SSH、HTTP、HTTPS)
    firewall.add_rule('allow', '22')
    firewall.add_rule('allow', '80')
    firewall.add_rule('allow', '443')
    # 应用配置
    firewall.apply()
    # 查询当前规则
    rules = firewall.get_rules()
    print("当前防火墙规则:", rules)

if __name__ == "__main__":
    configure_firewall()

该脚本封装了firewall-cmd的常用操作,适合需要更复杂逻辑的场景(如结合数据库存储规则)。

2. 跨平台兼容处理

若运维环境中包含CentOS、Ubuntu、macOS等多种系统,可通过检测系统类型调用对应的防火墙命令。例如,以下脚本实现了跨平台的防火墙状态查询:

#!/bin/bash
# 检测操作系统类型
if [[ "$(uname)" == "Darwin" ]]; then
    OS_TYPE="macos"
elif [[ -f /etc/os-release ]]; then
    . /etc/os-release
    case "$ID" in
        centos|rhel|fedora) OS_TYPE="centos" ;;
        ubuntu|debian) OS_TYPE="ubuntu" ;;
        *) OS_TYPE="unknown" ;;
    esac
else
    OS_TYPE="unknown"
fi

# 根据系统类型执行对应命令
case "$OS_TYPE" in
    centos)
        STATE=$(timeout 3s firewall-cmd --state 2>/dev/null || echo "timeout")
        echo "CentOS防火墙状态:$STATE"
        ;;
    ubuntu)
        STATUS=$(timeout 3s ufw status 2>/dev/null | head -n1 || echo "timeout")
        echo "Ubuntu防火墙状态:$STATUS"
        ;;
    macos)
        STATE=$(socketfilterfw --getglobalstate | awk '{print $3}')
        echo "macOS防火墙状态:$STATE"
        ;;
    *)
        echo "未知操作系统,无法检测防火墙状态"
        ;;
esac

该脚本通过uname/etc/os-release文件识别系统类型,调用对应的防火墙命令(firewall-cmdufwsocketfilterfw),适用于混合环境。

四、自动化运维注意事项

  1. 权限控制:所有修改防火墙规则的操作需使用root权限,避免普通用户误操作导致安全风险。
  2. 规则备份:修改规则前,建议备份当前配置(firewall-cmd --runtime-to-permanent保存运行时规则到永久配置,或复制/etc/firewalld/目录)。
  3. 测试验证:自动化脚本执行前,需在测试环境验证规则的正确性,避免误封禁合法IP或开放高危端口。
  4. 日志监控:定期检查防火墙日志(journalctl -u firewalld -f/var/log/firewalld),及时发现异常规则或攻击行为。

0