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() {
|
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)"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user