一套脚本,一键执行常见防火墙操作:查询状态、开/关、防火墙自启动、开放/关闭端口。适用于麒麟
V10、CentOS、Ubuntu 和 macOS。
一、脚本核心功能
运维环境中往往混合使用多个发行版,防火墙命令( firewalld / ufw / pf )差异较大。
- 核心功能:
- 查询防火墙状态(已开启/已关闭/不支持/未知)
- 查询开机自启动状态(已开启/已关闭/不支持/未知)
- 开启/关闭 防火墙
- 设置/取消 开机自动启动
- 永久放行端口(TCP/UDP)
- 列出当前已放行端口(含协议/服务)
- 关闭指定端口(自动删除相关规则,无需再次选择协议)
二、环境准备
1. 脚本执行环境
- 必须用 Bash 运行(脚本首行
#!/usr/bin/env bash),不能用sh。 - 需要
sudo或 root 权限。
2. 各系统依赖
- 麒麟V10 / CentOS:
firewalld(firewall-cmd)
sudo yum install -y firewalld
sudo systemctl start firewalld
sudo systemctl enable firewalld
- Ubuntu:
ufw
sudo apt update
sudo apt install -y ufw
sudo ufw enable
- macOS:自带应用防火墙(
socketfilterfw)和 Packet Filter(pf,配置文件/etc/pf.conf)
3. 工具支持
timeout(大多数 Linux 已预装;如无则安装coreutils)。- 如脚本从 Windows 编辑后出现奇怪卡顿,执行:
dos2unix firewall_manager.sh
三、脚本核心思路
1. 跨平台检测
if [ "$(uname)" = "Darwin" ]; then
OS_TYPE="macos"
elif [ -f /etc/os-release ]; then
. /etc/os-release
case "$ID" in
kylin|kylin10|kylinv10) OS_TYPE="kylin" ;;
centos) OS_TYPE="centos" ;;
ubuntu) OS_TYPE="ubuntu" ;;
*) OS_TYPE="unknown" ;;
esac
else
OS_TYPE="unknown"
fi
2. 状态获取统一用 timeout 防卡死
firewalld:
STATE="$(timeout 3s firewall-cmd --state 2>/dev/null || echo "timeout")"
ufw:
STATUS_UFW="$(timeout 3s ufw status 2>/dev/null | head -n1 || echo "timeout")"
systemctl is-enabled:
EN="$(timeout 2s systemctl is-enabled ufw 2>/dev/null || echo "timeout")"
- macOS 直接用
socketfilterfw --getglobalstate查询 “State = 1/0”。
3. 端口关闭自动化(Ubuntu 下避免交互确认卡住):
while true; do
NUM="$(ufw status numbered | grep "${PORT}/" | head -n1 | sed -n 's/^\[ *\([0-9]\+\)\].*/\1/p')"
[ -z "$NUM" ] && break
yes | ufw delete "$NUM" >/dev/null
done
4. macOS pf 规则操作
- 备份
/etc/pf.conf:
cp /etc/pf.conf /etc/pf.conf.bak_$(date +%F_%T)
- 新增:
echo "pass in proto tcp from any to any port 8080" >> /etc/pf.conf
pfctl -f /etc/pf.conf
- 删除:
sed -i.bak "/port[[:space:]]*8080/d" /etc/pf.conf
pfctl -f /etc/pf.conf
四、使用步骤
1. 保存脚本并赋可执行权限
vim firewall_manager.sh
# 粘贴下方“完整脚本”内容并保存
chmod +x firewall_manager.sh
2. (如有 Windows 换行)转换格式
dos2unix firewall_manager.sh
3. 启动脚本(务必用 Bash)
sudo bash firewall_manager.sh
或者
./firewall_manager.sh
4. 交互示例
- 运行后菜单显示:

五、完整脚本(复制即用)
#!/usr/bin/env bash
#
# 文件名:firewall_manager.sh
# 说明:跨平台(麒麟V10、CentOS、Ubuntu、macOS)防火墙管理脚本
#
# 功能:
# 1. 显示防火墙状态(已开启/已关闭/不支持/未知)
# 2. 显示开机自启动状态(已开启/已关闭/不支持/未知)
# 3. 开启/关闭 防火墙
# 4. 设置/取消 开机自启动
# 5. 永久放行端口(TCP/UDP)
# 6. 查看已开放端口(数字+协议/服务)
# 7. 关闭指定端口(自动删除,非交互式)
#
# 注意:
# - 必须用 Bash 运行,不要用 sh:
# chmod +x firewall_manager.sh
# sudo bash firewall_manager.sh
# - 需 root 或 sudo 权限
# - 使用 timeout 防止命令卡住
# - Ubuntu 下 ufw delete 由 yes 自动确认
# --------------------- 判断操作系统 ---------------------
OS_TYPE=""
if [ "$(uname)" = "Darwin" ]; then
OS_TYPE="macos"
elif [ -f /etc/os-release

最低0.47元/天 解锁文章
931

被折叠的 条评论
为什么被折叠?



