From 2d7d8406d234387c24f7bc6a870d5a6b707f9664 Mon Sep 17 00:00:00 2001 From: grendervill Date: Sat, 19 Sep 2026 20:51:50 +0300 Subject: [PATCH] =?UTF-8?q?fix(security):=20DOCKER-USER=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=BF=D1=83=D1=81=D0=BA=D0=B0=D0=B5=D1=82=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=B5=D0=BD=D0=BD=D1=83=D1=8E=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D1=81=D0=B5=D1=82=D1=8C=20(=D0=BF=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=D1=81=D0=B8=20=D0=BF=D0=BE=20WireGuard)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Правила блокировали 8080/7880 для всех, кроме docker-сетей, поэтому внешний прокси не мог дойти до приложения. Теперь разрешена подсеть --allow-from, правила снимаются перед повторным применением (не дублируются). --- deploy/install.sh | 6 ++++-- deploy/ufw-docker.sh | 40 +++++++++++++++++++++++++--------------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/deploy/install.sh b/deploy/install.sh index 400fab8..2aa1810 100755 --- a/deploy/install.sh +++ b/deploy/install.sh @@ -1247,8 +1247,9 @@ configure_docker_user_chain() { # Правила применяет отдельный скрипт: его же вызывает systemd-юнит # при загрузке, поэтому логика не дублируется в установщике. install -m 0755 "${TARGET_DIR}/ufw-docker.sh" /usr/local/sbin/glchat-docker-user - /usr/local/sbin/glchat-docker-user || warn "не удалось применить часть правил DOCKER-USER" - cat >/etc/systemd/system/glchat-docker-user.service <<'EOF' + GLCHAT_ALLOW_FROM="${ALLOW_FROM}" /usr/local/sbin/glchat-docker-user || + warn "не удалось применить часть правил DOCKER-USER" + cat >/etc/systemd/system/glchat-docker-user.service </dev/null 2>&1; then echo "glchat-docker-user: iptables не найден" >&2 @@ -17,27 +23,31 @@ if ! iptables -nL DOCKER-USER >/dev/null 2>&1; then exit 0 fi -# Идемпотентность: снимаем только свои правила. -while iptables -C DOCKER-USER -m comment --comment "glchat-managed" -j RETURN >/dev/null 2>&1; do - iptables -D DOCKER-USER -m comment --comment "glchat-managed" -j RETURN >/dev/null 2>&1 || break -done -while iptables -C DOCKER-USER -p tcp -m multiport --dports "${APP_PORT},${LIVEKIT_WS_PORT}" -m comment --comment "glchat-block-internal" -j DROP >/dev/null 2>&1; do - iptables -D DOCKER-USER -p tcp -m multiport --dports "${APP_PORT},${LIVEKIT_WS_PORT}" -m comment --comment "glchat-block-internal" -j DROP >/dev/null 2>&1 || break -done +# Идемпотентность: снимаем все ранее добавленные правила glchat. +while iptables -D DOCKER-USER -p tcp -m multiport --dports "${PORTS}" \ + -m comment --comment "glchat-block-internal" -j DROP >/dev/null 2>&1; do :; done +while iptables -D DOCKER-USER -p tcp -m multiport --dports "${PORTS}" \ + -m comment --comment "glchat-managed" -j RETURN >/dev/null 2>&1; do :; done docker_subnets="$(docker network inspect bridge --format '{{range .IPAM.Config}}{{.Subnet}} {{end}}' 2>/dev/null || true)" [ -n "$docker_subnets" ] || docker_subnets="172.16.0.0/12" -# Сначала блокируем внутренние порты для всех, затем разрешаем docker-подсети и localhost. -iptables -I DOCKER-USER 1 -p tcp -m multiport --dports "${APP_PORT},${LIVEKIT_WS_PORT}" \ - -m comment --comment "glchat-block-internal" -j DROP +# Порядок важен: сначала разрешения, затем блокировка всех остальных. for subnet in $docker_subnets; do - iptables -I DOCKER-USER 1 -s "$subnet" -p tcp -m multiport --dports "${APP_PORT},${LIVEKIT_WS_PORT}" \ + iptables -I DOCKER-USER 1 -s "$subnet" -p tcp -m multiport --dports "${PORTS}" \ -m comment --comment "glchat-managed" -j RETURN done -iptables -I DOCKER-USER 1 -s 127.0.0.0/8 -p tcp -m multiport --dports "${APP_PORT},${LIVEKIT_WS_PORT}" \ +for subnet in $ALLOWED_FROM; do + [ -n "$subnet" ] || continue + iptables -I DOCKER-USER 1 -s "$subnet" -p tcp -m multiport --dports "${PORTS}" \ + -m comment --comment "glchat-managed" -j RETURN +done +iptables -I DOCKER-USER 1 -s 127.0.0.0/8 -p tcp -m multiport --dports "${PORTS}" \ -m comment --comment "glchat-managed" -j RETURN -iptables -I DOCKER-USER 1 -i lo -p tcp -m multiport --dports "${APP_PORT},${LIVEKIT_WS_PORT}" \ +iptables -I DOCKER-USER 1 -i lo -p tcp -m multiport --dports "${PORTS}" \ -m comment --comment "glchat-managed" -j RETURN -echo "glchat-docker-user: правила применены (заблокированы ${APP_PORT}, ${LIVEKIT_WS_PORT} снаружи)" +iptables -A DOCKER-USER -p tcp -m multiport --dports "${PORTS}" \ + -m comment --comment "glchat-block-internal" -j DROP + +echo "glchat-docker-user: порты ${PORTS} закрыты снаружи; разрешены из 127.0.0.0/8, ${docker_subnets}, ${ALLOWED_FROM}"