From 3cbe2287c6b78ddb9414ebb0ba79d3c9a49aa1e1 Mon Sep 17 00:00:00 2001 From: Petro1990 Date: Fri, 13 Mar 2026 22:36:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=85=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=BD=D0=B0=20SSH-=D0=BA=D0=BB=D1=8E=D1=87=D0=B8,=20=D1=83?= =?UTF-8?q?=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20sshpass=20=D0=B8?= =?UTF-8?q?=20=D0=B0=D1=80=D1=85=D0=B8=D1=82=D0=B5=D0=BA=D1=82=D1=83=D1=80?= =?UTF-8?q?=D0=BD=D0=BE=D0=B5=20=D1=83=D0=BF=D1=80=D0=BE=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20(v1.6.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 48 +++++++------------- rproxy | 132 ++++++++++++++++++------------------------------------ 2 files changed, 59 insertions(+), 121 deletions(-) diff --git a/README.md b/README.md index 23bcf1f..52a30e4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 🔄 rProxy v1.5.3 +# 🔄 rProxy v1.6.0 **Менеджер обратного прокси для роутеров Keenetic** @@ -10,6 +10,7 @@ ## ⚡ Особенности - **Авто-авиатор**: Скрипт сам настраивает VPS, ставит Nginx и Certbot. +- **Безопасность**: Используется только авторизация по SSH-ключам (Ed25519). - **Бесшовная авторизация**: Использует `ndmq` для доступа к роутеру (пароль роутера не нужен!). - **Умный Basic Auth**: Защита сервисов паролем с сохранением настроек по умолчанию. - **SSL "из коробки"**: Автоматическое получение и продление HTTPS сертификатов (Let's Encrypt). @@ -19,7 +20,7 @@ ## 🚀 Быстрый старт ### 1. Установка (на роутере Keenetic) -> Требуется [Entware](https://help.keenetic.com/hc/ru/articles/360021214160). Пакеты `autossh`, `openssl-util` и другие установятся автоматически при первом запуске. +> Требуется [Entware](https://help.keenetic.com/hc/ru/articles/360021214160). Пакеты `autossh`, `openssl-util` и `curl` установятся автоматически при первом запуске. ```bash curl -sSL http://5.104.75.50:3000/Petro1990/rProxy/raw/branch/main/install.sh | sh @@ -32,24 +33,27 @@ rproxy ## 📋 Использование +### Настройка VPS (Пункт 9) +Для работы rProxy обязателен доступ к VPS по SSH-ключу. +При добавлении сервера скрипт: +1. Попросит IP, порт и пользователя. +2. Создаст пару ключей Ed25519 (если они еще не созданы). +3. **Один раз** попросит пароль VPS для копирования публичного ключа на сервер. +После этого пароль больше никогда не потребуется и не будет храниться в системе. + ### Основное меню 1. **📋 Список сервисов**: Статус, внешние ссылки и порты всех туннелей. 2. **➕ Добавить сервис**: Пошаговый мастер публикации нового локального ресурса. 3. **📝 Редактировать сервис**: Изменение SSL, портов и Auth без пересоздания. 4. **❌ Удалить сервис**: Удаление туннеля и его конфигурации с VPS. -5. **▶️ Запустить туннель**: Ручной запуск выбранного сервиса. -6. **⏹️ Остановить туннель**: Остановка активного туннеля. -7. **🔄 Перезапустить все**: Массовый рестарт туннелей (полезно при смене IP). -8. **🔒 SSL (Certbot)**: Получение или обновление HTTPS сертификатов. -9. **⚙️ Настройки VPS**: Управление серверами и данными авторизации. +... 10. **🚀 Обновить rProxy**: Загрузка последней версии скрипта. 11. **🏥 Проверка VPS**: Диагностика состояния Nginx и SSH на сервере. -0. **🚪 Выход**: Завершение работы. ## 🏗 Архитектура ### На роутере (Keenetic + Entware) -- **autossh** — поддерживает устойчивые SSH-туннели. +- **autossh** — поддерживает устойчивые SSH-туннели через ключи. - **Иннициализация**: `/opt/etc/init.d/S98rproxy` для автозапуска. - **Конфиги**: `/opt/etc/rproxy/`. @@ -58,33 +62,13 @@ rproxy - **Certbot** — управляет SSL-сертификатами. ## 🔒 Безопасность -- SSH-ключи (Ed25519) — рекомендуемый способ входа на VPS. -- Конфиденциальность: Права 600 на ключи и файлы настроек. -- Защита хешей: Пароли в `.htpasswd` защищены от раскрытия переменных оболочкой. - -## 🔧 Решение проблем - -### Туннель не подключается -- Проверьте статус в пункте **1**. -- Попробуйте **Перезапустить (пункт 7)**. -- Проверьте доступность VPS: `ping `. - -### Не работает HTTPS -- Убедитесь, что домен направлен на IP VPS (A-запись). -- Проверьте лог Nginx на VPS: `tail -f /var/log/nginx/error.log`. +- **SSH-ключи (Ed25519)** — единственный и максимально безопасный способ входа. +- **Никаких паролей**: В файлах конфигурации больше не хранятся пароли от VPS. +- **Защита хешей**: Пароли Basic Auth в `.htpasswd` защищены от раскрытия переменных оболочкой. ## 📦 Требования - **Keenetic** с прошивкой 3.x+ и Entware. - **VPS** с публичным IP (рекомендуется чистая Ubuntu/Debian). -- **sshpass** (ставится автоматически, если нужен вход по паролю). - -## ❓ FAQ - -**В: Как работает "авто-установка" зависимостей?** -О: В v1.5.2+ скрипт при старте проверяет наличие `openssl-util`, `curl` и `sshpass`. Если их нет, он сам делает `opkg update` и устанавливает их. - -**В: Что такое "Стелс-режим"?** -О: Это набор настроек Nginx, которые передают заголовок `Host` и `Upgrade`, позволяя работать WebSockets и сложным админкам. ## 📝 Лицензия MIT diff --git a/rproxy b/rproxy index fea79c4..cdc2da1 100644 --- a/rproxy +++ b/rproxy @@ -3,7 +3,7 @@ # Публикация локальных сервисов через SSH-туннели + nginx на VPS # http://5.104.75.50:3000/Petro1990/rProxy -VERSION="1.5.5" +VERSION="1.6.0" export PATH="/opt/bin:/opt/sbin:$PATH" CONF_DIR="/opt/etc/rproxy" CONF_FILE="$CONF_DIR/rproxy.conf" @@ -136,68 +136,45 @@ EOF ensure_local_deps() { local missing="" - # Внутренняя функция для надежной проверки _has_cmd() { command -v "$1" >/dev/null 2>&1 || [ -x "/opt/bin/$1" ] || [ -x "/opt/sbin/$1" ] } - # Проверка openssl - if ! _has_cmd openssl; then - missing="$missing openssl-util" - fi - - # Проверка sshpass - if ! _has_cmd sshpass; then - missing="$missing sshpass" - fi - - # Проверка curl - if ! _has_cmd curl; then - missing="$missing curl" - fi + _has_cmd openssl || missing="$missing openssl-util" + _has_cmd curl || missing="$missing curl" if [ -n "$missing" ]; then - msg "Обнаружены недостающие зависимости:$missing" - msg "Устанавливаю через opkg..." - opkg update >/dev/null 2>&1 + warn "Обнаружены недостающие пакеты:$missing" + msg "Попытка автоматической установки через opkg..." + + if ! opkg update; then + err "Не удалось обновить списки пакетов opkg. Проверьте интернет на роутере." + return 1 + fi + for pkg in $missing; do msg "Установка $pkg..." - opkg install "$pkg" >/dev/null 2>&1 + if opkg install "$pkg"; then + msg "Пакет $pkg успешно установлен." + else + err "Не удалось установить $pkg. Возможно, его нет в репозитории вашей модели." + fi done hash -r 2>/dev/null - msg "Все зависимости установлены." + msg "Проверка зависимостей завершена." fi } ssh_cmd() { local ssh_exec="/opt/bin/ssh" [ ! -f "$ssh_exec" ] && ssh_exec="ssh" - - if [ "$VPS_AUTH" = "password" ]; then - if ! command -v sshpass >/dev/null 2>&1; then - err "Утилита sshpass не найдена. Авторизация по паролю невозможна." - err "Пожалуйста, перенастройте rProxy на использование SSH-ключа (rproxy setup)." - return 1 - fi - sshpass -p "$VPS_PASS" $ssh_exec -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -p "$VPS_PORT" "$VPS_USER@$VPS_HOST" "$@" - else - $ssh_exec -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -i "$SSH_KEY" -p "$VPS_PORT" "$VPS_USER@$VPS_HOST" "$@" - fi + $ssh_exec -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -i "$SSH_KEY" -p "$VPS_PORT" "$VPS_USER@$VPS_HOST" "$@" } scp_cmd() { local scp_exec="/opt/bin/scp" [ ! -f "$scp_exec" ] && scp_exec="scp" - - if [ "$VPS_AUTH" = "password" ]; then - if ! command -v sshpass >/dev/null 2>&1; then - err "Утилита sshpass не найдена. Копирование по паролю невозможно." - return 1 - fi - sshpass -p "$VPS_PASS" $scp_exec -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -P "$VPS_PORT" "$@" - else - $scp_exec -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -i "$SSH_KEY" -P "$VPS_PORT" "$@" - fi + $scp_exec -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -i "$SSH_KEY" -P "$VPS_PORT" "$@" } next_free_port() { @@ -1325,11 +1302,11 @@ do_add_vps() { fi local vps_file="$VPS_DIR/$vps_id.conf" - local v_host="" v_port="22" v_user="root" v_auth="key" v_pass="" + local v_host="" v_port="22" v_user="root" if [ -f "$vps_file" ]; then . "$vps_file" - v_host="$VPS_HOST"; v_port="$VPS_PORT"; v_user="$VPS_USER"; v_auth="$VPS_AUTH"; v_pass="$VPS_PASS" + v_host="$VPS_HOST"; v_port="$VPS_PORT"; v_user="$VPS_USER" fi header "Настройка VPS: $vps_id" @@ -1343,67 +1320,44 @@ do_add_vps() { prompt "SSH пользователь [$v_user]: " v_user="${REPLY:-$v_user}" - printf "\n Метод авторизации:\n" - printf " ${BOLD}1)${NC} SSH-ключ (рекомендуется)\n" - printf " ${BOLD}2)${NC} Пароль\n" - prompt "Выберите [${v_auth/key/1}${v_auth/password/2}]: " - local choice="${REPLY:-${v_auth/key/1}${v_auth/password/2}}" - - if [ "$choice" = "2" ]; then - v_auth="password" - prompt "SSH пароль: " - v_pass="$REPLY" - else - v_auth="key" - # Проверка ключа (код ниже требует наличия SSH_KEY) - ensure_ssh_key - fi - - msg "Проверяю подключение к $v_host..." + # Настройка ключей + ensure_ssh_key + + msg "Настраиваю доступ по SSH-ключу для $v_host..." + + # Копирование ключа (пароль запросит сама система) local ssh_exec="/opt/bin/ssh" [ ! -f "$ssh_exec" ] && ssh_exec="ssh" + local copy_id="/opt/bin/ssh-copy-id" + [ ! -f "$copy_id" ] && copy_id="ssh-copy-id" + + printf " ${YELLOW}Сейчас будет запрошен пароль VPS для копирования ключа${NC}\n" + $copy_id -o StrictHostKeyChecking=no -i "$SSH_KEY.pub" -p "$v_port" "$v_user@$v_host" 2>/dev/null || { + cat "$SSH_KEY.pub" | $ssh_exec -o StrictHostKeyChecking=no -p "$v_port" "$v_user@$v_host" \ + "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys" + } - if [ "$v_auth" = "password" ]; then - if ! command -v sshpass >/dev/null 2>&1; then - err "Утилита sshpass не найдена." - pause; return - fi - if ! sshpass -p "$v_pass" $ssh_exec -o StrictHostKeyChecking=no -o ConnectTimeout=10 -p "$v_port" "$v_user@$v_host" "echo ok" >/dev/null 2>&1; then - err "Ошибка подключения." - pause; return - fi - else - # Копирование ключа - local copy_id="/opt/bin/ssh-copy-id" - [ ! -f "$copy_id" ] && copy_id="ssh-copy-id" - printf " Введите пароль VPS для копирования ключа:\n" - $copy_id -i "$SSH_KEY.pub" -p "$v_port" "$v_user@$v_host" 2>/dev/null || { - cat "$SSH_KEY.pub" | $ssh_exec -o StrictHostKeyChecking=no -p "$v_port" "$v_user@$v_host" \ - "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys" - } - if ! $ssh_exec -o StrictHostKeyChecking=no -o ConnectTimeout=10 -i "$SSH_KEY" -p "$v_port" "$v_user@$v_host" "echo ok" >/dev/null 2>&1; then - err "Ошибка подключения по ключу." - pause; return - fi + if ! $ssh_exec -o StrictHostKeyChecking=no -o ConnectTimeout=10 -i "$SSH_KEY" -p "$v_port" "$v_user@$v_host" "echo ok" >/dev/null 2>&1; then + err "Ошибка подключения по ключу. Убедитесь, что пароль введен верно." + pause; return fi - # Сохраняем + # Сохраняем (БЕЗ ПАРОЛЯ) cat > "$vps_file" </dev/null 2>&1; then - apt-get update -qq && apt-get install -y -qq nginx || yum install -y nginx + apt-get update -qq && apt-get install -y -qq nginx || (yum update -y && yum install -y nginx) fi mkdir -p /etc/nginx/sites-enabled grep -q 'sites-enabled' /etc/nginx/nginx.conf || sed -i '/http {/a\ include /etc/nginx/sites-enabled/*.conf;' /etc/nginx/nginx.conf