diff --git a/bin/port.sh b/bin/port.sh index 39f68f4..4652302 100644 --- a/bin/port.sh +++ b/bin/port.sh @@ -124,38 +124,45 @@ 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 - echo "[OK] iptables 规则已执行 ($ACTION)" - fi - - # 2. SELinux 逻辑处理 - if command -v getenforce >/dev/null 2>&1; then - local SELINUX_STATUS=$(getenforce) - if [ "$SELINUX_STATUS" == "Enforcing" ]; then - if command -v semanage >/dev/null 2>&1; then - if [ "$ACTION" == "allow" ]; then - # 尝试添加,若存在则尝试修改 - 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 + # 防火墙未启用时,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 逻辑处理(与防火墙状态无关,始终执行) + + # getenforce 不存在说明未安装 SELinux,直接跳过 + command -v getenforce >/dev/null 2>&1 || return 0 + + # Enforcing 模式才会拦截端口绑定,其他模式无需处理 + local SELINUX_STATUS=$(getenforce) + [ "$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)" +} # ========================================== # 更新 sing-box 配置文件中的监听端口,并开放对应防火墙规则