Переход на SSH-ключи, удаление sshpass и архитектурное упрощение (v1.6.0)

This commit is contained in:
Petro1990 2026-03-13 22:36:39 +03:00
parent 23df39d38d
commit 3cbe2287c6
2 changed files with 59 additions and 121 deletions

View File

@ -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 <IP_VPS>`.
### Не работает 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

112
rproxy
View File

@ -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
}
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
}
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..."
msg "Настраиваю доступ по SSH-ключу для $v_host..."
# Копирование ключа (пароль запросит сама система)
local ssh_exec="/opt/bin/ssh"
[ ! -f "$ssh_exec" ] && ssh_exec="ssh"
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 || {
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 ! $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 "Ошибка подключения по ключу."
err "Ошибка подключения по ключу. Убедитесь, что пароль введен верно."
pause; return
fi
fi
# Сохраняем
# Сохраняем (БЕЗ ПАРОЛЯ)
cat > "$vps_file" <<EOF
VPS_HOST="$v_host"
VPS_PORT="$v_port"
VPS_USER="$v_user"
VPS_AUTH="$v_auth"
VPS_PASS="$v_pass"
VPS_AUTH="key"
EOF
chmod 600 "$vps_file"
msg "Профиль '$vps_id' сохранён."
msg "Профиль '$vps_id' сохранён (авторизация по ключу)."
# Настройка Nginx на новом VPS
msg "Настройка окружения на VPS..."
VPS_HOST="$v_host" VPS_PORT="$v_port" VPS_USER="$v_user" VPS_AUTH="$v_auth" VPS_PASS="$v_pass"
VPS_HOST="$v_host" VPS_PORT="$v_port" VPS_USER="$v_user" VPS_AUTH="key"
ssh_cmd "
if ! command -v nginx >/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