firewalld批量配置富规则——脚本案例

以下脚本是对firewalld的策略方针是:先放通所有流量,再禁用所有高危端口,按需开放特定IP的高危端口访问权限:

默认情况下firewalld富规则reject黑名单策略会比accept白名单的优先级高,所以我使用了priority=100参数设定reject优先级更低(priority默认优先级为0,数值越大优先级越小)。

所以他们的优先级是:特定accept > 高危reject > trusted1

#!/bin/bash

# 设置防火墙默认区域为trusted(允许所有流量)
firewall-cmd --set-default-zone=trusted > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "防火墙初始化失败!无法设置默认区域"
    exit 1
fi

#############################################
# 第一阶段:禁用所有高危端口
#############################################

# 需要禁用的TCP高危端口
reject_tcp_port="20 21 23 69 111 2049 512 513 514 4899 8009 3389 445"
# 需要禁用的UDP高危端口 
reject_udp_port="69"

echo "正在禁用高危端口..."

# 禁用TCP端口(使用双引号包裹整个规则,内部引号转义)
for port in $reject_tcp_port; do
    firewall-cmd --permanent --add-rich-rule="rule priority=\"100\" port port=\"$port\" protocol=\"tcp\" reject" > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "警告:禁用TCP端口 $port 失败!"
    fi
done

# 禁用UDP端口(使用双引号包裹整个规则,内部引号转义)
for port in $reject_udp_port; do
    firewall-cmd --permanent --add-rich-rule="rule priority=\"100\" port port=\"$port\" protocol=\"udp\" reject" > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "警告:禁用UDP端口 $port 失败!"
    fi
done

#############################################
# 第二阶段:按需开放特定IP的访问权限
#############################################

echo "正在配置例外IP访问规则..."

# 定义需要特殊允许的IP和端口
Allow_traffic_20="10.119.68.{162..191} 10.119.68.{229..234} 10.119.11.{96..105} 10.119.68.161"
Allow_traffic_21="10.119.68.{162..191} 10.119.68.161 10.119.68.107"
Allow_traffic_3389="10.119.68.{155..158} 10.119.68.161 10.119.180.9 10.119.180.112"
Allow_traffic_445="10.119.68.{155..158} 10.119.68.161 10.119.13.29"
Allow_traffic_any="10.119.68.{180..181}"

# 配置20端口例外(使用双引号包裹整个规则)
for ip in $(eval echo "$Allow_traffic_20"); do
    firewall-cmd --permanent --add-rich-rule="rule family=\"ipv4\" source address=\"$ip\" port port=\"20\" protocol=\"tcp\" accept" > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "警告:为IP $ip 开放20端口失败"
    fi
done

# 配置21端口例外(使用双引号包裹整个规则)
for ip in $(eval echo "$Allow_traffic_21"); do
    firewall-cmd --permanent --add-rich-rule="rule family=\"ipv4\" source address=\"$ip\" port port=\"21\" protocol=\"tcp\" accept" > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "警告:为IP $ip 开放21端口失败"
    fi
done

# 配置3389端口例外(使用双引号包裹整个规则)
for ip in $(eval echo "$Allow_traffic_3389"); do
    firewall-cmd --permanent --add-rich-rule="rule family=\"ipv4\" source address=\"$ip\" port port=\"3389\" protocol=\"tcp\" accept" > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "警告:为IP $ip 开放3389端口失败"
    fi
done

# 配置445端口例外(使用双引号包裹整个规则)
for ip in $(eval echo "$Allow_traffic_445"); do
    firewall-cmd --permanent --add-rich-rule="rule family=\"ipv4\" source address=\"$ip\" port port=\"445\" protocol=\"tcp\" accept" > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "警告:为IP $ip 开放445端口失败"
    fi
done

# 配置全端口例外(使用双引号包裹整个规则)
for ip in $(eval echo "$Allow_traffic_any"); do
    firewall-cmd --permanent --add-rich-rule="rule family=\"ipv4\" source address=\"$ip\" accept" > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo "警告:为IP $ip 开放所有端口失败"
    fi
done

#############################################
# 最终生效配置
#############################################

# 重新加载防火墙配置
firewall-cmd --reload > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "防火墙配置已成功更新!"
    echo "已禁用高危端口:$reject_tcp_port(TCP) $reject_udp_port(UDP)"
    echo "已设置例外访问规则"
else
    echo "错误:防火墙配置重载失败!"
    exit 2
fi

# 显示当前富规则
echo -e "\n当前生效的富规则:"
firewall-cmd --list-rich-rules

  1. trusted为保底策略优先级最低一个具有注脚的文本。 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值