修改端口管理函数, 增加检查防火墙状态
This commit is contained in:
+27
-20
@@ -124,39 +124,46 @@ port_manage() {
|
|||||||
echo "[OK] ufw 规则已更新 ($ACTION)"
|
echo "[OK] ufw 规则已更新 ($ACTION)"
|
||||||
|
|
||||||
else
|
else
|
||||||
# 兜底方案 (iptables)
|
# 防火墙未启用时,allow 操作直接跳过,deny 操作走 iptables 兜底
|
||||||
# allow 使用 -I (Insert) 插入到规则首行,deny 使用 -D (Delete)
|
if [ "$ACTION" == "allow" ]; then
|
||||||
local FLAG=$([ "$ACTION" == "allow" ] && echo "-I" || echo "-D")
|
echo "[!] 防火墙未启用,跳过防火墙规则配置"
|
||||||
sudo iptables $FLAG INPUT -p tcp --dport ${PORT} -j ACCEPT 2>/dev/null
|
else
|
||||||
sudo iptables $FLAG INPUT -p udp --dport ${PORT} -j ACCEPT 2>/dev/null
|
# 兜底方案 (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)"
|
echo "[OK] iptables 规则已执行 ($ACTION)"
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# 2. SELinux 逻辑处理
|
# 2. SELinux 逻辑处理(与防火墙状态无关,始终执行)
|
||||||
if command -v getenforce >/dev/null 2>&1; then
|
|
||||||
|
# getenforce 不存在说明未安装 SELinux,直接跳过
|
||||||
|
command -v getenforce >/dev/null 2>&1 || return 0
|
||||||
|
|
||||||
|
# Enforcing 模式才会拦截端口绑定,其他模式无需处理
|
||||||
local SELINUX_STATUS=$(getenforce)
|
local SELINUX_STATUS=$(getenforce)
|
||||||
if [ "$SELINUX_STATUS" == "Enforcing" ]; then
|
[ "$SELINUX_STATUS" == "Enforcing" ] || return 0
|
||||||
if command -v semanage >/dev/null 2>&1; then
|
|
||||||
|
# semanage 不存在时的兜底方案: 开启全局网络连接开关(粒度较粗)
|
||||||
|
if ! command -v semanage >/dev/null 2>&1; then
|
||||||
if [ "$ACTION" == "allow" ]; 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 -a -t http_port_t -p tcp ${PORT} 2>/dev/null || \
|
||||||
sudo semanage port -m -t http_port_t -p tcp ${PORT}
|
sudo semanage port -m -t http_port_t -p tcp ${PORT}
|
||||||
elif [ "$ACTION" == "deny" ]; then
|
elif [ "$ACTION" == "deny" ]; then
|
||||||
sudo semanage port -d -t http_port_t -p tcp ${PORT} 2>/dev/null
|
sudo semanage port -d -t http_port_t -p tcp ${PORT} 2>/dev/null
|
||||||
fi
|
fi
|
||||||
echo "[OK] SELinux 端口权限已更新 ($ACTION)"
|
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 配置文件中的监听端口,并开放对应防火墙规则
|
# 更新 sing-box 配置文件中的监听端口,并开放对应防火墙规则
|
||||||
# 参数1: 端口号(可选,不传则在指定范围内随机选取空闲端口)
|
# 参数1: 端口号(可选,不传则在指定范围内随机选取空闲端口)
|
||||||
|
|||||||
Reference in New Issue
Block a user