实用脚本能自动配置防火墙策略吗?

wen 实用脚本 1

本文目录导读:

实用脚本能自动配置防火墙策略吗?

  1. 场景一:Linux服务器(iptables/nftables)
  2. 场景二:Windows Server(PowerShell)
  3. 场景三:华为/思科等企业级防火墙(通过CLI)
  4. 进阶:更安全、更专业的做法

是的,实用脚本完全可以自动配置防火墙策略,这正是运维自动化的核心场景之一,通过脚本,你可以将重复、易出错的手动操作(如添加规则、备份、检查状态)变成可重复、可追溯的自动化流程。

具体实现方式取决于你使用的防火墙类型(Linux iptables/nftables、Windows Defender Firewall、或硬件防火墙如华为、Cisco等),下面提供几个最实用的脚本范例。

Linux服务器(iptables/nftables)

这是最常见的场景,以下是一个bash脚本,用于自动配置一套“白名单”策略:只允许特定IP访问SSH,开放Web服务,并禁止其他一切入站流量。

脚本:configure_firewall.sh

#!/bin/bash
# 防火墙配置脚本 - 仅允许特定IP访问SSH
# 定义变量
SSH_ALLOWED_IPS=("192.168.1.100" "10.0.0.50")  # 允许访问SSH的IP列表
WEB_SERVICE_PORT="80,443"                        # 开放的Web端口
# 1. 清理现有规则(风险操作!生产环境建议先备份)
echo "正在清除所有现有iptables规则..."
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t mangle -F
# 2. 设置默认策略(DROP所有入站,允许所有出站和转发)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# 3. 允许已建立的连接和回环接口
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT
# 4. 开放Web服务端口
echo "开放Web端口: $WEB_SERVICE_PORT"
sudo iptables -A INPUT -p tcp -m multiport --dports $WEB_SERVICE_PORT -j ACCEPT
# 5. 仅允许特定IP访问SSH
echo "配置SSH访问白名单..."
for IP in "${SSH_ALLOWED_IPS[@]}"; do
    sudo iptables -A INPUT -p tcp --dport 22 -s $IP -j ACCEPT
    echo "  已添加: $IP"
done
# 6. 其他常见服务(按需开启)
# sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT  # 允许ping
# 7. 保存规则(防止重启丢失,不同系统命令不同)
echo "保存规则..."
if command -v iptables-save &> /dev/null; then
    sudo iptables-save > /etc/iptables/rules.v4   # Debian/Ubuntu
    # sudo iptables-save > /etc/sysconfig/iptables  # CentOS/RHEL
    echo "规则已保存。"
else
    echo "警告:未找到iptables-save,规则重启后将丢失。"
fi
echo "=== 防火墙配置完成 ==="
sudo iptables -L -n -v | head -20  # 显示前20条规则确认

使用前注意事项:

  • 风险警告iptables -F会清空所有规则,如果脚本出错(比如SSH端口写错),你会立即断开连接。建议在本地终端或带外管理(如iDRAC、IPMI)执行
  • 执行权限chmod +x configure_firewall.sh
  • 测试:先在测试环境跑一遍。

Windows Server(PowerShell)

Windows自带强大的netshNew-NetFirewallRule cmdlet,以下脚本创建一个新的入站规则,阻止特定IP访问系统。

脚本:Block-MaliciousIP.ps1

# 配置防火墙,阻止恶意IP列表
$BlockedIPs = @("10.0.0.99", "203.0.113.50")  # 要阻止的IP
$RuleName = "BlockMaliciousIPs"               # 规则名称前缀
foreach ($IP in $BlockedIPs) {
    # 检查是否已存在同名规则
    $existingRule = Get-NetFirewallRule -DisplayName "$RuleName_$IP" -ErrorAction SilentlyContinue
    if ($existingRule) {
        Write-Host "规则已存在: $IP" -ForegroundColor Yellow
        continue
    }
    # 创建新规则:阻止该IP的所有入站流量
    New-NetFirewallRule -DisplayName "$RuleName_$IP" `
                        -Direction Inbound `
                        -Action Block `
                        -RemoteAddress $IP `
                        -Profile Any `
                        -Enabled True
    Write-Host "已添加阻止规则: $IP" -ForegroundColor Green
}
Write-Host "操作完成,当前阻止IP数: $( (Get-NetFirewallRule -DisplayName "$RuleName*").Count )"

脚本优势

  • 幂等性:检查规则是否存在,避免重复添加。
  • 可以轻松集成到SIEM或EDR系统中,实现自动封禁。

华为/思科等企业级防火墙(通过CLI)

对于硬件防火墙,通常通过SSH或API调用CLI,以下是一个通过expectsshpass自动登录华为防火墙并添加策略的脚本示例。

脚本:huawei_fw_add_rule.sh

#!/bin/bash
# 自动在华为USG防火墙添加安全策略(需要sshpass)
FW_IP="192.168.100.1"
FW_USER="admin"
FW_PASS="YourPassword"
NEW_SRC_IP="10.10.10.0/24"
NEW_DST_IP="172.16.1.100"
# 使用expect自动交互(或者使用sshpass + 非交互式命令)
sshpass -p "$FW_PASS" ssh -o StrictHostKeyChecking=no $FW_USER@$FW_IP << EOF
system-view
security-policy
rule name auto_add_via_script
  source-zone trust
  destination-zone untrust
  source-address $NEW_SRC_IP
  destination-address $NEW_DST_IP
  action permit
  description "添加于 $(date)"
commit
quit
quit
EOF
echo "策略已添加,源:$NEW_SRC_IP 到 目的:$NEW_DST_IP"

进阶:更安全、更专业的做法

  1. 使用配置管理工具(更推荐)

    • Ansible:通过firewalldiptablesufw模块,声明式管理防火墙规则。
      
      
    • name: 允许SSH访问 firewalld: service: ssh permanent: yes state: enabled
    • name: 允许特定IP firewalld: rich_rule: rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept permanent: yes state: enabled
    • Terraform:用于云防火墙(AWS Security Group, Azure NSG),实现基础设施即代码。
  2. 脚本的增强功能

    • 备份/回滚:在修改前导出当前规则(iptables-save > backup_$(date +%s).rules)。
    • 原子操作:使用ipsetnftables sets批量管理IP集合,避免逐条添加导致性能问题。
    • 日志记录:记录每次变更到文件或syslog。
    • 错误处理:检查命令返回值,连接失败时中止并报警。
  • 可以:脚本可以自动配置防火墙策略,且是提升效率、减少人为失误的有效手段。
  • 但要注意:操作前必须有备份机制回滚方案,尤其对于生产环境的防火墙,一次错误的变更可能导致业务中断。
  • 推荐路径:从简单脚本开始管理单台服务器 → 过渡到Ansible等工具管理集群 → 最终通过CI/CD Pipeline集成到变更管理流程中。

如果你能提供更具体的场景(比如是哪种防火墙、需要配置哪些策略),我可以给出更贴合的示例。

抱歉,评论功能暂时关闭!