修改端口管理函数, 增加检查防火墙状态

This commit is contained in:
Olia Lisa
2026-05-20 09:30:14 +08:00
parent 15141286ed
commit 6ed6a52de6
+27 -20
View File
@@ -124,39 +124,46 @@ port_manage() {
echo "[OK] ufw 规则已更新 ($ACTION)"
else
# 兜底方案 (iptables)
# allow 使用 -I (Insert) 插入到规则首行,deny 使用 -D (Delete)
local FLAG=$([ "$ACTION" == "allow" ] && echo "-I" || echo "-D")
sudo iptables $FLAG INPUT -p tcp --dport ${PORT} -j ACCEPT 2>/dev/null
sudo iptables $FLAG INPUT -p udp --dport ${PORT} -j ACCEPT 2>/dev/null
# 防火墙未启用时,allow 操作直接跳过,deny 操作走 iptables 兜底
if [ "$ACTION" == "allow" ]; then
echo "[!] 防火墙未启用,跳过防火墙规则配置"
else
# 兜底方案 (iptables) —— 仅 deny 时执行
sudo iptables -D INPUT -p tcp --dport ${PORT} -j ACCEPT 2>/dev/null
sudo iptables -D INPUT -p udp --dport ${PORT} -j ACCEPT 2>/dev/null
echo "[OK] iptables 规则已执行 ($ACTION)"
fi
fi
# 2. SELinux 逻辑处理
if command -v getenforce >/dev/null 2>&1; then
# 2. SELinux 逻辑处理(与防火墙状态无关,始终执行)
# getenforce 不存在说明未安装 SELinux,直接跳过
command -v getenforce >/dev/null 2>&1 || return 0
# Enforcing 模式才会拦截端口绑定,其他模式无需处理
local SELINUX_STATUS=$(getenforce)
if [ "$SELINUX_STATUS" == "Enforcing" ]; then
if command -v semanage >/dev/null 2>&1; then
[ "$SELINUX_STATUS" == "Enforcing" ] || return 0
# semanage 不存在时的兜底方案: 开启全局网络连接开关(粒度较粗)
if ! command -v semanage >/dev/null 2>&1; then
if [ "$ACTION" == "allow" ]; then
# 尝试添加,若存在则尝试修改
echo "[!] 警告: 未找到 semanage,尝试开启全局网络连接开关..."
sudo setsebool -P httpd_can_network_connect 1
fi
return 0
fi
# 使用 semanage 精确管理端口标签
if [ "$ACTION" == "allow" ]; then
# 先尝试添加 (-a),若标签已存在则改用修改 (-m)
sudo semanage port -a -t http_port_t -p tcp ${PORT} 2>/dev/null || \
sudo semanage port -m -t http_port_t -p tcp ${PORT}
elif [ "$ACTION" == "deny" ]; then
sudo semanage port -d -t http_port_t -p tcp ${PORT} 2>/dev/null
fi
echo "[OK] SELinux 端口权限已更新 ($ACTION)"
else
# 如果没装 semanage,在 allow 时开启全局布尔值,deny 时通常保持不变以防影响其他业务
if [ "$ACTION" == "allow" ]; then
echo "[!] 警告: 未找到 semanage,尝试开启全局网络连接开关..."
sudo setsebool -P httpd_can_network_connect 1
fi
fi
fi
fi
}
# ==========================================
# 更新 sing-box 配置文件中的监听端口,并开放对应防火墙规则
# 参数1: 端口号(可选,不传则在指定范围内随机选取空闲端口)