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}"