Переход на SSH-ключи, удаление sshpass и архитектурное упрощение (v1.6.0)
This commit is contained in:
parent
23df39d38d
commit
3cbe2287c6
48
README.md
48
README.md
|
|
@ -1,4 +1,4 @@
|
||||||
# 🔄 rProxy v1.5.3
|
# 🔄 rProxy v1.6.0
|
||||||
|
|
||||||
**Менеджер обратного прокси для роутеров Keenetic**
|
**Менеджер обратного прокси для роутеров Keenetic**
|
||||||
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
|
|
||||||
## ⚡ Особенности
|
## ⚡ Особенности
|
||||||
- **Авто-авиатор**: Скрипт сам настраивает VPS, ставит Nginx и Certbot.
|
- **Авто-авиатор**: Скрипт сам настраивает VPS, ставит Nginx и Certbot.
|
||||||
|
- **Безопасность**: Используется только авторизация по SSH-ключам (Ed25519).
|
||||||
- **Бесшовная авторизация**: Использует `ndmq` для доступа к роутеру (пароль роутера не нужен!).
|
- **Бесшовная авторизация**: Использует `ndmq` для доступа к роутеру (пароль роутера не нужен!).
|
||||||
- **Умный Basic Auth**: Защита сервисов паролем с сохранением настроек по умолчанию.
|
- **Умный Basic Auth**: Защита сервисов паролем с сохранением настроек по умолчанию.
|
||||||
- **SSL "из коробки"**: Автоматическое получение и продление HTTPS сертификатов (Let's Encrypt).
|
- **SSL "из коробки"**: Автоматическое получение и продление HTTPS сертификатов (Let's Encrypt).
|
||||||
|
|
@ -19,7 +20,7 @@
|
||||||
## 🚀 Быстрый старт
|
## 🚀 Быстрый старт
|
||||||
|
|
||||||
### 1. Установка (на роутере Keenetic)
|
### 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
|
```bash
|
||||||
curl -sSL http://5.104.75.50:3000/Petro1990/rProxy/raw/branch/main/install.sh | sh
|
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. **📋 Список сервисов**: Статус, внешние ссылки и порты всех туннелей.
|
1. **📋 Список сервисов**: Статус, внешние ссылки и порты всех туннелей.
|
||||||
2. **➕ Добавить сервис**: Пошаговый мастер публикации нового локального ресурса.
|
2. **➕ Добавить сервис**: Пошаговый мастер публикации нового локального ресурса.
|
||||||
3. **📝 Редактировать сервис**: Изменение SSL, портов и Auth без пересоздания.
|
3. **📝 Редактировать сервис**: Изменение SSL, портов и Auth без пересоздания.
|
||||||
4. **❌ Удалить сервис**: Удаление туннеля и его конфигурации с VPS.
|
4. **❌ Удалить сервис**: Удаление туннеля и его конфигурации с VPS.
|
||||||
5. **▶️ Запустить туннель**: Ручной запуск выбранного сервиса.
|
...
|
||||||
6. **⏹️ Остановить туннель**: Остановка активного туннеля.
|
|
||||||
7. **🔄 Перезапустить все**: Массовый рестарт туннелей (полезно при смене IP).
|
|
||||||
8. **🔒 SSL (Certbot)**: Получение или обновление HTTPS сертификатов.
|
|
||||||
9. **⚙️ Настройки VPS**: Управление серверами и данными авторизации.
|
|
||||||
10. **🚀 Обновить rProxy**: Загрузка последней версии скрипта.
|
10. **🚀 Обновить rProxy**: Загрузка последней версии скрипта.
|
||||||
11. **🏥 Проверка VPS**: Диагностика состояния Nginx и SSH на сервере.
|
11. **🏥 Проверка VPS**: Диагностика состояния Nginx и SSH на сервере.
|
||||||
0. **🚪 Выход**: Завершение работы.
|
|
||||||
|
|
||||||
## 🏗 Архитектура
|
## 🏗 Архитектура
|
||||||
|
|
||||||
### На роутере (Keenetic + Entware)
|
### На роутере (Keenetic + Entware)
|
||||||
- **autossh** — поддерживает устойчивые SSH-туннели.
|
- **autossh** — поддерживает устойчивые SSH-туннели через ключи.
|
||||||
- **Иннициализация**: `/opt/etc/init.d/S98rproxy` для автозапуска.
|
- **Иннициализация**: `/opt/etc/init.d/S98rproxy` для автозапуска.
|
||||||
- **Конфиги**: `/opt/etc/rproxy/`.
|
- **Конфиги**: `/opt/etc/rproxy/`.
|
||||||
|
|
||||||
|
|
@ -58,33 +62,13 @@ rproxy
|
||||||
- **Certbot** — управляет SSL-сертификатами.
|
- **Certbot** — управляет SSL-сертификатами.
|
||||||
|
|
||||||
## 🔒 Безопасность
|
## 🔒 Безопасность
|
||||||
- SSH-ключи (Ed25519) — рекомендуемый способ входа на VPS.
|
- **SSH-ключи (Ed25519)** — единственный и максимально безопасный способ входа.
|
||||||
- Конфиденциальность: Права 600 на ключи и файлы настроек.
|
- **Никаких паролей**: В файлах конфигурации больше не хранятся пароли от VPS.
|
||||||
- Защита хешей: Пароли в `.htpasswd` защищены от раскрытия переменных оболочкой.
|
- **Защита хешей**: Пароли Basic Auth в `.htpasswd` защищены от раскрытия переменных оболочкой.
|
||||||
|
|
||||||
## 🔧 Решение проблем
|
|
||||||
|
|
||||||
### Туннель не подключается
|
|
||||||
- Проверьте статус в пункте **1**.
|
|
||||||
- Попробуйте **Перезапустить (пункт 7)**.
|
|
||||||
- Проверьте доступность VPS: `ping <IP_VPS>`.
|
|
||||||
|
|
||||||
### Не работает HTTPS
|
|
||||||
- Убедитесь, что домен направлен на IP VPS (A-запись).
|
|
||||||
- Проверьте лог Nginx на VPS: `tail -f /var/log/nginx/error.log`.
|
|
||||||
|
|
||||||
## 📦 Требования
|
## 📦 Требования
|
||||||
- **Keenetic** с прошивкой 3.x+ и Entware.
|
- **Keenetic** с прошивкой 3.x+ и Entware.
|
||||||
- **VPS** с публичным IP (рекомендуется чистая Ubuntu/Debian).
|
- **VPS** с публичным IP (рекомендуется чистая Ubuntu/Debian).
|
||||||
- **sshpass** (ставится автоматически, если нужен вход по паролю).
|
|
||||||
|
|
||||||
## ❓ FAQ
|
|
||||||
|
|
||||||
**В: Как работает "авто-установка" зависимостей?**
|
|
||||||
О: В v1.5.2+ скрипт при старте проверяет наличие `openssl-util`, `curl` и `sshpass`. Если их нет, он сам делает `opkg update` и устанавливает их.
|
|
||||||
|
|
||||||
**В: Что такое "Стелс-режим"?**
|
|
||||||
О: Это набор настроек Nginx, которые передают заголовок `Host` и `Upgrade`, позволяя работать WebSockets и сложным админкам.
|
|
||||||
|
|
||||||
## 📝 Лицензия
|
## 📝 Лицензия
|
||||||
MIT
|
MIT
|
||||||
|
|
|
||||||
132
rproxy
132
rproxy
|
|
@ -3,7 +3,7 @@
|
||||||
# Публикация локальных сервисов через SSH-туннели + nginx на VPS
|
# Публикация локальных сервисов через SSH-туннели + nginx на VPS
|
||||||
# http://5.104.75.50:3000/Petro1990/rProxy
|
# http://5.104.75.50:3000/Petro1990/rProxy
|
||||||
|
|
||||||
VERSION="1.5.5"
|
VERSION="1.6.0"
|
||||||
export PATH="/opt/bin:/opt/sbin:$PATH"
|
export PATH="/opt/bin:/opt/sbin:$PATH"
|
||||||
CONF_DIR="/opt/etc/rproxy"
|
CONF_DIR="/opt/etc/rproxy"
|
||||||
CONF_FILE="$CONF_DIR/rproxy.conf"
|
CONF_FILE="$CONF_DIR/rproxy.conf"
|
||||||
|
|
@ -136,68 +136,45 @@ EOF
|
||||||
ensure_local_deps() {
|
ensure_local_deps() {
|
||||||
local missing=""
|
local missing=""
|
||||||
|
|
||||||
# Внутренняя функция для надежной проверки
|
|
||||||
_has_cmd() {
|
_has_cmd() {
|
||||||
command -v "$1" >/dev/null 2>&1 || [ -x "/opt/bin/$1" ] || [ -x "/opt/sbin/$1" ]
|
command -v "$1" >/dev/null 2>&1 || [ -x "/opt/bin/$1" ] || [ -x "/opt/sbin/$1" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
# Проверка openssl
|
_has_cmd openssl || missing="$missing openssl-util"
|
||||||
if ! _has_cmd openssl; then
|
_has_cmd curl || missing="$missing curl"
|
||||||
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
|
|
||||||
|
|
||||||
if [ -n "$missing" ]; then
|
if [ -n "$missing" ]; then
|
||||||
msg "Обнаружены недостающие зависимости:$missing"
|
warn "Обнаружены недостающие пакеты:$missing"
|
||||||
msg "Устанавливаю через opkg..."
|
msg "Попытка автоматической установки через opkg..."
|
||||||
opkg update >/dev/null 2>&1
|
|
||||||
|
if ! opkg update; then
|
||||||
|
err "Не удалось обновить списки пакетов opkg. Проверьте интернет на роутере."
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
for pkg in $missing; do
|
for pkg in $missing; do
|
||||||
msg "Установка $pkg..."
|
msg "Установка $pkg..."
|
||||||
opkg install "$pkg" >/dev/null 2>&1
|
if opkg install "$pkg"; then
|
||||||
|
msg "Пакет $pkg успешно установлен."
|
||||||
|
else
|
||||||
|
err "Не удалось установить $pkg. Возможно, его нет в репозитории вашей модели."
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
hash -r 2>/dev/null
|
hash -r 2>/dev/null
|
||||||
msg "Все зависимости установлены."
|
msg "Проверка зависимостей завершена."
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
ssh_cmd() {
|
ssh_cmd() {
|
||||||
local ssh_exec="/opt/bin/ssh"
|
local ssh_exec="/opt/bin/ssh"
|
||||||
[ ! -f "$ssh_exec" ] && ssh_exec="ssh"
|
[ ! -f "$ssh_exec" ] && ssh_exec="ssh"
|
||||||
|
$ssh_exec -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -i "$SSH_KEY" -p "$VPS_PORT" "$VPS_USER@$VPS_HOST" "$@"
|
||||||
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() {
|
scp_cmd() {
|
||||||
local scp_exec="/opt/bin/scp"
|
local scp_exec="/opt/bin/scp"
|
||||||
[ ! -f "$scp_exec" ] && scp_exec="scp"
|
[ ! -f "$scp_exec" ] && scp_exec="scp"
|
||||||
|
$scp_exec -q -o StrictHostKeyChecking=no -o LogLevel=ERROR -i "$SSH_KEY" -P "$VPS_PORT" "$@"
|
||||||
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() {
|
next_free_port() {
|
||||||
|
|
@ -1325,11 +1302,11 @@ do_add_vps() {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local vps_file="$VPS_DIR/$vps_id.conf"
|
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
|
if [ -f "$vps_file" ]; then
|
||||||
. "$vps_file"
|
. "$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
|
fi
|
||||||
|
|
||||||
header "Настройка VPS: $vps_id"
|
header "Настройка VPS: $vps_id"
|
||||||
|
|
@ -1343,67 +1320,44 @@ do_add_vps() {
|
||||||
prompt "SSH пользователь [$v_user]: "
|
prompt "SSH пользователь [$v_user]: "
|
||||||
v_user="${REPLY:-$v_user}"
|
v_user="${REPLY:-$v_user}"
|
||||||
|
|
||||||
printf "\n Метод авторизации:\n"
|
# Настройка ключей
|
||||||
printf " ${BOLD}1)${NC} SSH-ключ (рекомендуется)\n"
|
ensure_ssh_key
|
||||||
printf " ${BOLD}2)${NC} Пароль\n"
|
|
||||||
prompt "Выберите [${v_auth/key/1}${v_auth/password/2}]: "
|
msg "Настраиваю доступ по SSH-ключу для $v_host..."
|
||||||
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..."
|
|
||||||
local ssh_exec="/opt/bin/ssh"
|
local ssh_exec="/opt/bin/ssh"
|
||||||
[ ! -f "$ssh_exec" ] && ssh_exec="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 ! $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
|
||||||
if ! command -v sshpass >/dev/null 2>&1; then
|
err "Ошибка подключения по ключу. Убедитесь, что пароль введен верно."
|
||||||
err "Утилита sshpass не найдена."
|
pause; return
|
||||||
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
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Сохраняем
|
# Сохраняем (БЕЗ ПАРОЛЯ)
|
||||||
cat > "$vps_file" <<EOF
|
cat > "$vps_file" <<EOF
|
||||||
VPS_HOST="$v_host"
|
VPS_HOST="$v_host"
|
||||||
VPS_PORT="$v_port"
|
VPS_PORT="$v_port"
|
||||||
VPS_USER="$v_user"
|
VPS_USER="$v_user"
|
||||||
VPS_AUTH="$v_auth"
|
VPS_AUTH="key"
|
||||||
VPS_PASS="$v_pass"
|
|
||||||
EOF
|
EOF
|
||||||
chmod 600 "$vps_file"
|
chmod 600 "$vps_file"
|
||||||
msg "Профиль '$vps_id' сохранён."
|
msg "Профиль '$vps_id' сохранён (авторизация по ключу)."
|
||||||
|
|
||||||
# Настройка Nginx на новом VPS
|
# Настройка Nginx на новом VPS
|
||||||
msg "Настройка окружения на 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 "
|
ssh_cmd "
|
||||||
if ! command -v nginx >/dev/null 2>&1; then
|
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
|
fi
|
||||||
mkdir -p /etc/nginx/sites-enabled
|
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
|
grep -q 'sites-enabled' /etc/nginx/nginx.conf || sed -i '/http {/a\ include /etc/nginx/sites-enabled/*.conf;' /etc/nginx/nginx.conf
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue