fix(deploy): установщик сохраняет и восстанавливает чужие правила UFW

На общем сервере (VPS владельца) ufw reset удалял правила WireGuard и
wstunnel. Теперь перед сбросом снимается снимок правил без комментария
glchat, а после настройки они восстанавливаются.
This commit is contained in:
2026-09-19 20:23:18 +03:00
parent c5392349cd
commit b89a0abb44
+37
View File
@@ -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() { configure_ufw() {
[ "$ENABLE_UFW" = "true" ] || { [ "$ENABLE_UFW" = "true" ] || {
warn "UFW не настраиваем (--no-ufw)" 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" 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 return 0
fi fi
snapshot_foreign_ufw_rules
ufw --force reset >/dev/null 2>&1 || true ufw --force reset >/dev/null 2>&1 || true
ufw default deny incoming >/dev/null ufw default deny incoming >/dev/null
ufw default allow outgoing >/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 ufw allow "${TURN_RELAY_START}:${TURN_RELAY_END}/udp" comment 'turn-relay' >/dev/null
fi fi
ufw --force enable >/dev/null ufw --force enable >/dev/null
restore_foreign_ufw_rules
ok "UFW активен: $(ufw status | head -1)" ok "UFW активен: $(ufw status | head -1)"
} }