百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Linux防火墙管理

gudong366 2025-05-14 13:24 8 浏览

Linux防火墙脚本使用说明

一、脚本概述

firewalld 管理脚本是一款用于简化 firewalld 防火墙管理的工具。它通过提供一个交互式菜单,使用户能够方便地执行启动、停止 firewalld 服务、查看监听端口、开放或关闭端口、查看当前规则以及批量删除所有 rich rules 等操作,同时将操作日志记录到指定文件中,便于后续查看和审计。

二、脚本使用方法

  1. 脚本运行环境
  • 本脚本适用于安装有 firewalld 防火墙的 Linux 系统,且需要以 root 用户权限运行,因为 firewalld 的相关操作通常需要管理员权限。
  1. 脚本文件位置
  • 将脚本文件(firewalld_manage.sh)保存到系统中的合适位置,例如 /root/ 或其他具有适当权限的目录。
  1. 运行脚本
  • 打开终端,切换到脚本所在目录,然后使用以下命令运行脚本:

bash firewalld_manage.sh

三、脚本功能详细说明

1. 启动 firewalld(选项 1)

  • 功能描述 :启动系统中的 firewalld 服务。
  • 操作步骤 :在脚本主菜单中选择选项 1,脚本会调用 systemctl 命令尝试启动 firewalld 服务,并根据执行结果输出相应的成功或失败信息,同时将操作记录写入日志文件。

2. 停止 firewalld(选项 2)

  • 功能描述 :停止系统中正在运行的 firewalld 服务。
  • 操作步骤 :在主菜单中选择选项 2,脚本执行 systemctl stop 命令来停止 firewalld 服务,根据执行结果反馈操作状态,并记录日志。

3. 查看监听端口(选项 3)

  • 功能描述 :显示系统当前正在监听的所有端口信息,包括端口号、协议类型、状态等,帮助用户了解当前网络连接情况。
  • 操作步骤 :选择主菜单中的选项 3,脚本将调用 ss -tuln 命令,并以黄色高亮显示 “当前监听端口” 标题,然后输出端口监听信息。

4. 开放端口(选项 4)

  • 功能描述 :根据用户输入的端口号、源 IP 地址(可选)和协议类型,在 firewalld 中添加相应的规则以开放指定端口的访问权限。
  • 操作步骤 :在主菜单中选择选项 4,脚本提示用户输入要开放的端口,可以是单个端口或用逗号分隔的多个端口,例如 80,443,8080。接着输入允许访问的源 IP 地址,若留空则表示对所有 IP 开放该端口;若需要指定多个 IP,则用逗号分隔。选择协议类型,默认为 tcp,也可以输入 udp。脚本会根据输入信息,使用 firewall-cmd 命令添加相应的 rich rule 规则到 firewalld 的永久配置中,并输出每个端口规则添加的结果。最后,脚本自动重新加载 firewalld 规则,使更改生效,并提示重新加载是否成功。

5. 关闭端口(选项 5)

  • 功能描述 :关闭之前通过脚本开放的端口,即从 firewalld 的规则中移除相应的 rich rule 规则,限制对指定端口的访问。
  • 操作步骤 :在主菜单中选择选项 5,输入要关闭的端口号,可输入单个或多个用逗号分隔的端口。输入对应的源 IP 地址,若之前开放该端口时未指定源 IP,则此处留空;若需要关闭多个 IP 对该端口的访问,则用逗号分隔输入。脚本会根据输入信息,构造对应的 firewall-cmd 命令来移除相应的 rich rule 规则,并输出每个端口规则移除的结果。重新加载 firewalld 规则,使关闭端口的操作生效,并提示用户。

6. 查看当前 firewalld 规则(选项 6)

  • 功能描述 :显示当前 firewalld 的所有配置,信息包括激活的区域、接口、服务、端口、rich rules 等,方便用户查看当前的防火墙策略设置。
  • 操作步骤 :在主菜单中选择选项 6,脚本执行 firewall-cmd --list-all 命令,并以黄色高亮显示 “当前 firewalld 规则” 标题,然后输出详细的规则信息。

7. 批量删除所有 rich rules(选项 7)

  • 功能描述 :一次性删除 firewalld 中所有已配置的 rich rules 规则,用于快速清理复杂的规则设置,恢复到较为简单的防火墙状态。
  • 操作步骤 :在主菜单中选择选项 7,脚本会先检查当前是否存在 rich rules 规则。如果存在,脚本会逐条读取这些规则,并使用 firewall-cmd 命令将它们从永久配置中移除,同时记录每条规则删除的结果。删除完成后,重新加载 firewalld 规则,使配置变更生效,并提示用户操作是否成功。

8. 退出脚本(选项 8)

  • 功能描述 :结束脚本的运行,返回到终端命令行界面。
  • 操作步骤 :在主菜单中选择选项 8,脚本输出 “再见!” 的提示信息后退出。

四、脚本日志记录

  • 脚本在执行过程中会将所有操作信息记录到日志文件中,默认日志文件路径为 /var/log/firewalld-script.log。
  • 每条日志记录包含操作执行的时间戳以及具体的操作描述和结果,方便用户后续查看历史操作记录,进行问题排查或审计工作。

五、注意事项

  1. 由于脚本涉及对系统防火墙规则的修改,操作时应谨慎,确保输入的参数正确,避免因误操作导致系统无法正常访问或出现安全漏洞。
  2. 在开放端口时,应遵循最小权限原则,只开放必要的端口和服务,并尽量限制允许访问的源 IP 范围,以降低安全风险。
  3. 如果在脚本运行过程中遇到问题,可以查看日志文件中的详细信息,帮助定位和解决问题。
  4. 脚本的使用和修改应符合所在组织或系统的安全策略和规定,未经授权不得随意更改防火墙配置。

六、完整脚本

#!/bin/bash
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # 清除颜色
log_file="/var/log/firewalld-script.log"
function log() {
echo -e "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$log_file"
}
function start_firewalld() {
systemctl start firewalld && log "${GREEN} firewalld 已启动${NC}" || log "${RED} 启动 firewalld 失败${NC}"
}
function stop_firewalld() {
systemctl stop firewalld && log "${GREEN} firewalld 已停止${NC}" || log "${RED} 停止 firewalld 失败${NC}"
}
function show_ports() {
echo -e "${YELLOW} 当前监听端口:${NC}"
ss -tuln
}
function open_ports() {
read -p " 你可以输入多个端口用逗号隔开,如 80,443,8080
请输入要开放的端口: " ports
read -p "请输入要开放的IP(多个用逗号分隔): " ips
read -p "请选择协议 (tcp/udp,默认 tcp): " proto
[[ -z "$proto" ]] && proto="tcp"
IFS=',' read -ra port_list <<< "$ports"
IFS=',' read -ra ip_list <<< "$ips"
for port in "${port_list[@]}"; do
if [[ -z "$ips" ]]; then
firewall-cmd --permanent --add-rich-rule="rule family=\"ipv4\" port port=\"$port\" protocol=\"$proto\" accept"
log "${GREEN} 已开放 $port/$proto(全网)${NC}"
else
for ip in "${ip_list[@]}"; do
firewall-cmd --permanent --add-rich-rule="rule family=\"ipv4\" source address=\"$ip\" port port=\"$port\" protocol=\"$proto\" accept"
log "${GREEN} 已开放 $port/$proto(源IP: $ip)${NC}"
done
fi
done
echo -e "${YELLOW} 重新加载 firewalld 规则...${NC}"
firewall-cmd --reload && echo "success" || echo "${RED} reload 失败${NC}"
}
function close_ports() {
read -p " 你可以输入多个端口用逗号隔开,如 80,443,8080
请输入要关闭的端口: " ports
read -p "请输入要关闭的IP(多个用逗号分隔): " ips
IFS=',' read -ra port_list <<< "$ports"
IFS=',' read -ra ip_list <<< "$ips"
for port in "${port_list[@]}"; do
if [[ -z "$ips" ]]; then
firewall-cmd --permanent --remove-rich-rule="rule family=\"ipv4\" port port=\"$port\" protocol=\"tcp\" accept"
log "${GREEN} 已关闭 $port/tcp(全网)${NC}"
else
for ip in "${ip_list[@]}"; do
firewall-cmd --permanent --remove-rich-rule="rule family=\"ipv4\" source address=\"$ip\" port port=\"$port\" protocol=\"tcp\" accept"
log "${GREEN} 已关闭 $port/tcp(源IP: $ip)${NC}"
done
fi
done
echo -e "${YELLOW} 重新加载 firewalld 规则...${NC}"
firewall-cmd --reload && echo "success" || echo "${RED} reload 失败${NC}"
echo -e "${GREEN} 修改已生效${NC}"
}
function show_rules() {
echo -e "${YELLOW} 当前 firewalld 规则:${NC}"
firewall-cmd --list-all
}
function delete_all_rich_rules() {
echo -e "${RED} 正在尝试删除所有 rich rule...${NC}"
rules=$(firewall-cmd --permanent --list-rich-rules)
if [[ -z "$rules" ]]; then
echo -e "${YELLOW} 当前没有 rich rules${NC}"
return
fi
while read -r rule; do
firewall-cmd --permanent --remove-rich-rule="$rule" && \
log "${GREEN} 已删除 rich rule: $rule${NC}" || \
log "${RED} 删除失败: $rule${NC}"
done <<< "$rules"
echo -e "${YELLOW} 重新加载 firewalld 规则...${NC}"
firewall-cmd --reload && echo "success" || echo "${RED} reload 失败${NC}"
}
# 主循环
while true; do
clear
echo " firewalld 管理菜单 "
echo "1. 启动 firewalld"
echo "2. 停止 firewalld"
echo "3. 查看监听端口"
echo "4. 开放端口"
echo "5. 关闭端口"
echo "6. 查看当前 firewalld 规则"
echo "7. 批量删除所有 rich rules"
echo "8. 退出脚本"
read -p "请输入选项 [1-8]: " opt
echo ""
case "$opt" in
1) start_firewalld ;;
2) stop_firewalld ;;
3) show_ports ;;
4) open_ports ;;
5) close_ports ;;
6) show_rules ;;
7) delete_all_rich_rules ;;
8) echo -e "${GREEN} 再见!${NC}"; exit 0 ;;
*) echo -e "${RED} 无效选项,请重新输入 [1-8]${NC}" ;;
esac
read -p "按 Enter 键返回菜单..." pause
done

相关推荐

linux sed系列 第四篇:sed工业实战——日志处理与数据清洗

“掌握了sed的编程能力后,我们如同装备精良的工匠,终于可以踏入真实的工业战场。本篇将聚焦sed在日志分析、数据合规化、多文件批处理等场景中的应用,看它如何在海量数据中游刃有余,展现文本处理的...

Linux下sed的简单使用(linux中sed是什么意思)

1、sed简介stremeditor流编辑器,它是一项Linux指令,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大,sed编辑器是一行一...

linux基础命令之date命令(linux中的date)

date命令主要用于显示或者设置系统时间语法格式:date参数对象使用date命令时,最好先使用date--help命令查看支持哪些参数,有些小型Linux系统下的date命令,只支持一些基本参...

Ubuntu linux 常用命令(ubuntu常用的50个命令)

使用dpkg命令来安装.deb包。sudodpkg-i~/example.deb如果在安装过程中遇到依赖问题,可以使用以下命令来修复:sudoapt-getinstall-f将flut...

Linux基础命令-sed命令(linux教程:sed命令的用法)

Sed全名streameditor流编辑器,它是一个强大的文本处理工具,它可以从文件中接受输入,也可以接受来自标准输入流的输入,它擅长取行。Sed的用途非常广泛,包括:1)文本替换2)选择性的输...

linux sed系列 第二篇:sed进阶技巧——地址定位与正则表达式

“上一篇我们掌握了sed的基础替换,如同获得了第一把钥匙。现在,让我们更进一步,学习如何精准锁定目标行,如同拥有了导航地图,让每一次操作都直击要害!”地址定位的四种维度sed的强大,很大程度上源...

火狐Firefox浏览器140发布:手动Unload标签页、优化翻译体验等

IT之家6月24日消息,Mozilla在发布版本139不到一个月后,推出了最新的开源网页浏览器Firefox140。新版本增加了手动Unload标签页的功能,优化了垂直标签页的调...

Linux 基本正则表达式及扩展正则表达式功能举例

在Linux中,正则表达式(RegularExpression)是一种强大的模式匹配工具,用于在文本中查找、匹配和处理特定模式的字符串。Linux支持两种类型的正则表达式:基本正则表达式(Basic...

linux下find命令的经典26个使用示例

简介find命令是基于unix的操作系统中常用的工具之一。顾名思义,它在目录层次结构中查找文件和目录。用户可以传递不同的参数,并根据文件的名称、扩展名、类型、大小、权限、修改时间、所有者、组等搜索文件...

linux运维中特殊符号的应用与实践

路径位置类的特殊符号(1)、波浪线(~)在linux系统的命令行中,~表示用户的家目录,超级用户为/root,普通用户为/home。假设我当前目录在usr/local下[root@xrylocal]...

开源框架log4cpp实战(开源gui框架)

1.Log4cpp使用Log4cpp中主要包含Category(种类),Appender(附加器),Layout(布局),Priorty(优先级),NDC(嵌套的诊断上下文)。Category、App...

Linux find命令详解(linux find -l)

一、命令介绍Linuxfind命令是类unix操作系统中最重要和最常用的命令行实用程序之一。find命令用于根据指定的条件搜索和定位与参数匹配的文件和目录列表。find命令提供了广泛的选项,允许用户...

Linux运维:单引号与双引号的使用(linux 单引号和双引号)

1、单引号的使用单引号可以将它中间的所有任意字符还原为字面意义,实现屏蔽Shell元字符的功能。注意不可以在两个单引号中间单独插入一个单引号,单引号必须成对出现。示例1:定义一个变量,并输出变量的...

Linux技巧:find 命令用法详细说明,看完会有收获

在Linux命令中,find是比较复杂难用的命令。使用该命令搜索文件时,常常发现自己找了一些例子能用,但稍微改一下条件,就搜不到想要的结果。下面会以一些实例来说明使用find命令的关键要点和...

Linux Shell中单引号、双引号、反引号的解释

1、单引号('')单引号所见即所得,直接显示单引号里的内容。即单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的。比如下面的例子,单引号所见即所得。2、双引号("...