本文目录导读:

是的,实用脚本完全可以自动配置防火墙策略,这正是运维自动化的核心场景之一,通过脚本,你可以将重复、易出错的手动操作(如添加规则、备份、检查状态)变成可重复、可追溯的自动化流程。
具体实现方式取决于你使用的防火墙类型(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自带强大的netsh和New-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,以下是一个通过expect或sshpass自动登录华为防火墙并添加策略的脚本示例。
脚本: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"
进阶:更安全、更专业的做法
-
使用配置管理工具(更推荐):
- Ansible:通过
firewalld、iptables或ufw模块,声明式管理防火墙规则。 - 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),实现基础设施即代码。
- Ansible:通过
-
脚本的增强功能:
- 备份/回滚:在修改前导出当前规则(
iptables-save > backup_$(date +%s).rules)。 - 原子操作:使用
ipset或nftables sets批量管理IP集合,避免逐条添加导致性能问题。 - 日志记录:记录每次变更到文件或syslog。
- 错误处理:检查命令返回值,连接失败时中止并报警。
- 备份/回滚:在修改前导出当前规则(
- 可以:脚本可以自动配置防火墙策略,且是提升效率、减少人为失误的有效手段。
- 但要注意:操作前必须有备份机制和回滚方案,尤其对于生产环境的防火墙,一次错误的变更可能导致业务中断。
- 推荐路径:从简单脚本开始管理单台服务器 → 过渡到Ansible等工具管理集群 → 最终通过CI/CD Pipeline集成到变更管理流程中。
如果你能提供更具体的场景(比如是哪种防火墙、需要配置哪些策略),我可以给出更贴合的示例。