fix(deploy): установщик сохраняет и восстанавливает чужие правила UFW
На общем сервере (VPS владельца) ufw reset удалял правила WireGuard и wstunnel. Теперь перед сбросом снимается снимок правил без комментария glchat, а после настройки они восстанавливаются.
This commit is contained in:
@@ -831,6 +831,41 @@ install_cli_and_units() {
|
||||
|
||||
# --- безопасность ---------------------------------------------------------
|
||||
|
||||
UFW_FOREIGN_FILE="/tmp/glchat-ufw-foreign.rules"
|
||||
|
||||
# snapshot_foreign_ufw_rules сохраняет правила, которые не принадлежат glchat:
|
||||
# установщик делает ufw reset, и на общем сервере (VPS) правила владельца
|
||||
# (WireGuard, wstunnel и т.п.) обязаны остаться на месте.
|
||||
snapshot_foreign_ufw_rules() {
|
||||
: >"$UFW_FOREIGN_FILE"
|
||||
ufw status 2>/dev/null | awk -F'# ' 'NF == 1 && /ALLOW|DENY|LIMIT|REJECT/ {print $0}' |
|
||||
sed 's/[[:space:]]*$//' >>"$UFW_FOREIGN_FILE" || true
|
||||
}
|
||||
|
||||
restore_foreign_ufw_rules() {
|
||||
[ -s "$UFW_FOREIGN_FILE" ] || return 0
|
||||
local restored=0 line to from
|
||||
while IFS= read -r line; do
|
||||
[ -n "$line" ] || continue
|
||||
to="$(printf '%s' "$line" | awk '{print $1}')"
|
||||
from="$(printf '%s' "$line" | sed -E 's/^[^ ]+[[:space:]]+(ALLOW|DENY|LIMIT|REJECT)[[:space:]]+(IN[[:space:]]+)?//')"
|
||||
[ -n "$to" ] || continue
|
||||
case "$to" in
|
||||
Anywhere | anywhere) continue ;;
|
||||
esac
|
||||
case "$from" in
|
||||
*" on "* | *"("* | "") from="$from" ;;
|
||||
esac
|
||||
if ufw allow from "$from" to any port "${to%%/*}" proto "${to##*/}" comment 'glchat:preserved' >/dev/null 2>&1; then
|
||||
restored=$((restored + 1))
|
||||
else
|
||||
warn "не удалось восстановить правило UFW: ${line}"
|
||||
fi
|
||||
done <"$UFW_FOREIGN_FILE"
|
||||
[ "$restored" -gt 0 ] && ok "восстановлено правил UFW владельца: ${restored}"
|
||||
return 0
|
||||
}
|
||||
|
||||
configure_ufw() {
|
||||
[ "$ENABLE_UFW" = "true" ] || {
|
||||
warn "UFW не настраиваем (--no-ufw)"
|
||||
@@ -841,6 +876,7 @@ configure_ufw() {
|
||||
log_file_only "DRY-RUN: ufw default deny incoming; allow ${SSH_PORT}, ${LIVEKIT_TCP_PORT}/tcp, ${LIVEKIT_UDP_PORT}/udp, TURN ${TURN_UDP_PORT}/udp, ${TURN_TLS_PORT}/tcp, relay ${TURN_RELAY_START}-${TURN_RELAY_END}/udp"
|
||||
return 0
|
||||
fi
|
||||
snapshot_foreign_ufw_rules
|
||||
ufw --force reset >/dev/null 2>&1 || true
|
||||
ufw default deny incoming >/dev/null
|
||||
ufw default allow outgoing >/dev/null
|
||||
@@ -858,6 +894,7 @@ configure_ufw() {
|
||||
ufw allow "${TURN_RELAY_START}:${TURN_RELAY_END}/udp" comment 'turn-relay' >/dev/null
|
||||
fi
|
||||
ufw --force enable >/dev/null
|
||||
restore_foreign_ufw_rules
|
||||
ok "UFW активен: $(ufw status | head -1)"
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user