632 lines
24 KiB
Bash
632 lines
24 KiB
Bash
#!/bin/bash
|
||
|
||
# Установщик автономного менеджера SSH туннелей
|
||
# Использование: bash <(curl -s https://raw.githubusercontent.com/ВАШ_ЛОГИН/ВАШ_РЕПОЗИТОРИЙ/main/install_ssh_tunnel.sh)
|
||
|
||
# Цвета для вывода
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
CYAN='\033[0;36m'
|
||
NC='\033[0m'
|
||
BOLD='\033[1m'
|
||
|
||
# Логирование
|
||
LOG_FILE="/tmp/ssh_tunnel_install.log"
|
||
|
||
log_message() {
|
||
echo -e "${2:-$NC}[$(date '+%Y-%m-%d %H:%M:%S')] $1${NC}" | tee -a "$LOG_FILE"
|
||
}
|
||
|
||
clear
|
||
echo -e "${BOLD}${CYAN}════════════════════════════════════════════════════════════════${NC}"
|
||
echo -e "${BOLD}${CYAN} УСТАНОВКА АВТОНОМНОГО МЕНЕДЖЕРА SSH ТУННЕЛЕЙ ${NC}"
|
||
echo -e "${BOLD}${CYAN}════════════════════════════════════════════════════════════════${NC}"
|
||
echo ""
|
||
|
||
# Проверка прав root
|
||
if [[ $EUID -ne 0 ]]; then
|
||
echo -e "${RED}ОШИБКА: Этот скрипт требует прав root (sudo).${NC}"
|
||
echo "Пожалуйста, запустите снова:"
|
||
echo -e "${BOLD}sudo bash <(curl -s <URL_ВАШЕГО_СКРИПТА>)${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
# Функция проверки ошибок
|
||
check_error() {
|
||
if [ $? -ne 0 ]; then
|
||
log_message "ОШИБКА: $1" "$RED"
|
||
log_message "Подробности в логе: $LOG_FILE" "$YELLOW"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# Определение дистрибутива
|
||
detect_distro() {
|
||
log_message "Определение операционной системы..." "$CYAN"
|
||
|
||
if [ -f /etc/os-release ]; then
|
||
. /etc/os-release
|
||
OS=$ID
|
||
VERSION=$VERSION_ID
|
||
elif [ -f /etc/redhat-release ]; then
|
||
OS="rhel"
|
||
VERSION=$(cat /etc/redhat-release | sed 's/.*release \([0-9]\).*/\1/')
|
||
else
|
||
OS=$(uname -s)
|
||
VERSION=$(uname -r)
|
||
fi
|
||
|
||
log_message "Система: $OS $VERSION" "$GREEN"
|
||
}
|
||
|
||
# Установка зависимостей
|
||
install_dependencies() {
|
||
log_message "Установка необходимых зависимостей..." "$CYAN"
|
||
|
||
case $OS in
|
||
ubuntu|debian)
|
||
log_message "Обновление списка пакетов..." "$BLUE"
|
||
apt-get update 2>&1 | tee -a "$LOG_FILE"
|
||
|
||
log_message "Установка autossh, openssh-client и утилит..." "$BLUE"
|
||
apt-get install -y autossh openssh-client net-tools curl git 2>&1 | tee -a "$LOG_FILE"
|
||
check_error "Не удалось установить пакеты"
|
||
;;
|
||
|
||
centos|rhel|fedora|rocky|almalinux)
|
||
log_message "Установка autossh, openssh-clients и утилит..." "$BLUE"
|
||
if command -v dnf &> /dev/null; then
|
||
dnf install -y autossh openssh-clients net-tools curl git 2>&1 | tee -a "$LOG_FILE"
|
||
else
|
||
yum install -y autossh openssh-clients net-tools curl git 2>&1 | tee -a "$LOG_FILE"
|
||
fi
|
||
check_error "Не удалось установить пакеты"
|
||
;;
|
||
|
||
*)
|
||
log_message "Неизвестный дистрибутив. Попытка установки вручную..." "$YELLOW"
|
||
# Попытка установить autossh из исходников
|
||
if ! command -v autossh &> /dev/null; then
|
||
log_message "Установка autossh вручную..." "$BLUE"
|
||
curl -sSL http://www.harding.motd.ca/autossh/autossh-1.4g.tgz | tar -xz
|
||
cd autossh-1.4g || exit 1
|
||
./configure
|
||
make
|
||
make install
|
||
cd ..
|
||
fi
|
||
;;
|
||
esac
|
||
|
||
log_message "Зависимости успешно установлены!" "$GREEN"
|
||
}
|
||
|
||
# Настройка SSH
|
||
setup_ssh() {
|
||
log_message "Настройка SSH системы..." "$CYAN"
|
||
|
||
# Создание директорий SSH если их нет
|
||
mkdir -p /root/.ssh
|
||
chmod 700 /root/.ssh
|
||
|
||
# Запрос данных VPS
|
||
echo ""
|
||
echo -e "${BOLD}${YELLOW}════════════════════════════════════════════════════════════════${NC}"
|
||
echo -e "${BOLD}${YELLOW} НАСТРОЙКА ПОДКЛЮЧЕНИЯ К VPS ${NC}"
|
||
echo -e "${BOLD}${YELLOW}════════════════════════════════════════════════════════════════${NC}"
|
||
echo ""
|
||
|
||
read -p "Введите IP адрес или доменное имя VPS: " VPS_HOST
|
||
read -p "Введите порт SSH (по умолчанию 22): " VPS_PORT
|
||
VPS_PORT=${VPS_PORT:-22}
|
||
|
||
echo ""
|
||
echo -e "${CYAN}Выберите пользователя для подключения:${NC}"
|
||
echo "1) root (рекомендуется для полного доступа)"
|
||
echo "2) Другой пользователь"
|
||
read -p "Ваш выбор [1-2]: " USER_CHOICE
|
||
|
||
if [ "$USER_CHOICE" == "1" ]; then
|
||
VPS_USER="root"
|
||
echo -e "${YELLOW}Будет использоваться пользователь: root${NC}"
|
||
else
|
||
read -p "Введите имя пользователя: " VPS_USER
|
||
fi
|
||
|
||
# Проверка подключения
|
||
log_message "Проверка подключения к $VPS_USER@$VPS_HOST:$VPS_PORT..." "$BLUE"
|
||
if timeout 10 bash -c "</dev/tcp/$VPS_HOST/$VPS_PORT" 2>/dev/null; then
|
||
log_message "Порт $VPS_PORT доступен" "$GREEN"
|
||
else
|
||
log_message "Не удалось подключиться к порту $VPS_PORT" "$RED"
|
||
log_message "Проверьте: 1) Адрес VPS 2) Открыт ли порт 3) Брандмауэр" "$YELLOW"
|
||
read -p "Продолжить все равно? (y/n): " CONTINUE
|
||
if [[ ! "$CONTINUE" =~ ^[Yy]$ ]]; then
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
# Генерация SSH ключа
|
||
echo ""
|
||
log_message "Генерация SSH ключа RSA 4096 бит..." "$CYAN"
|
||
|
||
if [ -f "/root/.ssh/id_rsa" ]; then
|
||
echo -e "${YELLOW}SSH ключ уже существует.${NC}"
|
||
read -p "Сгенерировать новый? (y/n): " GEN_NEW
|
||
if [[ "$GEN_NEW" =~ ^[Yy]$ ]]; then
|
||
ssh-keygen -t rsa -b 4096 -N "" -f /root/.ssh/id_rsa -q
|
||
log_message "Новый SSH ключ сгенерирован" "$GREEN"
|
||
fi
|
||
else
|
||
ssh-keygen -t rsa -b 4096 -N "" -f /root/.ssh/id_rsa -q
|
||
log_message "SSH ключ сгенерирован" "$GREEN"
|
||
fi
|
||
|
||
# Настройка SSH конфигурации
|
||
log_message "Настройка конфигурации SSH..." "$BLUE"
|
||
|
||
# Создание конфига для root
|
||
cat > /root/.ssh/config << EOF
|
||
Host tunnel-vps
|
||
HostName $VPS_HOST
|
||
Port $VPS_PORT
|
||
User $VPS_USER
|
||
IdentityFile ~/.ssh/id_rsa
|
||
StrictHostKeyChecking no
|
||
UserKnownHostsFile /dev/null
|
||
ServerAliveInterval 30
|
||
ServerAliveCountMax 3
|
||
ConnectTimeout 10
|
||
TCPKeepAlive yes
|
||
IdentitiesOnly yes
|
||
|
||
Host *
|
||
StrictHostKeyChecking no
|
||
UserKnownHostsFile /dev/null
|
||
ServerAliveInterval 30
|
||
ServerAliveCountMax 3
|
||
EOF
|
||
|
||
chmod 600 /root/.ssh/config
|
||
|
||
# Копирование ключа на VPS
|
||
echo ""
|
||
log_message "Копирование SSH ключа на VPS ($VPS_USER@$VPS_HOST)..." "$CYAN"
|
||
echo -e "${YELLOW}Если запросит пароль, введите пароль от $VPS_USER на VPS${NC}"
|
||
echo ""
|
||
|
||
# Пытаемся скопировать ключ
|
||
if ssh-copy-id -p "$VPS_PORT" -i /root/.ssh/id_rsa.pub "$VPS_USER@$VPS_HOST" 2>&1 | tee -a "$LOG_FILE"; then
|
||
log_message "SSH ключ успешно скопирован на VPS!" "$GREEN"
|
||
else
|
||
log_message "Не удалось скопировать ключ через ssh-copy-id" "$YELLOW"
|
||
log_message "Попытка ручного копирования..." "$BLUE"
|
||
|
||
# Альтернативный метод
|
||
if [ -f "/root/.ssh/id_rsa.pub" ]; then
|
||
PUB_KEY=$(cat /root/.ssh/id_rsa.pub)
|
||
echo "Попытка добавить ключ вручную..."
|
||
|
||
# Пробуем добавить через SSH команду
|
||
ssh -p "$VPS_PORT" "$VPS_USER@$VPS_HOST" \
|
||
"mkdir -p ~/.ssh && chmod 700 ~/.ssh && \
|
||
echo '$PUB_KEY' >> ~/.ssh/authorized_keys && \
|
||
chmod 600 ~/.ssh/authorized_keys" 2>&1 | tee -a "$LOG_FILE"
|
||
|
||
if [ $? -eq 0 ]; then
|
||
log_message "Ключ успешно добавлен вручную!" "$GREEN"
|
||
else
|
||
log_message "Не удалось добавить ключ. Сделайте это вручную:" "$RED"
|
||
echo ""
|
||
echo -e "${BOLD}Публичный ключ:${NC}"
|
||
cat /root/.ssh/id_rsa.pub
|
||
echo ""
|
||
echo -e "${YELLOW}Добавьте этот ключ в ~/.ssh/authorized_keys на VPS${NC}"
|
||
read -p "Нажмите Enter после добавления ключа..."
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
# Тестовое подключение
|
||
log_message "Тестовое подключение к VPS..." "$BLUE"
|
||
if ssh -p "$VPS_PORT" -o BatchMode=yes -o ConnectTimeout=5 "$VPS_USER@$VPS_HOST" "echo 'SSH подключение успешно!'"; then
|
||
log_message "Тестовое подключение прошло успешно!" "$GREEN"
|
||
else
|
||
log_message "Тестовое подключение не удалось" "$YELLOW"
|
||
read -p "Продолжить установку? (y/n): " CONTINUE_INSTALL
|
||
if [[ ! "$CONTINUE_INSTALL" =~ ^[Yy]$ ]]; then
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
# Настройка для не-root пользователей (если запущено не из-под root)
|
||
if [[ $EUID -eq 0 ]] && [ -d "/home/" ]; then
|
||
log_message "Настройка SSH для всех пользователей системы..." "$CYAN"
|
||
|
||
# Копируем конфиг для всех домашних директорий
|
||
for HOME_DIR in /home/*; do
|
||
if [ -d "$HOME_DIR" ]; then
|
||
USER=$(basename "$HOME_DIR")
|
||
USER_SSH_DIR="$HOME_DIR/.ssh"
|
||
|
||
mkdir -p "$USER_SSH_DIR"
|
||
chmod 700 "$USER_SSH_DIR"
|
||
chown "$USER:$USER" "$USER_SSH_DIR"
|
||
|
||
# Копируем конфиг
|
||
cp /root/.ssh/config "$USER_SSH_DIR/config" 2>/dev/null
|
||
if [ -f "$USER_SSH_DIR/config" ]; then
|
||
chown "$USER:$USER" "$USER_SSH_DIR/config"
|
||
chmod 600 "$USER_SSH_DIR/config"
|
||
fi
|
||
|
||
# Копируем ключ если нужно
|
||
read -p "Скопировать SSH ключ для пользователя $USER? (y/n): " COPY_FOR_USER
|
||
if [[ "$COPY_FOR_USER" =~ ^[Yy]$ ]]; then
|
||
cp /root/.ssh/id_rsa* "$USER_SSH_DIR/" 2>/dev/null
|
||
chown -R "$USER:$USER" "$USER_SSH_DIR"
|
||
chmod 600 "$USER_SSH_DIR/id_rsa" 2>/dev/null
|
||
chmod 644 "$USER_SSH_DIR/id_rsa.pub" 2>/dev/null
|
||
fi
|
||
fi
|
||
done
|
||
fi
|
||
}
|
||
|
||
# Установка основного скрипта
|
||
install_main_script() {
|
||
log_message "Установка основного скрипта управления туннелями..." "$CYAN"
|
||
|
||
# Создание директорий
|
||
mkdir -p /opt/ssh_tunnel_manager
|
||
mkdir -p /var/log/ssh_tunnel
|
||
mkdir -p /etc/ssh_tunnel
|
||
|
||
# Скачивание или создание основного скрипта
|
||
# Здесь должен быть ваш основной скрипт из Git репозитория
|
||
# Для примера создадим базовую версию
|
||
|
||
cat > /opt/ssh_tunnel_manager/manager.sh << 'EOF'
|
||
#!/bin/bash
|
||
|
||
# Основной скрипт менеджера SSH туннелей
|
||
# Версия 2.0 - Полностью автономный
|
||
|
||
# Конфигурация
|
||
CONFIG_DIR="/etc/ssh_tunnel"
|
||
LOG_DIR="/var/log/ssh_tunnel"
|
||
SERVICE_DIR="/etc/systemd/system"
|
||
SCRIPT_DIR="/opt/ssh_tunnel_manager"
|
||
|
||
# Цвета
|
||
source "$SCRIPT_DIR/colors.sh" 2>/dev/null || {
|
||
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'; CYAN='\033[0;36m'; NC='\033[0m'; BOLD='\033[1m'
|
||
}
|
||
|
||
# Основное меню
|
||
show_menu() {
|
||
clear
|
||
echo -e "${BOLD}${CYAN}════════════════════════════════════════════════════════════════${NC}"
|
||
echo -e "${BOLD}${CYAN} АВТОНОМНЫЙ МЕНЕДЖЕР SSH ТУННЕЛЕЙ v2.0 ${NC}"
|
||
echo -e "${BOLD}${CYAN}════════════════════════════════════════════════════════════════${NC}"
|
||
echo ""
|
||
|
||
# Проверка статуса
|
||
check_system_status
|
||
|
||
echo ""
|
||
echo -e "${BOLD}${YELLOW}[1]${NC} Создать новый автономный туннель"
|
||
echo -e "${BOLD}${YELLOW}[2]${NC} Быстрый туннель (SSH 22 порт)"
|
||
echo -e "${BOLD}${YELLOW}[3]${NC} Управление существующими туннелями"
|
||
echo -e "${BOLD}${YELLOW}[4]${NC} Настройка автозапуска"
|
||
echo -e "${BOLD}${YELLOW}[5]${NC} Просмотр логов и мониторинг"
|
||
echo -e "${BOLD}${YELLOW}[6]${NC} Тестирование подключений"
|
||
echo -e "${BOLD}${YELLOW}[7]${NC} Настройка маршрутизации"
|
||
echo -e "${BOLD}${YELLOW}[8]${NC} Выход"
|
||
echo ""
|
||
read -p "Выберите опцию [1-8]: " choice
|
||
|
||
case $choice in
|
||
1) create_tunnel ;;
|
||
2) quick_ssh_tunnel ;;
|
||
3) manage_tunnels ;;
|
||
4) setup_autostart ;;
|
||
5) view_logs ;;
|
||
6) test_connections ;;
|
||
7) setup_routing ;;
|
||
8) exit 0 ;;
|
||
*) echo -e "${RED}Неверный выбор${NC}"; sleep 1 ;;
|
||
esac
|
||
}
|
||
|
||
# Остальные функции скрипта...
|
||
# Здесь должен быть полный код вашего менеджера туннелей
|
||
|
||
# Запуск меню
|
||
while true; do
|
||
show_menu
|
||
done
|
||
EOF
|
||
|
||
# Создание файла с цветами
|
||
cat > /opt/ssh_tunnel_manager/colors.sh << 'EOF'
|
||
#!/bin/bash
|
||
# Файл цветов для менеджера туннелей
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
CYAN='\033[0;36m'
|
||
PURPLE='\033[0;35m'
|
||
NC='\033[0m'
|
||
BOLD='\033[1m'
|
||
EOF
|
||
|
||
# Создание конфигурационного файла
|
||
if [ -n "$VPS_HOST" ] && [ -n "$VPS_USER" ]; then
|
||
cat > /etc/ssh_tunnel/default.conf << EOF
|
||
# Основная конфигурация SSH туннелей
|
||
DEFAULT_VPS_HOST="$VPS_HOST"
|
||
DEFAULT_VPS_PORT="$VPS_PORT"
|
||
DEFAULT_VPS_USER="$VPS_USER"
|
||
INSTALL_DATE="$(date '+%Y-%m-%d %H:%M:%S')"
|
||
AUTO_RECONNECT="true"
|
||
CHECK_INTERVAL="30"
|
||
EOF
|
||
fi
|
||
|
||
# Делаем скрипт исполняемым
|
||
chmod +x /opt/ssh_tunnel_manager/manager.sh
|
||
chmod +x /opt/ssh_tunnel_manager/colors.sh
|
||
|
||
# Создание символической ссылки
|
||
ln -sf /opt/ssh_tunnel_manager/manager.sh /usr/local/bin/tunnel-manager
|
||
|
||
log_message "Основной скрипт установлен в /opt/ssh_tunnel_manager/" "$GREEN"
|
||
}
|
||
|
||
# Настройка systemd служб
|
||
setup_systemd_services() {
|
||
log_message "Настройка systemd служб для автономной работы..." "$CYAN"
|
||
|
||
# Основная служба мониторинга
|
||
cat > /etc/systemd/system/tunnel-monitor.service << EOF
|
||
[Unit]
|
||
Description=Мониторинг и восстановление SSH туннелей
|
||
After=network-online.target
|
||
Wants=network-online.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
ExecStart=/opt/ssh_tunnel_manager/monitor.sh
|
||
Restart=always
|
||
RestartSec=30
|
||
User=root
|
||
|
||
StandardOutput=append:/var/log/ssh_tunnel/monitor.log
|
||
StandardError=append:/var/log/ssh_tunnel/monitor.log
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
|
||
# Скрипт мониторинга
|
||
cat > /opt/ssh_tunnel_manager/monitor.sh << 'EOF'
|
||
#!/bin/bash
|
||
# Скрипт мониторинга туннелей
|
||
|
||
LOG_FILE="/var/log/ssh_tunnel/monitor.log"
|
||
CONFIG_DIR="/etc/ssh_tunnel"
|
||
|
||
log() {
|
||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
|
||
}
|
||
|
||
check_tunnel() {
|
||
local config_file="$1"
|
||
local tunnel_name=$(basename "$config_file" .conf)
|
||
|
||
if [ ! -f "$config_file" ]; then
|
||
return 1
|
||
fi
|
||
|
||
source "$config_file"
|
||
|
||
# Проверяем, работает ли туннель
|
||
if ps aux | grep -v grep | grep -q "autossh.*$REMOTE_PORT.*$VPS_HOST"; then
|
||
# Проверяем доступность порта
|
||
if timeout 2 nc -z localhost "$LOCAL_PORT" 2>/dev/null; then
|
||
log "Туннель $tunnel_name: OK"
|
||
return 0
|
||
fi
|
||
fi
|
||
|
||
log "Туннель $tunnel_name: FAILED - перезапуск"
|
||
|
||
# Перезапускаем службу
|
||
if systemctl is-active --quiet "ssh-tunnel-$tunnel_name.service" 2>/dev/null; then
|
||
systemctl restart "ssh-tunnel-$tunnel_name.service"
|
||
else
|
||
# Запускаем туннель напрямую
|
||
/usr/bin/autossh -M 0 -N \
|
||
-o "ExitOnForwardFailure=yes" \
|
||
-o "ServerAliveInterval=30" \
|
||
-o "ServerAliveCountMax=3" \
|
||
-R "${REMOTE_PORT}:localhost:${LOCAL_PORT}" \
|
||
"${VPS_USER}@${VPS_HOST}" -p "${VPS_PORT}" &
|
||
fi
|
||
|
||
return 1
|
||
}
|
||
|
||
log "Запуск монитора SSH туннелей"
|
||
|
||
while true; do
|
||
# Проверяем все конфигурации
|
||
for config in "$CONFIG_DIR"/*.conf; do
|
||
if [ -f "$config" ]; then
|
||
check_tunnel "$config"
|
||
fi
|
||
done
|
||
|
||
sleep 60
|
||
done
|
||
EOF
|
||
|
||
chmod +x /opt/ssh_tunnel_manager/monitor.sh
|
||
|
||
# Создание таймера для периодической проверки
|
||
cat > /etc/systemd/system/tunnel-check.timer << EOF
|
||
[Unit]
|
||
Description=Периодическая проверка SSH туннелей
|
||
|
||
[Timer]
|
||
OnBootSec=5min
|
||
OnUnitActiveSec=5min
|
||
AccuracySec=1min
|
||
|
||
[Install]
|
||
WantedBy=timers.target
|
||
EOF
|
||
|
||
# Включение служб
|
||
systemctl daemon-reload
|
||
systemctl enable tunnel-monitor.service
|
||
systemctl enable tunnel-check.timer
|
||
systemctl start tunnel-monitor.service
|
||
systemctl start tunnel-check.timer
|
||
|
||
log_message "Systemd службы настроены и запущены" "$GREEN"
|
||
}
|
||
|
||
# Создание примера туннеля
|
||
create_example_tunnel() {
|
||
log_message "Создание примера SSH туннеля..." "$CYAN"
|
||
|
||
if [ -n "$VPS_HOST" ] && [ -n "$VPS_USER" ]; then
|
||
read -p "Создать пример туннеля для SSH (порт 22 -> 10022)? (y/n): " CREATE_EXAMPLE
|
||
|
||
if [[ "$CREATE_EXAMPLE" =~ ^[Yy]$ ]]; then
|
||
cat > /etc/ssh_tunnel/example_ssh.conf << EOF
|
||
# Пример туннеля для SSH доступа
|
||
TUNNEL_NAME="example_ssh"
|
||
VPS_HOST="$VPS_HOST"
|
||
VPS_PORT="$VPS_PORT"
|
||
VPS_USER="$VPS_USER"
|
||
LOCAL_PORT="22"
|
||
REMOTE_PORT="10022"
|
||
ENABLED="true"
|
||
EOF
|
||
|
||
# Создание службы для примера
|
||
cat > /etc/systemd/system/ssh-tunnel-example_ssh.service << EOF
|
||
[Unit]
|
||
Description=Пример SSH туннеля (22->10022)
|
||
After=network-online.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
EnvironmentFile=/etc/ssh_tunnel/example_ssh.conf
|
||
ExecStart=/usr/bin/autossh -M 0 -N \\
|
||
-o "ExitOnForwardFailure=yes" \\
|
||
-o "ServerAliveInterval=30" \\
|
||
-o "ServerAliveCountMax=3" \\
|
||
-R \${REMOTE_PORT}:localhost:\${LOCAL_PORT} \\
|
||
\${VPS_USER}@\${VPS_HOST} -p \${VPS_PORT}
|
||
Restart=always
|
||
RestartSec=10
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
|
||
systemctl daemon-reload
|
||
systemctl enable ssh-tunnel-example_ssh.service
|
||
systemctl start ssh-tunnel-example_ssh.service
|
||
|
||
log_message "Пример туннеля создан! Для подключения используйте:" "$GREEN"
|
||
echo -e "${BOLD}ssh -p 10022 $VPS_USER@$VPS_HOST${NC}"
|
||
fi
|
||
fi
|
||
}
|
||
|
||
# Завершение установки
|
||
finish_installation() {
|
||
echo ""
|
||
echo -e "${BOLD}${GREEN}════════════════════════════════════════════════════════════════${NC}"
|
||
echo -e "${BOLD}${GREEN} УСТАНОВКА УСПЕШНО ЗАВЕРШЕНА! ${NC}"
|
||
echo -e "${BOLD}${GREEN}════════════════════════════════════════════════════════════════${NC}"
|
||
echo ""
|
||
|
||
log_message "Итоги установки:" "$CYAN"
|
||
echo -e "${GREEN}✓${NC} Зависимости установлены"
|
||
echo -e "${GREEN}✓${NC} SSH ключи сгенерированы и настроены"
|
||
echo -e "${GREEN}✓${NC} Основной скрипт установлен: /opt/ssh_tunnel_manager/manager.sh"
|
||
echo -e "${GREEN}✓${NC} Systemd службы настроены"
|
||
echo -e "${GREEN}✓${NC} Автозапуск включен"
|
||
echo ""
|
||
|
||
if [ -n "$VPS_HOST" ]; then
|
||
echo -e "${BOLD}Информация о подключении:${NC}"
|
||
echo -e " VPS: $VPS_USER@$VPS_HOST:$VPS_PORT"
|
||
echo -e " Публичный ключ: /root/.ssh/id_rsa.pub"
|
||
echo ""
|
||
fi
|
||
|
||
echo -e "${BOLD}Команды для управления:${NC}"
|
||
echo -e " ${CYAN}tunnel-manager${NC} - запуск менеджера туннелей"
|
||
echo -e " ${CYAN}systemctl status tunnel-monitor${NC} - статус монитора"
|
||
echo -e " ${CYAN}journalctl -u tunnel-monitor -f${NC} - просмотр логов"
|
||
echo ""
|
||
echo -e "${BOLD}Автономная работа гарантирована!${NC}"
|
||
echo -e "Система автоматически запустится после перезагрузки."
|
||
echo ""
|
||
echo -e "${YELLOW}Полный лог установки: $LOG_FILE${NC}"
|
||
echo ""
|
||
|
||
# Запрос на перезагрузку
|
||
read -p "Перезагрузить систему для применения всех настроек? (y/n): " REBOOT_NOW
|
||
if [[ "$REBOOT_NOW" =~ ^[Yy]$ ]]; then
|
||
log_message "Перезагрузка системы по запросу пользователя..." "$YELLOW"
|
||
echo -e "${YELLOW}Система перезагрузится через 5 секунд...${NC}"
|
||
sleep 5
|
||
reboot
|
||
else
|
||
echo ""
|
||
echo -e "${GREEN}Для запуска менеджера выполните:${NC}"
|
||
echo -e "${BOLD}tunnel-manager${NC}"
|
||
echo ""
|
||
fi
|
||
}
|
||
|
||
# Главная функция установки
|
||
main_installation() {
|
||
log_message "Начало установки автономного менеджера SSH туннелей" "$CYAN"
|
||
|
||
# Определяем дистрибутив
|
||
detect_distro
|
||
|
||
# Устанавливаем зависимости
|
||
install_dependencies
|
||
|
||
# Настраиваем SSH
|
||
setup_ssh
|
||
|
||
# Устанавливаем основной скрипт
|
||
install_main_script
|
||
|
||
# Настраиваем systemd службы
|
||
setup_systemd_services
|
||
|
||
# Создаем пример туннеля
|
||
create_example_tunnel
|
||
|
||
# Завершаем установку
|
||
finish_installation
|
||
}
|
||
|
||
# Запуск установки
|
||
main_installation |