以下脚本是对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
trusted为保底策略优先级最低一个具有注脚的文本。 ↩︎