diff --git a/install_ssh_tunnel.sh b/install_ssh_tunnel.sh index ca322c4..34347cc 100644 --- a/install_ssh_tunnel.sh +++ b/install_ssh_tunnel.sh @@ -156,16 +156,105 @@ load_vps_settings() { # Функция отображения публичного ключа show_public_key() { echo -e "${BOLD}${CYAN}--- Публичный ключ для копирования на VPS ---${NC}" - if [ -f "/root/.ssh/id_rsa.pub" ]; then - echo -e "${GREEN}Ключ RSA:${NC}" - cat /root/.ssh/id_rsa.pub + if [ -f "/root/.ssh/id_rsa" ]; then + echo -e "${GREEN}Приватный ключ: /root/.ssh/id_rsa${NC}" + echo -e "${GREEN}Публичный ключ:${NC}" + cat /root/.ssh/id_rsa.pub 2>/dev/null || echo "Публичный ключ не найден" echo "" else - echo -e "${RED}Публичный ключ не найден. Сначала выполните установку.${NC}" + echo -e "${RED}SSH ключ не найден. Сначала выполните установку.${NC}" fi read_input "Нажмите Enter для продолжения..." } +# Функция проверки портов +check_ports() { + local LOCAL_PORT="$1" + local REMOTE_PORT="$2" + local VPS_HOST="$3" + local VPS_USER="$4" + local VPS_PORT="$5" + + echo -e "${CYAN}=== ПРОВЕРКА ПОРТОВ ===${NC}" + + # 1. Проверка локального порта + echo -e "\n${BLUE}1. Проверка локального порта $LOCAL_PORT:${NC}" + if command -v ss &> /dev/null; then + echo -e " ss -tlnp | grep :$LOCAL_PORT" + ss -tlnp | grep ":$LOCAL_PORT" || echo " Порт $LOCAL_PORT не слушает локально" + elif command -v netstat &> /dev/null; then + echo -e " netstat -tlnp | grep :$LOCAL_PORT" + netstat -tlnp 2>/dev/null | grep ":$LOCAL_PORT" || echo " Порт $LOCAL_PORT не слушает локально" + else + echo " Утилиты ss и netstat не найдены" + fi + + # 2. Проверка удаленного порта на VPS + echo -e "\n${BLUE}2. Проверка удаленного порта $REMOTE_PORT на VPS ($VPS_HOST):${NC}" + + if ! load_vps_settings; then + echo " Настройки VPS не загружены" + return 1 + fi + + # Проверка доступности VPS + echo -e " Проверка подключения к VPS..." + if timeout 5 nc -z "$VPS_HOST" "$VPS_PORT" 2>/dev/null; then + echo -e " ✓ VPS доступен на порту $VPS_PORT" + else + echo -e " ✗ VPS недоступен на порту $VPS_PORT" + return 1 + fi + + # Попробуем проверить порт на VPS через SSH + if [ -f "/root/.ssh/id_rsa" ]; then + echo -e " Проверка порта $REMOTE_PORT на VPS через SSH..." + local check_cmd="if command -v ss >/dev/null 2>&1; then ss -tlnp | grep ':$REMOTE_PORT'; elif command -v netstat >/dev/null 2>&1; then netstat -tlnp 2>/dev/null | grep ':$REMOTE_PORT'; else echo 'Не найдены утилиты для проверки портов'; fi" + + if output=$(timeout 10 ssh -p "$VPS_PORT" -i /root/.ssh/id_rsa -o ConnectTimeout=5 -o BatchMode=yes "$VPS_USER@$VPS_HOST" "$check_cmd" 2>/dev/null); then + if [ -n "$output" ]; then + echo -e " ✗ Порт $REMOTE_PORT на VPS уже занят:" + echo " $output" + else + echo -e " ✓ Порт $REMOTE_PORT на VPS свободен" + fi + else + echo -e " ⚠ Не удалось проверить порт на VPS (возможно, нет доступа по ключу)" + fi + else + echo -e " ⚠ SSH ключ не найден, проверка порта на VPS невозможна" + fi + + # 3. Проверка проброса через telnet/nc + echo -e "\n${BLUE}3. Проверка внешней доступности порта $REMOTE_PORT на VPS:${NC}" + echo -e " (Эта проверка работает только если на VPS настроен GatewayPorts=yes)" + if timeout 5 nc -zv "$VPS_HOST" "$REMOTE_PORT" 2>&1 | grep -q "succeeded"; then + echo -e " ✓ Порт $REMOTE_PORT открыт на VPS" + else + echo -e " ⚠ Порт $REMOTE_PORT не открыт на VPS (нормально для обратного туннеля)" + fi + + # 4. Проверка процесса autossh + echo -e "\n${BLUE}4. Проверка процессов autossh:${NC}" + if pgrep -f "autossh.*$REMOTE_PORT.*localhost:$LOCAL_PORT" > /dev/null; then + echo -e " ✓ Процесс autossh для туннеля $LOCAL_PORT->$REMOTE_PORT запущен" + ps aux | grep "autossh.*$REMOTE_PORT.*localhost:$LOCAL_PORT" | grep -v grep + else + echo -e " ✗ Процесс autossh для туннеля не найден" + fi + + # 5. Проверка SSH процессов + echo -e "\n${BLUE}5. Проверка SSH процессов для туннеля:${NC}" + if pgrep -f "ssh.*$REMOTE_PORT:localhost:$LOCAL_PORT" > /dev/null; then + echo -e " ✓ SSH процесс для туннеля запущен" + ps aux | grep "ssh.*$REMOTE_PORT:localhost:$LOCAL_PORT" | grep -v grep + else + echo -e " ✗ SSH процесс для туннеля не найден" + fi + + echo -e "${CYAN}=== КОНЕЦ ПРОВЕРКИ ===${NC}\n" +} + # Функция проверки SSH подключения с подробным выводом check_ssh_connection() { if ! load_vps_settings; then @@ -183,200 +272,95 @@ check_ssh_connection() { fi # Проверяем права на ключ - if [ "$(stat -c %a /root/.ssh/id_rsa 2>/dev/null)" != "600" ]; then - echo -e "${YELLOW}⚠ Предупреждение: Неправильные права на ключ (должны быть 600)${NC}" - chmod 600 /root/.ssh/id_rsa 2>/dev/null + local key_perms=$(stat -c %a /root/.ssh/id_rsa 2>/dev/null || echo "000") + if [ "$key_perms" != "600" ]; then + echo -e "${YELLOW}⚠ Предупреждение: Неправильные права на ключ ($key_perms, должны быть 600)${NC}" + chmod 600 /root/.ssh/id_rsa 2>/dev/null && echo " Права исправлены на 600" + fi + + # Проверяем наличие публичного ключа + if [ ! -f "/root/.ssh/id_rsa.pub" ]; then + echo -e "${YELLOW}⚠ Публичный ключ не найден. Генерируем...${NC}" + ssh-keygen -y -f /root/.ssh/id_rsa > /root/.ssh/id_rsa.pub 2>/dev/null fi # Выполняем тестовое подключение с подробным выводом echo -e "${BLUE}Выполняем тестовую команду на удаленном сервере...${NC}" - if output=$(timeout 15 ssh -p "$VPS_PORT" \ + # Сначала простой тест + echo -e "Тест 1: Проверка базового подключения..." + if timeout 10 ssh -p "$VPS_PORT" \ -o BatchMode=yes \ - -o ConnectTimeout=10 \ + -o ConnectTimeout=5 \ -o StrictHostKeyChecking=no \ -o UserKnownHostsFile=/dev/null \ -o IdentityFile=/root/.ssh/id_rsa \ - "$VPS_USER@$VPS_HOST" "echo 'SSH Connection Test: SUCCESS'; whoami; hostname" 2>&1); then + -o PasswordAuthentication=no \ + "$VPS_USER@$VPS_HOST" "echo 'SSH Connection Test: SUCCESS'; exit 0" 2>&1; then echo -e "${GREEN}✓ SSH подключение работает!${NC}" - echo -e "${CYAN}Ответ от сервера:${NC}" - echo "$output" - return 0 + + # Расширенный тест + echo -e "\nТест 2: Проверка возможности создания туннеля..." + if output=$(timeout 15 ssh -p "$VPS_PORT" \ + -o BatchMode=yes \ + -o ConnectTimeout=5 \ + -o StrictHostKeyChecking=no \ + -o UserKnownHostsFile=/dev/null \ + -o IdentityFile=/root/.ssh/id_rsa \ + -o PasswordAuthentication=no \ + -T \ + "$VPS_USER@$VPS_HOST" "echo 'Tunnel test: READY'; sleep 2; exit 0" 2>&1); then + + echo -e "${GREEN}✓ Туннелирование доступно${NC}" + return 0 + else + echo -e "${YELLOW}⚠ Проблемы с туннелированием${NC}" + echo "Вывод: $output" + return 1 + fi else + local ssh_output=$(timeout 10 ssh -p "$VPS_PORT" \ + -o BatchMode=yes \ + -o ConnectTimeout=5 \ + -o StrictHostKeyChecking=no \ + -o UserKnownHostsFile=/dev/null \ + -o IdentityFile=/root/.ssh/id_rsa \ + -o PasswordAuthentication=no \ + -v \ + "$VPS_USER@$VPS_HOST" "echo 'test'" 2>&1 | tail -20) + echo -e "${RED}✗ SSH подключение не работает${NC}" - echo -e "${YELLOW}Возможные причины:${NC}" + echo -e "${YELLOW}Последние строки лога SSH:${NC}" + echo "$ssh_output" + + echo -e "\n${YELLOW}Возможные причины:${NC}" echo "1. Ключ не скопирован на VPS" - echo "2. Порт $VPS_PORT закрыт на VPS" - echo "3. SSH сервер на VPS не запущен" - echo "4. Проблемы с сетью/файрволом" - echo "5. На VPS отключена аутентификация по паролю, а ключ не настроен" + echo "2. На VPS не разрешена аутентификация по ключу" + echo "3. Порт $VPS_PORT закрыт на VPS" + echo "4. SSH сервер на VPS не запущен" + echo "5. Проблемы с сетью/файрволом" + echo "6. Неправильные права на ключ" echo "" - echo -e "${YELLOW}Проверьте:${NC}" - echo "1. Что ключ скопирован на VPS: ssh-copy-id -p $VPS_PORT $VPS_USER@$VPS_HOST" - echo "2. Что порт $VPS_PORT открыт: nc -zv $VPS_HOST $VPS_PORT" - echo "3. Что SSH сервер запущен на VPS" - echo "4. Что на VPS разрешена аутентификация по паролю (PasswordAuthentication yes)" # Пробуем подключиться без ключа для диагностики - echo -e "\n${YELLOW}Проверка доступности порта...${NC}" + echo -e "${YELLOW}Проверка доступности порта...${NC}" if timeout 3 nc -zv "$VPS_HOST" "$VPS_PORT" 2>&1; then echo -e "${GREEN}✓ Порт $VPS_PORT доступен${NC}" else echo -e "${RED}✗ Порт $VPS_PORT недоступен${NC}" fi - return 1 - fi -} - -# Функция проверки и настройки SSH сервера на VPS -check_and_configure_vps_sshd() { - if ! load_vps_settings; then - log_message "Сначала необходимо настроить VPS (опция 1)." "$RED" - return 1 - fi - - local VPS_PASSWORD="$1" - - echo -e "${CYAN}Проверка и настройка SSH сервера на VPS...${NC}" - - # Создаем временный скрипт для настройки VPS - local SETUP_SCRIPT="/tmp/setup_vps_sshd_$(date +%s).sh" - cat > "$SETUP_SCRIPT" << 'EOF_VPS_SETUP' -#!/bin/bash - -# Настройка SSH сервера для поддержки многопользовательского доступа -# и работы туннелей с сохранением доступа по паролю - -SSHD_CONFIG="/etc/ssh/sshd_config" -BACKUP_FILE="${SSHD_CONFIG}.backup.$(date +%Y%m%d%H%M%S)" - -echo "=== Настройка SSH сервера на VPS ===" -echo "Создание резервной копии: $BACKUP_FILE" -cp "$SSHD_CONFIG" "$BACKUP_FILE" - -echo "Настройка параметров SSH для туннелей и многопользовательского доступа..." - -# Массив настроек, которые нужно применить -declare -A SSH_SETTINGS -SSH_SETTINGS=( - ["PasswordAuthentication"]="yes" - ["PubkeyAuthentication"]="yes" - ["PermitRootLogin"]="yes" - ["GatewayPorts"]="yes" - ["AllowTcpForwarding"]="yes" - ["PermitTunnel"]="yes" - ["ClientAliveInterval"]="30" - ["ClientAliveCountMax"]="3" - ["MaxSessions"]="20" - ["MaxStartups"]="20:30:100" - ["TCPKeepAlive"]="yes" - ["AllowStreamLocalForwarding"]="yes" - ["X11Forwarding"]="yes" - ["PrintMotd"]="no" - ["PrintLastLog"]="yes" - ["UsePAM"]="yes" - ["UseDNS"]="no" -) - -# Применяем настройки -for key in "${!SSH_SETTINGS[@]}"; do - value="${SSH_SETTINGS[$key]}" - - # Проверяем существует ли настройка - if grep -q "^#\?\s*$key" "$SSHD_CONFIG"; then - # Заменяем существующую настройку - sed -i "s/^#\?\s*$key.*/$key $value/" "$SSHD_CONFIG" - echo "Обновлено: $key $value" - else - # Добавляем новую настройку - echo "$key $value" >> "$SSHD_CONFIG" - echo "Добавлено: $key $value" - fi -done - -# Добавляем настройки для поддержки IPv4 -if ! grep -q "^AddressFamily" "$SSHD_CONFIG"; then - echo "AddressFamily inet" >> "$SSHD_CONFIG" - echo "Добавлено: AddressFamily inet" -fi - -# Проверяем конфигурацию -echo "" -echo "Проверка конфигурации SSH..." -if sshd -t; then - echo "✓ Конфигурация корректна" - - # Перезапускаем SSH сервер - echo "Перезапуск SSH сервера..." - if systemctl restart sshd 2>/dev/null || service ssh restart 2>/dev/null || /etc/init.d/ssh restart 2>/dev/null; then - echo "✓ SSH сервер перезапущен" - echo "" - echo "=== НАСТРОЙКИ ВЫПОЛНЕНЫ ===" - echo "SSH сервер настроен для:" - echo " - Поддержки обратных туннелей" - echo " - Многопользовательского доступа" - echo " - Аутентификации по паролю И по ключам" - echo " - Одновременных подключений с нескольких IP" - echo "" - echo "Резервная копия: $BACKUP_FILE" - else - echo "✗ Не удалось перезапустить SSH сервер" - echo "Выполните вручную: systemctl restart sshd" - fi -else - echo "✗ Ошибка в конфигурации SSH" - echo "Восстановление из резервной копии..." - cp "$BACKUP_FILE" "$SSHD_CONFIG" -fi -EOF_VPS_SETUP - - # Копируем скрипт на VPS и выполняем - echo "Копирование скрипта настройки на VPS..." - - if [ -n "$VPS_PASSWORD" ]; then - # Используем sshpass для передачи пароля - if command -v sshpass &> /dev/null; then - # Копируем скрипт на VPS - if sshpass -p "$VPS_PASSWORD" scp -P "$VPS_PORT" -o StrictHostKeyChecking=no "$SETUP_SCRIPT" "$VPS_USER@$VPS_HOST:/tmp/setup_vps_sshd.sh" 2>/dev/null; then - echo "✓ Скрипт скопирован на VPS" - - # Выполняем скрипт на VPS - echo "Выполнение настройки на VPS..." - if sshpass -p "$VPS_PASSWORD" ssh -p "$VPS_PORT" -o StrictHostKeyChecking=no "$VPS_USER@$VPS_HOST" "chmod +x /tmp/setup_vps_sshd.sh && sudo /tmp/setup_vps_sshd.sh" 2>&1; then - echo -e "${GREEN}✓ Настройка SSH сервера на VPS выполнена успешно${NC}" - else - echo -e "${YELLOW}⚠ Не удалось выполнить настройку автоматически${NC}" - echo -e "${YELLOW}Выполните настройку вручную на VPS${NC}" - fi - else - echo -e "${RED}✗ Не удалось скопировать скрипт на VPS${NC}" - fi + # Проверяем конфигурацию ключа + echo -e "\n${YELLOW}Проверка SSH ключа:${NC}" + if ssh-keygen -l -f /root/.ssh/id_rsa 2>/dev/null; then + echo -e "✓ Ключ валиден" else - echo -e "${YELLOW}⚠ sshpass не установлен. Невозможно автоматически настроить VPS${NC}" + echo -e "✗ Ключ поврежден или невалиден" fi - else - echo -e "${YELLOW}⚠ Пароль не указан. Невозможно автоматически настроить VPS${NC}" - echo -e "${YELLOW}Выполните настройку вручную:${NC}" - cat "$SETUP_SCRIPT" + + return 1 fi - - # Удаляем временный скрипт - rm -f "$SETUP_SCRIPT" - - echo "" - echo -e "${CYAN}Рекомендуемые настройки для VPS (/etc/ssh/sshd_config):${NC}" - echo " PasswordAuthentication yes" - echo " PubkeyAuthentication yes" - echo " PermitRootLogin yes" - echo " MaxSessions 20" - echo " MaxStartups 20:30:100" - echo " GatewayPorts yes" - echo " AllowTcpForwarding yes" - echo "" - echo -e "${YELLOW}После изменения настроек перезапустите SSH сервер:${NC}" - echo " systemctl restart sshd" } # --- Основные функции --- @@ -393,7 +377,7 @@ install_manager() { chmod 777 "$LOG_DIR" # Для удобства логирования # Установка зависимостей - log_message "Установка необходимых зависимостей (autossh, openssh-client)..." "$BLUE" + log_message "Установка необходимых зависимостей..." "$BLUE" # Определение дистрибутива local OS if [ -f /etc/os-release ]; then @@ -408,11 +392,11 @@ install_manager() { apt-get update 2>&1 | tee -a "$LOG_DIR/manager.log" check_error "Не удалось обновить список пакетов" - log_message "Установка autossh, openssh-client и sshpass..." "$BLUE" + log_message "Установка autossh, openssh-client, sshpass, netcat..." "$BLUE" apt-get install -y autossh openssh-client sshpass netcat 2>&1 | tee -a "$LOG_DIR/manager.log" check_error "Не удалось установить пакеты (apt)" elif [[ "$OS" == "centos" || "$OS" == "rhel" || "$OS" == "fedora" || "$OS" == "rocky" || "$OS" == "almalinux" ]]; then - log_message "Установка autossh, openssh-clients и sshpass..." "$BLUE" + log_message "Установка autossh, openssh-clients, sshpass, nc..." "$BLUE" if command -v dnf &> /dev/null; then dnf install -y autossh openssh-clients sshpass nc 2>&1 | tee -a "$LOG_DIR/manager.log" check_error "Не удалось установить пакеты (dnf)" @@ -421,7 +405,7 @@ install_manager() { check_error "Не удалось установить пакеты (yum)" fi else - log_message "ОШИБКА: Не удалось определить менеджер пакетов (apt, dnf, yum)." "$RED" + log_message "ОШИБКА: Не удалось определить менеджер пакетов." "$RED" log_message "Пожалуйста, установите autossh и openssh-client вручную." "$YELLOW" return 1 fi @@ -434,30 +418,28 @@ install_manager() { # Копирование скрипта в системный путь log_message "Копирование скрипта в $SCRIPT_PATH..." "$BLUE" - # Получаем путь к текущему скрипту - local SCRIPT_SOURCE - if [[ -f "$0" ]]; then - SCRIPT_SOURCE="$0" + + # Получаем содержимое текущего скрипта + local current_script + if [ -f "$0" ]; then + current_script="$0" else - # Если скрипт запущен через pipe, создаем временный файл - SCRIPT_SOURCE="/tmp/tunnel-manager-$(date +%s).sh" - cat > "$SCRIPT_SOURCE" << 'EOF' -# Скрипт будет заменен содержимым установщика -EOF + # Если скрипт запущен через pipe, читаем из stdin + current_script="/tmp/tunnel-manager-$(date +%s).sh" + cat > "$current_script" fi - # Копируем содержимое текущего скрипта - cat > "$SCRIPT_PATH" << 'EOFHDR' + # Копируем скрипт + cp "$current_script" "$SCRIPT_PATH" 2>/dev/null || { + # Если не удалось, создаем новый + cat > "$SCRIPT_PATH" << 'EOF' #!/bin/bash -# -# SSH Tunnel Manager - Установленная версия -# -EOFHDR +echo "SSH Tunnel Manager - Установленная версия" +echo "Используйте: sudo tunnel-manager menu" +EOF + } - # Добавляем основное содержимое скрипта - cat "$SCRIPT_SOURCE" >> "$SCRIPT_PATH" chmod +x "$SCRIPT_PATH" - log_message "Установка завершена. Теперь можно использовать команду: sudo tunnel-manager menu" "$GREEN" # Генерация SSH ключа @@ -472,6 +454,7 @@ EOFHDR # Настройка SSH конфига для стабильности log_message "Настройка SSH клиента для стабильности..." "$BLUE" + mkdir -p /root/.ssh cat > /root/.ssh/config << EOFCONFIG Host * StrictHostKeyChecking no @@ -485,14 +468,10 @@ Host * ControlMaster auto ControlPath ~/.ssh/control-%r@%h:%p ControlPersist 10m - # Дополнительные настройки стабильности IPQoS throughput Compression yes GSSAPIAuthentication no AddressFamily inet - Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr - MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com - KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256 EOFCONFIG chmod 600 /root/.ssh/config log_message "Конфигурация SSH клиента обновлена." "$GREEN" @@ -562,22 +541,10 @@ configure_local_sshd() { local SSHD_CONFIG="/etc/ssh/sshd_config" if [ ! -f "$SSHD_CONFIG" ]; then - log_message "ОШИБКА: Файл конфигурации SSHD не найден: $SSHD_CONFIG" "$RED" - log_message "Попытка найти альтернативный путь..." "$YELLOW" - - # Пробуем найти sshd_config - SSHD_CONFIG=$(find /etc -name "sshd_config" 2>/dev/null | head -1) - - if [ -z "$SSHD_CONFIG" ]; then - SSHD_CONFIG=$(find /etc/ssh -name "sshd_config" 2>/dev/null | head -1) - fi - - if [ -z "$SSHD_CONFIG" ] || [ ! -f "$SSHD_CONFIG" ]; then - log_message "Не удалось найти файл конфигурации SSHD. Создаем новый." "$YELLOW" - mkdir -p /etc/ssh - SSHD_CONFIG="/etc/ssh/sshd_config" - # Создаем базовую конфигурацию - cat > "$SSHD_CONFIG" << 'EOFSSHD' + log_message "Файл конфигурации SSHD не найден. Создаем базовый..." "$YELLOW" + mkdir -p /etc/ssh + SSHD_CONFIG="/etc/ssh/sshd_config" + cat > "$SSHD_CONFIG" << 'EOFSSHD' # SSH Server Configuration Port 22 Protocol 2 @@ -589,13 +556,12 @@ HostKey /etc/ssh/ssh_host_ed25519_key SyslogFacility AUTH LogLevel INFO -# Authentication: +# Authentication LoginGraceTime 120 PermitRootLogin yes StrictModes yes PasswordAuthentication yes PubkeyAuthentication yes -AuthenticationMethods publickey,password # Allow forwardings for tunnels AllowTcpForwarding yes @@ -604,25 +570,15 @@ X11Forwarding yes X11DisplayOffset 10 X11UseLocalhost yes -# Allow client to pass locale environment variables AcceptEnv LANG LC_* - -# Allow override in ~/.ssh/authorized_keys AuthorizedKeysFile .ssh/authorized_keys - -# Don't allow empty passwords PermitEmptyPasswords no - -# Change to no to disable s/key passwords ChallengeResponseAuthentication no - -# GSSAPI options GSSAPIAuthentication no GSSAPICleanupCredentials yes - UsePAM yes -# Allow client alive +# Keep connections alive ClientAliveInterval 30 ClientAliveCountMax 3 @@ -634,16 +590,14 @@ MaxStartups 20:30:100 AllowStreamLocalForwarding yes PermitTunnel yes -# Subsystem Subsystem sftp /usr/lib/openssh/sftp-server EOFSSHD - log_message "Создан базовый конфигурационный файл SSH сервера." "$GREEN" - fi + log_message "Создан базовый конфигурационный файл SSH сервера." "$GREEN" fi # Создание резервной копии cp "$SSHD_CONFIG" "${SSHD_CONFIG}.backup.$(date +%Y%m%d%H%M%S)" - log_message "Создана резервная копия: ${SSHD_CONFIG}.backup.$(date +%Y%m%d%H%M%S)" "$YELLOW" + log_message "Создана резервная копия." "$YELLOW" # Настройки для приема обратных туннелей log_message "Настройка параметров для SSH туннелей..." "$BLUE" @@ -690,16 +644,8 @@ EOFSSHD log_message "Перезапуск SSH демона..." "$BLUE" if systemctl restart sshd 2>/dev/null || service ssh restart 2>/dev/null || /etc/init.d/ssh restart 2>/dev/null; then log_message "SSHD перезапущен с новыми настройками." "$GREEN" - - # Проверяем статус - if systemctl is-active sshd &> /dev/null || pgrep sshd &> /dev/null; then - log_message "SSH сервер успешно запущен." "$GREEN" - else - log_message "Предупреждение: Не удалось проверить статус SSH сервера." "$YELLOW" - fi else - log_message "ПРЕДУПРЕЖДЕНИЕ: Не удалось перезапустить SSHD. Возможно, потребуется ручной перезапуск." "$YELLOW" - log_message "Выполните: systemctl restart sshd или service ssh restart" "$YELLOW" + log_message "ПРЕДУПРЕЖДЕНИЕ: Не удалось перезапустить SSHD." "$YELLOW" fi } @@ -720,7 +666,6 @@ setup_vps() { fi echo -e "${BOLD}${CYAN}--- Настройка VPS ---${NC}" - echo -e "${YELLOW}Это настройка удаленного сервера (VPS), куда будут пробрасываться туннели${NC}" echo "" local VPS_HOST_TEMP @@ -756,13 +701,6 @@ setup_vps() { return 1 fi - # Дополнительная проверка, если пользователь выбрал "Другой пользователь", но не ввел имя - if [ "$USER_CHOICE" == "2" ] && [ -z "$VPS_USER" ]; then - log_message "ОШИБКА: Имя пользователя обязательно." "$RED" - read_input "Нажмите Enter для продолжения..." - return 1 - fi - # Сохранение настроек cat > "$VPS_CONFIG" << EOFSETTINGS # Настройки VPS для автономных туннелей @@ -791,43 +729,18 @@ EOFSETTINGS echo -e "${BLUE}Копирую ключ на VPS...${NC}" if sshpass -p "$VPS_PASSWORD" ssh-copy-id -p "$VPS_PORT" -i /root/.ssh/id_rsa.pub -o StrictHostKeyChecking=no "$VPS_USER@$VPS_HOST" 2>&1 | tee -a "$LOG_DIR/manager.log"; then log_message "SSH ключ успешно скопирован на VPS!" "$GREEN" - - # Предлагаем настроить SSH сервер на VPS для многопользовательского доступа - echo "" - echo -e "${CYAN}Настройка SSH сервера на VPS для поддержки:${NC}" - echo " - Многопользовательского доступа" - echo " - Одновременных подключений с нескольких мест" - echo " - Аутентификации по паролю И по ключам" - echo " - Обратных туннелей" - echo "" - - CONFIGURE_VPS=$(read_input "Настроить SSH сервер на VPS автоматически? (y/N): ") - if [[ "$CONFIGURE_VPS" =~ ^[Yy]$ ]]; then - check_and_configure_vps_sshd "$VPS_PASSWORD" - else - echo -e "${YELLOW}Пропущена автоматическая настройка VPS${NC}" - echo -e "${YELLOW}Важно! Убедитесь, что на VPS в /etc/ssh/sshd_config есть:${NC}" - echo " PasswordAuthentication yes" - echo " MaxSessions 20" - echo " MaxStartups 20:30:100" - fi else - log_message "ОШИБКА: Не удалось скопировать ключ через sshpass." "$RED" - log_message "Возможно, пароль неверен, или на VPS не установлен ssh-copy-id." "$YELLOW" - log_message "Вам может потребоваться скопировать ключ вручную:" "$YELLOW" - echo "" + log_message "Не удалось скопировать ключ через sshpass." "$RED" + echo -e "${YELLOW}Скопируйте ключ вручную:${NC}" cat /root/.ssh/id_rsa.pub - echo "" - echo -e "${YELLOW}Выполните на VPS команду:${NC}" - echo "mkdir -p ~/.ssh && echo '$(cat /root/.ssh/id_rsa.pub)' >> ~/.ssh/authorized_keys" fi else - log_message "ПРЕДУПРЕЖДЕНИЕ: sshpass не установлен. Невозможно скопировать ключ автоматически." "$YELLOW" - log_message "Вам потребуется скопировать ключ вручную:" "$YELLOW" + log_message "sshpass не установлен. Невозможно скопировать ключ автоматически." "$YELLOW" + echo -e "${YELLOW}Скопируйте ключ вручную:${NC}" cat /root/.ssh/id_rsa.pub fi else - log_message "Пароль не введен. Вам потребуется скопировать ключ вручную:" "$YELLOW" + log_message "Пароль не введен. Скопируйте ключ вручную:" "$YELLOW" cat /root/.ssh/id_rsa.pub fi @@ -839,78 +752,72 @@ EOFSETTINGS read_input "Нажмите Enter для продолжения..." } -# Функция для ручной настройки VPS SSH сервера -configure_vps_ssh_manually() { - echo -e "${BOLD}${CYAN}--- Ручная настройка SSH сервера на VPS ---${NC}" - echo "" - echo -e "${YELLOW}Для правильной работы туннелей и многопользовательского доступа,${NC}" - echo -e "${YELLOW}на VPS должны быть настроены следующие параметры в /etc/ssh/sshd_config:${NC}" - echo "" - echo -e "${GREEN}1. Разрешить аутентификацию по паролю:${NC}" - echo " PasswordAuthentication yes" - echo "" - echo -e "${GREEN}2. Разрешить аутентификацию по ключам:${NC}" - echo " PubkeyAuthentication yes" - echo "" - echo -e "${GREEN}3. Разрешить вход root:${NC}" - echo " PermitRootLogin yes" - echo "" - echo -e "${GREEN}4. Настройки для туннелей:${NC}" - echo " GatewayPorts yes" - echo " AllowTcpForwarding yes" - echo " PermitTunnel yes" - echo "" - echo -e "${GREEN}5. Настройки многопользовательского доступа:${NC}" - echo " MaxSessions 20" - echo " MaxStartups 20:30:100" - echo "" - echo -e "${GREEN}6. Дополнительные настройки:${NC}" - echo " ClientAliveInterval 30" - echo " ClientAliveCountMax 3" - echo " TCPKeepAlive yes" - echo "" +# Функция диагностики туннеля +diagnose_tunnel() { + local TUNNEL_ID="$1" - if load_vps_settings; then - echo -e "${CYAN}Ваш VPS: $VPS_USER@$VPS_HOST:$VPS_PORT${NC}" - echo "" - echo -e "${YELLOW}Команды для настройки VPS:${NC}" - echo "ssh -p $VPS_PORT $VPS_USER@$VPS_HOST" - echo "" - echo -e "${YELLOW}После подключения выполните на VPS:${NC}" - cat << 'EOF_VPS_COMMANDS' -# Создайте резервную копию конфигурации -sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup - -# Отредактируйте файл конфигурации -sudo nano /etc/ssh/sshd_config - -# Добавьте или измените следующие параметры: -PasswordAuthentication yes -PubkeyAuthentication yes -PermitRootLogin yes -GatewayPorts yes -AllowTcpForwarding yes -PermitTunnel yes -MaxSessions 20 -MaxStartups 20:30:100 -ClientAliveInterval 30 -ClientAliveCountMax 3 -TCPKeepAlive yes - -# После сохранения проверьте конфигурацию -sudo sshd -t - -# Если проверка прошла успешно, перезапустите SSH сервер -sudo systemctl restart sshd - -# Или для старых систем: -sudo service ssh restart -EOF_VPS_COMMANDS - else - echo -e "${RED}Сначала настройте VPS в основном меню (опция 1)${NC}" + if [ ! -f "$TUNNELS_DIR/$TUNNEL_ID.conf" ]; then + log_message "Туннель с ID '$TUNNEL_ID' не найден." "$RED" + return 1 fi - read_input "Нажмите Enter для продолжения..." + source "$TUNNELS_DIR/$TUNNEL_ID.conf" + + echo -e "${BOLD}${CYAN}=== ДИАГНОСТИКА ТУННЕЛЯ: $TUNNEL_NAME ===${NC}" + echo "" + + # 1. Проверка конфигурации + echo -e "${BLUE}1. Конфигурация туннеля:${NC}" + echo " ID: $TUNNEL_ID" + echo " Имя: $TUNNEL_NAME" + echo " Локальный порт: $LOCAL_PORT" + echo " Удаленный порт: $REMOTE_PORT" + echo " VPS: $VPS_USER@$VPS_HOST:$VPS_PORT" + echo " Создан: $CREATED" + echo "" + + # 2. Проверка службы systemd + echo -e "${BLUE}2. Проверка службы systemd:${NC}" + local SERVICE_NAME="tunnel-$TUNNEL_ID" + systemctl status "$SERVICE_NAME.service" --no-pager -l + + # 3. Проверка логов + echo -e "\n${BLUE}3. Последние логи туннеля:${NC}" + if [ -f "$LOG_DIR/$TUNNEL_ID.log" ]; then + tail -20 "$LOG_DIR/$TUNNEL_ID.log" + else + echo " Лог файл не найден" + fi + + # 4. Проверка процессов + echo -e "\n${BLUE}4. Проверка процессов:${NC}" + echo " autossh процессы:" + pgrep -af "autossh.*$TUNNEL_ID" || echo " Не найдены" + echo "" + echo " ssh процессы:" + pgrep -af "ssh.*$REMOTE_PORT.*localhost:$LOCAL_PORT" || echo " Не найдены" + + # 5. Проверка портов + echo -e "\n${BLUE}5. Проверка портов:${NC}" + check_ports "$LOCAL_PORT" "$REMOTE_PORT" "$VPS_HOST" "$VPS_USER" "$VPS_PORT" + + # 6. Ручной тест SSH соединения для туннеля + echo -e "${BLUE}6. Ручной тест SSH туннеля:${NC}" + echo -e "${YELLOW}Выполняем тестовую команду...${NC}" + + local test_cmd="ssh -v -N -o ExitOnForwardFailure=yes -o ServerAliveInterval=30 -o ConnectTimeout=10 -i /root/.ssh/id_rsa -R $REMOTE_PORT:localhost:$LOCAL_PORT -p $VPS_PORT $VPS_USER@$VPS_HOST" + echo "Команда: $test_cmd" + echo "" + echo -e "${YELLOW}Запускаем на 10 секунд... (Ctrl+C для остановки)${NC}" + + timeout 10 $test_cmd 2>&1 | head -50 + + echo -e "\n${CYAN}=== РЕКОМЕНДАЦИИ ===${NC}" + echo "1. Проверьте, что на VPS разрешены обратные туннели (GatewayPorts yes)" + echo "2. Убедитесь, что порт $REMOTE_PORT на VPS не занят" + echo "3. Проверьте права SSH ключа (должны быть 600)" + echo "4. Убедитесь, что локальный сервер слушает порт $LOCAL_PORT" + echo "" } # 3. Добавление нового туннеля @@ -924,7 +831,6 @@ add_tunnel() { echo -e "${BOLD}${CYAN}--- Добавление нового обратного туннеля (Local -> VPS) ---${NC}" log_message "VPS: $VPS_USER@$VPS_HOST:$VPS_PORT" "$YELLOW" - echo -e "${YELLOW}Туннель будет пробрасывать локальный порт на этом компьютере через VPS${NC}" echo "" local LOCAL_PORT="" @@ -999,20 +905,10 @@ StartLimitIntervalSec=0 [Service] Type=simple EnvironmentFile=$CONFIG_FILE -ExecStart=/usr/bin/autossh -M 0 -N \ - -o "ExitOnForwardFailure=yes" \ - -o "ServerAliveInterval=30" \ - -o "ServerAliveCountMax=3" \ - -o "StrictHostKeyChecking=no" \ - -o "UserKnownHostsFile=/dev/null" \ - -o "TCPKeepAlive=yes" \ - -o "ConnectTimeout=30" \ - -o "IdentityFile=/root/.ssh/id_rsa" \ - -R $REMOTE_PORT:localhost:$LOCAL_PORT \ - $VPS_USER@$VPS_HOST -p $VPS_PORT +ExecStart=/usr/bin/autossh -M 0 -N -o "ExitOnForwardFailure=yes" -o "ServerAliveInterval=30" -o "ServerAliveCountMax=3" -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile=/dev/null" -o "TCPKeepAlive=yes" -o "ConnectTimeout=30" -o "IdentityFile=/root/.ssh/id_rsa" -R $REMOTE_PORT:localhost:$LOCAL_PORT $VPS_USER@$VPS_HOST -p $VPS_PORT ExecReload=/bin/kill -HUP \$MAINPID Restart=always -RestartSec=10 +RestartSec=5 User=root StandardOutput=append:$LOG_DIR/$TUNNEL_ID.log StandardError=append:$LOG_DIR/$TUNNEL_ID.log @@ -1026,10 +922,15 @@ EOFSERVICE # Запуск и включение службы systemctl daemon-reload systemctl enable "$SERVICE_NAME.service" > /dev/null 2>&1 + + echo -e "${BLUE}Запуск туннеля...${NC}" systemctl start "$SERVICE_NAME.service" + sleep 2 + if systemctl is-active --quiet "$SERVICE_NAME.service"; then - log_message "Туннель '$TUNNEL_NAME' успешно запущен и включен в автозагрузку." "$GREEN" + log_message "Туннель '$TUNNEL_NAME' успешно запущен." "$GREEN" + echo "" echo -e "${BOLD}${CYAN}Информация о туннеле:${NC}" echo -e " Имя: $TUNNEL_NAME" @@ -1037,14 +938,24 @@ EOFSERVICE echo -e " Удаленный порт на VPS: $REMOTE_PORT" echo -e " VPS: $VPS_USER@$VPS_HOST:$VPS_PORT" echo "" - echo -e "${GREEN}Для доступа к локальному порту $LOCAL_PORT через VPS используйте:${NC}" + echo -e "${GREEN}Для доступа через VPS используйте:${NC}" echo -e "${BOLD} ssh -p $REMOTE_PORT $VPS_USER@$VPS_HOST${NC}" echo "" echo -e "${YELLOW}Логи туннеля: $LOG_DIR/$TUNNEL_ID.log${NC}" + echo -e "${YELLOW}Статус: systemctl status $SERVICE_NAME${NC}" + + # Показываем диагностику + echo "" + check_ports "$LOCAL_PORT" "$REMOTE_PORT" "$VPS_HOST" "$VPS_USER" "$VPS_PORT" else log_message "ОШИБКА: Не удалось запустить туннель '$TUNNEL_NAME'." "$RED" - log_message "Проверьте лог: tail -f $LOG_DIR/$TUNNEL_ID.log" "$YELLOW" - log_message "Проверьте подключение к VPS и права SSH ключа." "$YELLOW" + echo -e "${YELLOW}Проверьте логи: journalctl -u $SERVICE_NAME -n 50${NC}" + echo -e "${YELLOW}Или выполните диагностику туннеля${NC}" + + # Показываем последние логи + echo "" + echo -e "${RED}Последние логи службы:${NC}" + journalctl -u "$SERVICE_NAME" -n 20 --no-pager fi read_input "Нажмите Enter для продолжения..." @@ -1057,7 +968,7 @@ manage_tunnel() { local SERVICE_NAME="tunnel-$TUNNEL_ID" if [ ! -f "$TUNNELS_DIR/$TUNNEL_ID.conf" ]; then - log_message "ОШИБКА: Туннель с ID '$TUNNEL_ID' не найден." "$RED" + log_message "Туннель с ID '$TUNNEL_ID' не найден." "$RED" return 1 fi @@ -1065,9 +976,10 @@ manage_tunnel() { start|stop|restart) systemctl "$ACTION" "$SERVICE_NAME.service" log_message "Служба '$SERVICE_NAME' выполнила команду '$ACTION'." "$GREEN" + sleep 1 ;; status) - systemctl status "$SERVICE_NAME.service" + systemctl status "$SERVICE_NAME.service" --no-pager -l ;; remove) log_message "Остановка и удаление туннеля '$TUNNEL_ID'..." "$YELLOW" @@ -1194,7 +1106,8 @@ test_connections() { echo "2) Тест локальных портов туннелей" echo "3) Тест SSH ключа" echo "4) Тест доступности портов на VPS" - echo "5) Назад" + echo "5) Диагностика всех туннелей" + echo "6) Назад" echo "" test_choice=$(read_input "Выберите тест: ") @@ -1207,16 +1120,6 @@ test_connections() { 2) echo -e "${CYAN}Тест локальных портов туннелей:${NC}" local TUNNEL_DIR="/etc/tunnel-manager/tunnels" - local NC_CMD - if command -v nc &> /dev/null; then - NC_CMD="nc -z localhost" - elif command -v ncat &> /dev/null; then - NC_CMD="ncat -z localhost" - else - log_message "ОШИБКА: Утилита 'nc' или 'ncat' не найдена. Невозможно проверить порты." "$RED" - read_input "Нажмите Enter для продолжения..." - continue - fi for conf in "$TUNNEL_DIR"/*.conf; do if [ -f "$conf" ]; then @@ -1226,7 +1129,7 @@ test_connections() { TUNNEL_NAME=$(basename "$conf" .conf) echo -n " $TUNNEL_NAME (локальный порт $LOCAL_PORT): " - if timeout 2 $NC_CMD "$LOCAL_PORT" 2>/dev/null; then + if timeout 2 nc -z localhost "$LOCAL_PORT" 2>/dev/null; then echo -e "${GREEN}✓ Открыт${NC}" else echo -e "${RED}✗ Закрыт${NC}" @@ -1238,21 +1141,17 @@ test_connections() { 3) echo -e "${CYAN}Тест SSH ключа:${NC}" if [ -f "/root/.ssh/id_rsa" ]; then - echo -e "${GREEN}✓ SSH ключ существует${NC}" + echo -e "${GREEN}✓ Приватный ключ существует${NC}" echo -e " Путь: /root/.ssh/id_rsa" echo -e " Права: $(stat -c %a /root/.ssh/id_rsa 2>/dev/null || echo "неизвестно")" - if [ -f "/root/.ssh/id_rsa.pub" ]; then - echo -e "${GREEN}✓ Публичный ключ существует${NC}" - echo -e " Публичный ключ:" - head -c 100 /root/.ssh/id_rsa.pub - echo "..." + if ssh-keygen -l -f /root/.ssh/id_rsa 2>/dev/null; then + echo -e "${GREEN}✓ Ключ валиден${NC}" else - echo -e "${RED}✗ Публичный ключ не найден${NC}" + echo -e "${RED}✗ Ключ поврежден или невалиден${NC}" fi else echo -e "${RED}✗ SSH ключ не найден${NC}" - echo -e "${YELLOW}Выполните установку менеджера для генерации ключа${NC}" fi read_input "Нажмите Enter для продолжения..." ;; @@ -1290,6 +1189,19 @@ test_connections() { read_input "Нажмите Enter для продолжения..." ;; 5) + echo -e "${CYAN}Диагностика всех туннелей:${NC}" + for conf in "$TUNNELS_DIR"/*.conf; do + if [ -f "$conf" ]; then + local TUNNEL_ID + TUNNEL_ID=$(basename "$conf" .conf) + echo "" + diagnose_tunnel "$TUNNEL_ID" + echo "" + read_input "Нажмите Enter для следующего туннеля..." + fi + done + ;; + 6) return ;; *) @@ -1303,7 +1215,7 @@ test_connections() { # Функция настройки маршрутизации (iptables) setup_routing() { if ! command -v iptables &> /dev/null; then - log_message "ОШИБКА: Утилита 'iptables' не найдена. Установите ее для использования этой функции." "$RED" + log_message "Утилита 'iptables' не найдена." "$RED" read_input "Нажмите Enter для продолжения..." return fi @@ -1348,7 +1260,7 @@ setup_routing() { sudo iptables-save > /etc/iptables/rules.v4 log_message "Правила iptables сохранены в /etc/iptables/rules.v4." "$GREEN" else - log_message "ОШИБКА: Не найдена утилита для сохранения правил (netfilter-persistent или iptables-save)." "$RED" + log_message "Не найдена утилита для сохранения правил." "$RED" fi read_input "Нажмите Enter для продолжения..." ;; @@ -1378,30 +1290,15 @@ setup_vps_ssh_config() { echo -e "${CYAN}VPS: $VPS_USER@$VPS_HOST:$VPS_PORT${NC}" echo "" - echo "1) Автоматическая настройка SSH сервера на VPS" - echo "2) Ручная настройка SSH сервера на VPS (инструкции)" - echo "3) Проверить текущие настройки SSH на VPS" - echo "4) Назад" + echo "1) Показать текущие настройки SSH на VPS" + echo "2) Проверить SSH подключение" + echo "3) Назад" echo "" ssh_choice=$(read_input "Выберите действие: ") case $ssh_choice in 1) - echo -e "${YELLOW}Для автоматической настройки потребуется пароль от VPS${NC}" - VPS_PASSWORD=$(read_secret "Введите пароль для $VPS_USER@$VPS_HOST: ") - - if [ -n "$VPS_PASSWORD" ]; then - check_and_configure_vps_sshd "$VPS_PASSWORD" - else - echo -e "${RED}Пароль не введен. Невозможно выполнить автоматическую настройку.${NC}" - fi - read_input "Нажмите Enter для продолжения..." - ;; - 2) - configure_vps_ssh_manually - ;; - 3) echo -e "${CYAN}Текущие настройки SSH на VPS:${NC}" if [ -f "/root/.ssh/id_rsa" ]; then ssh -p "$VPS_PORT" -i /root/.ssh/id_rsa -o BatchMode=yes "$VPS_USER@$VPS_HOST" \ @@ -1411,7 +1308,11 @@ setup_vps_ssh_config() { fi read_input "Нажмите Enter для продолжения..." ;; - 4) + 2) + check_ssh_connection + read_input "Нажмите Enter для продолжения..." + ;; + 3) return ;; *) @@ -1428,7 +1329,7 @@ setup_local_ssh_config() { clear echo -e "${BOLD}${CYAN}Настройки локального SSH Демона (sshd)${NC}" echo -e "${YELLOW}====================================${NC}" - echo "1) Показать текущие настройки sshd (для туннелей)" + echo "1) Показать текущие настройки sshd" echo "2) Перезапустить SSH демон" echo "3) Проверить конфигурацию sshd" echo "4) Установить/переустановить SSH сервер" @@ -1441,13 +1342,12 @@ setup_local_ssh_config() { case $ssh_choice in 1) - echo -e "${CYAN}Текущие настройки sshd (GatewayPorts, AllowTcpForwarding):${NC}" + echo -e "${CYAN}Текущие настройки sshd:${NC}" if [ -f "/etc/ssh/sshd_config" ]; then grep -E "^(GatewayPorts|AllowTcpForwarding|PermitTunnel|AllowStreamLocalForwarding|PermitRootLogin|PasswordAuthentication)" /etc/ssh/sshd_config 2>/dev/null || - echo "Настройки не найдены или файл конфигурации отсутствует" + echo "Настройки не найдены" else echo "Файл /etc/ssh/sshd_config не найден" - echo "SSH сервер, вероятно, не установлен" fi read_input "Нажмите Enter для продолжения..." ;; @@ -1455,8 +1355,7 @@ setup_local_ssh_config() { if sudo systemctl restart sshd 2>/dev/null || sudo service ssh restart 2>/dev/null; then log_message "SSH демон перезапущен." "$GREEN" else - log_message "ОШИБКА: Не удалось перезапустить SSH демон." "$RED" - echo -e "${YELLOW}Попробуйте установить SSH сервер (опция 4)${NC}" + log_message "Не удалось перезапустить SSH демон." "$RED" fi read_input "Нажмите Enter для продолжения..." ;; @@ -1465,7 +1364,7 @@ setup_local_ssh_config() { if sudo sshd -t 2>/dev/null; then log_message "Конфигурация SSH корректна." "$GREEN" else - log_message "ОШИБКА: Ошибка в конфигурации SSH." "$RED" + log_message "Ошибка в конфигурации SSH." "$RED" fi else log_message "SSH сервер не установлен." "$RED" @@ -1523,7 +1422,7 @@ manage_tunnels_menu() { done if [ "$count" -eq 0 ]; then - log_message "Туннели не найдены. Возврат в главное меню." "$YELLOW" + log_message "Туннели не найдены." "$YELLOW" sleep 2 return fi @@ -1557,16 +1456,17 @@ manage_tunnels_menu() { # Показываем текущий статус echo -e "${CYAN}Статус службы:${NC}" - manage_tunnel "$TUNNEL_ID_MANAGE" "status" | head -20 + manage_tunnel "$TUNNEL_ID_MANAGE" "status" echo -e "\n${CYAN}Выберите действие:${NC}" echo " s) Статус (обновить)" echo " t) Старт" echo " p) Стоп" echo " r) Перезапуск" + echo " d) Диагностика" echo " e) Включить автозагрузку" - echo " d) Отключить автозагрузку" - echo " x) Удалить" + echo " x) Отключить автозагрузку" + echo " u) Удалить" echo " l) Просмотр логов" echo " b) Назад" @@ -1576,32 +1476,33 @@ manage_tunnels_menu() { s) ;; # Статус уже показан t) manage_tunnel "$TUNNEL_ID_MANAGE" "start" - sleep 2 ;; p) manage_tunnel "$TUNNEL_ID_MANAGE" "stop" - sleep 2 ;; r) manage_tunnel "$TUNNEL_ID_MANAGE" "restart" - sleep 2 + ;; + d) + diagnose_tunnel "$TUNNEL_ID_MANAGE" + read_input "Нажмите Enter для продолжения..." ;; e) systemctl enable "tunnel-$TUNNEL_ID_MANAGE.service" 2>/dev/null - log_message "Автозагрузка включена для туннеля $TUNNEL_ID_MANAGE" "$GREEN" + log_message "Автозагрузка включена" "$GREEN" sleep 1 ;; - d) + x) systemctl disable "tunnel-$TUNNEL_ID_MANAGE.service" 2>/dev/null - log_message "Автозагрузка отключена для туннеля $TUNNEL_ID_MANage" "$YELLOW" + log_message "Автозагрузка отключена" "$YELLOW" sleep 1 ;; - x) + u) CONFIRM_REMOVE=$(read_input "Вы уверены, что хотите удалить туннель $TUNNEL_ID_MANAGE? (y/N): ") if [[ "$CONFIRM_REMOVE" =~ ^[Yy]$ ]]; then manage_tunnel "$TUNNEL_ID_MANAGE" "remove" sleep 2 - return # Возврат в меню туннелей после удаления + return fi ;; l) @@ -1631,7 +1532,7 @@ main_menu() { while true; do clear echo -e "${BOLD}${CYAN}========================================================${NC}" - echo -e "${BOLD}${CYAN} SSH Tunnel Manager v2.0 (by Manus) ${NC}" + echo -e "${BOLD}${CYAN} SSH Tunnel Manager v2.1 (by Manus) ${NC}" echo -e "${BOLD}${CYAN}========================================================${NC}" # Проверяем наличие SSH ключа @@ -1667,7 +1568,7 @@ main_menu() { echo -e "4) ${BOLD}Просмотр логов и мониторинг${NC}" echo -e "5) ${BOLD}Тестирование подключений${NC}" echo -e "6) ${BOLD}Настройка маршрутизации (iptables)${NC}" - echo -e "7) ${BOLD}Настройки SSH Демона на VPS${NC} (Важно! Для многопользовательского доступа)" + echo -e "7) ${BOLD}Настройки SSH Демона на VPS${NC}" echo -e "8) ${BOLD}Настройки локального SSH Демона${NC}" echo -e "9) ${BOLD}Показать публичный ключ${NC} (Для копирования на VPS)" echo -e "0) ${BOLD}Выход${NC}" @@ -1700,7 +1601,7 @@ main_menu() { # --- Точка входа --- # Главное изменение: если скрипт запущен без аргументов, выполняем автоматическую установку и запуск меню if [[ $# -eq 0 ]]; then - echo -e "${BOLD}${CYAN}SSH Tunnel Manager v2.0${NC}" + echo -e "${BOLD}${CYAN}SSH Tunnel Manager v2.1${NC}" echo -e "Автоматический запуск установки и меню..." echo "" @@ -1727,7 +1628,7 @@ else main_menu ;; *) - echo -e "${BOLD}${CYAN}SSH Tunnel Manager v2.0${NC}" + echo -e "${BOLD}${CYAN}SSH Tunnel Manager v2.1${NC}" echo -e "Использование:" echo -e " 1. Запуск одной командой (автоустановка + меню):" echo -e " curl -s https://git.softuniq.eu/OpenDoor/vps_ssh_tunel/raw/branch/main/install_ssh_tunnel.sh | sudo bash"