diff --git a/install_ssh_tunnel.sh b/install_ssh_tunnel.sh index 33c1992..e5f94a8 100644 --- a/install_ssh_tunnel.sh +++ b/install_ssh_tunnel.sh @@ -381,7 +381,7 @@ EOF log_message "Настройки SSH сохранены в /etc/ssh_tunnel/vps_settings.conf" "$GREEN" } -# Установка основного скрипта +# Установка основного скрипта с полным меню install_main_script() { log_message "Установка основного скрипта управления туннелями..." "$CYAN" @@ -390,17 +390,12 @@ install_main_script() { mkdir -p /var/log/ssh_tunnel mkdir -p /etc/ssh_tunnel - # Проверяем, есть ли сохраненные настройки VPS - if [ -f /etc/ssh_tunnel/vps_settings.conf ]; then - source /etc/ssh_tunnel/vps_settings.conf - fi - - # Создание основного скрипта с улучшенной обработкой подключений - cat > /opt/ssh_tunnel_manager/manager.sh << EOF + # Создание основного скрипта с полным меню + cat > /opt/ssh_tunnel_manager/manager.sh << 'EOF' #!/bin/bash # Основной скрипт менеджера SSH туннелей -# Версия 2.1 - Улучшенная стабильность подключений +# Версия 3.0 - Полное меню управления # Конфигурация CONFIG_DIR="/etc/ssh_tunnel" @@ -409,10 +404,14 @@ 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' -} +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' # Загрузка настроек VPS если есть if [ -f "/etc/ssh_tunnel/vps_settings.conf" ]; then @@ -421,204 +420,86 @@ fi # Функция проверки подключения check_ssh_connection() { - if [ -z "\$VPS_HOST" ] || [ -z "\$VPS_USER" ]; then - echo -e "\${RED}Настройки VPS не найдены!\${NC}" + if [ -z "$VPS_HOST" ] || [ -z "$VPS_USER" ]; then + echo -e "${RED}Настройки VPS не найдены!${NC}" echo -e "Запустите установку заново или настройте VPS вручную." return 1 fi - echo -e "\${CYAN}Проверка подключения к \${VPS_USER}@\${VPS_HOST}:\${VPS_PORT:-22}...\${NC}" + echo -e "${CYAN}Проверка подключения к ${VPS_USER}@${VPS_HOST}:${VPS_PORT:-22}...${NC}" - if timeout 15 ssh -p "\${VPS_PORT:-22}" \\ - -o BatchMode=yes \\ - -o ConnectTimeout=10 \\ - -o ServerAliveInterval=30 \\ - "\${VPS_USER}@\${VPS_HOST}" \\ + if timeout 15 ssh -p "${VPS_PORT:-22}" \ + -o BatchMode=yes \ + -o ConnectTimeout=10 \ + -o ServerAliveInterval=30 \ + "${VPS_USER}@${VPS_HOST}" \ "echo 'Connected'" 2>/dev/null; then - echo -e "\${GREEN}✓ Подключение успешно\${NC}" + echo -e "${GREEN}✓ Подключение успешно${NC}" return 0 else - echo -e "\${RED}✗ Не удалось подключиться\${NC}" + echo -e "${RED}✗ Не удалось подключиться${NC}" return 1 fi } # Функция настройки нового VPS setup_new_vps() { - echo -e "\${BOLD}\${CYAN}Настройка нового VPS подключения\${NC}" - echo -e "\${YELLOW}========================================\${NC}" + echo -e "${BOLD}${CYAN}Настройка нового VPS подключения${NC}" + echo -e "${YELLOW}========================================${NC}" read -p "Введите IP адрес или домен VPS: " NEW_VPS_HOST read -p "Введите порт SSH (22): " NEW_VPS_PORT - NEW_VPS_PORT=\${NEW_VPS_PORT:-22} + NEW_VPS_PORT=${NEW_VPS_PORT:-22} read -p "Введите имя пользователя: " NEW_VPS_USER # Проверка подключения - echo -e "\${CYAN}Проверка подключения...\${NC}" - if timeout 10 ssh -p "\$NEW_VPS_PORT" \\ - -o ConnectTimeout=5 \\ - "\$NEW_VPS_USER@\$NEW_VPS_HOST" \\ + echo -e "${CYAN}Проверка подключения...${NC}" + if timeout 10 ssh -p "$NEW_VPS_PORT" \ + -o ConnectTimeout=5 \ + "$NEW_VPS_USER@$NEW_VPS_HOST" \ "echo 'Проверка успешна'" 2>/dev/null; then - echo -e "\${GREEN}✓ Подключение работает\${NC}" + echo -e "${GREEN}✓ Подключение работает${NC}" # Сохранение настроек cat > /etc/ssh_tunnel/vps_settings.conf << CONFIGEOF # Настройки VPS для автономных туннелей -VPS_HOST="\$NEW_VPS_HOST" -VPS_PORT="\$NEW_VPS_PORT" -VPS_USER="\$NEW_VPS_USER" -CONFIGURED_ON="\$(date '+%Y-%m-%d %H:%M:%S')" +VPS_HOST="$NEW_VPS_HOST" +VPS_PORT="$NEW_VPS_PORT" +VPS_USER="$NEW_VPS_USER" +CONFIGURED_ON="$(date '+%Y-%m-%d %H:%M:%S')" CONFIGEOF - echo -e "\${GREEN}Настройки сохранены!\${NC}" - export VPS_HOST="\$NEW_VPS_HOST" - export VPS_PORT="\$NEW_VPS_PORT" - export VPS_USER="\$NEW_VPS_USER" + echo -e "${GREEN}Настройки сохранены!${NC}" + export VPS_HOST="$NEW_VPS_HOST" + export VPS_PORT="$NEW_VPS_PORT" + export VPS_USER="$NEW_VPS_USER" else - echo -e "\${RED}Не удалось подключиться к VPS\${NC}" - echo -e "\${YELLOW}Проверьте:\${NC}" + echo -e "${RED}Не удалось подключиться к VPS${NC}" + echo -e "${YELLOW}Проверьте:${NC}" echo -e "1. Правильность адреса и порта" echo -e "2. Доступность VPS из сети" echo -e "3. Наличие SSH ключа в authorized_keys на VPS" fi -} - -# Основное меню -show_menu() { - clear - echo -e "\${BOLD}\${CYAN}════════════════════════════════════════════════════════════════\${NC}" - echo -e "\${BOLD}\${CYAN} АВТОНОМНЫЙ МЕНЕДЖЕР SSH ТУННЕЛЕЙ v2.1 \${NC}" - echo -e "\${BOLD}\${CYAN}════════════════════════════════════════════════════════════════\${NC}" - # Отображение текущих настроек VPS - if [ -n "\$VPS_HOST" ]; then - echo -e "\${CYAN}Текущий VPS: \${VPS_USER}@\${VPS_HOST}:\${VPS_PORT:-22}\${NC}" - else - echo -e "\${RED}VPS не настроен! Выберите опцию 9 для настройки.\${NC}" - fi - - echo "" - - # Проверка статуса подключения - if [ -n "\$VPS_HOST" ]; then - echo -e "\${CYAN}Проверка состояния подключения...\${NC}" - if check_ssh_connection; then - echo -e "\${GREEN}✓ Соединение с VPS активно\${NC}" - else - echo -e "\${RED}✗ Нет соединения с VPS\${NC}" - fi - echo "" - fi - - 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} Настройки SSH" - echo -e "\${BOLD}\${YELLOW}[9]\${NC} Настройка/смена VPS" - echo -e "\${BOLD}\${YELLOW}[0]\${NC} Выход" - echo "" - read -p "Выберите опцию [0-9]: " 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) setup_ssh_config ;; - 9) setup_new_vps ;; - 0) exit 0 ;; - *) echo -e "\${RED}Неверный выбор\${NC}"; sleep 1 ;; - esac -} - -# Пример функции создания туннеля -create_tunnel() { - echo -e "\${CYAN}Создание нового туннеля...\${NC}" - - if [ -z "\$VPS_HOST" ]; then - echo -e "\${RED}Сначала настройте VPS (опция 9)\${NC}" - sleep 2 - return - fi - - read -p "Введите локальный порт (например 22): " LOCAL_PORT - read -p "Введите удаленный порт на VPS (например 10022): " REMOTE_PORT - - echo -e "\${CYAN}Создание туннеля \$LOCAL_PORT -> \$REMOTE_PORT на \${VPS_HOST}...\${NC}" - - # Создание конфигурации - TUNNEL_ID="tunnel_\${REMOTE_PORT}_\$(date +%s)" - cat > "/etc/ssh_tunnel/\${TUNNEL_ID}.conf" << EOF -TUNNEL_ID="\$TUNNEL_ID" -VPS_HOST="\$VPS_HOST" -VPS_PORT="\$VPS_PORT" -VPS_USER="\$VPS_USER" -LOCAL_PORT="\$LOCAL_PORT" -REMOTE_PORT="\$REMOTE_PORT" -CREATED="\$(date '+%Y-%m-%d %H:%M:%S')" -EOF - - echo -e "\${GREEN}Туннель создан! Конфиг: /etc/ssh_tunnel/\${TUNNEL_ID}.conf\${NC}" - - # Создание службы - create_service "\$TUNNEL_ID" -} - -# Быстрый SSH туннель -quick_ssh_tunnel() { - echo -e "\${CYAN}Создание быстрого SSH туннеля...\${NC}" - - if [ -z "\$VPS_HOST" ]; then - echo -e "\${RED}Сначала настройте VPS (опция 9)\${NC}" - sleep 2 - return - fi - - REMOTE_PORT="10022" - LOCAL_PORT="22" - - echo -e "\${YELLOW}Будет создан туннель: localhost:22 -> \${VPS_HOST}:\${REMOTE_PORT}\${NC}" - - TUNNEL_ID="ssh_tunnel_\${REMOTE_PORT}" - cat > "/etc/ssh_tunnel/\${TUNNEL_ID}.conf" << EOF -TUNNEL_ID="\$TUNNEL_ID" -VPS_HOST="\$VPS_HOST" -VPS_PORT="\$VPS_PORT" -VPS_USER="\$VPS_USER" -LOCAL_PORT="\$LOCAL_PORT" -REMOTE_PORT="\$REMOTE_PORT" -CREATED="\$(date '+%Y-%m-%d %H:%M:%S')" -TYPE="ssh" -EOF - - echo -e "\${GREEN}SSH туннель создан!\${NC}" - echo -e "\${CYAN}Для подключения используйте:\${NC}" - echo -e "\${BOLD}ssh -p \$REMOTE_PORT \${VPS_USER}@\${VPS_HOST}\${NC}" - - create_service "\$TUNNEL_ID" + read -p "Нажмите Enter для продолжения..." } # Функция создания службы create_service() { - local tunnel_id="\$1" - local service_file="/etc/systemd/system/ssh-tunnel-\${tunnel_id}.service" + local tunnel_id="$1" + local service_file="/etc/systemd/system/ssh-tunnel-${tunnel_id}.service" - cat > "\$service_file" << EOF + source "/etc/ssh_tunnel/${tunnel_id}.conf" + + cat > "$service_file" << SERVICEEOF [Unit] -Description=SSH Tunnel: \$tunnel_id +Description=SSH Tunnel: $tunnel_id After=network-online.target Wants=network-online.target [Service] Type=simple -EnvironmentFile=/etc/ssh_tunnel/\${tunnel_id}.conf +EnvironmentFile=/etc/ssh_tunnel/${tunnel_id}.conf ExecStart=/usr/bin/autossh -M 0 -N \\ -o "ExitOnForwardFailure=yes" \\ -o "ServerAliveInterval=30" \\ @@ -633,77 +514,571 @@ Restart=always RestartSec=10 User=root -StandardOutput=append:/var/log/ssh_tunnel/\${tunnel_id}.log -StandardError=append:/var/log/ssh_tunnel/\${tunnel_id}.log +StandardOutput=append:/var/log/ssh_tunnel/${tunnel_id}.log +StandardError=append:/var/log/ssh_tunnel/${tunnel_id}.log [Install] WantedBy=multi-user.target -EOF +SERVICEEOF systemctl daemon-reload - systemctl enable "ssh-tunnel-\${tunnel_id}.service" - systemctl start "ssh-tunnel-\${tunnel_id}.service" + systemctl enable "ssh-tunnel-${tunnel_id}.service" + systemctl start "ssh-tunnel-${tunnel_id}.service" - echo -e "\${GREEN}Служба создана и запущена!\${NC}" - echo -e "\${CYAN}Управление:\${NC}" - echo -e " sudo systemctl status ssh-tunnel-\${tunnel_id}.service" - echo -e " sudo systemctl restart ssh-tunnel-\${tunnel_id}.service" + echo -e "${GREEN}Служба создана и запущена!${NC}" + echo -e "${CYAN}Управление:${NC}" + echo -e " sudo systemctl status ssh-tunnel-${tunnel_id}.service" + echo -e " sudo systemctl restart ssh-tunnel-${tunnel_id}.service" +} + +# Создание туннеля +create_tunnel() { + echo -e "${CYAN}Создание нового туннеля...${NC}" - read -p "Запустить туннель сейчас? (y/n): " START_NOW - if [[ "\$START_NOW" =~ ^[Yy]\$ ]]; then - 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} & - echo -e "\${GREEN}Туннель запущен в фоне!\${NC}" + if [ -z "$VPS_HOST" ]; then + echo -e "${RED}Сначала настройте VPS (опция 9)${NC}" + sleep 2 + return fi + + read -p "Введите локальный порт (например 22): " LOCAL_PORT + read -p "Введите удаленный порт на VPS (например 10022): " REMOTE_PORT + + echo -e "${CYAN}Создание туннеля $LOCAL_PORT -> $REMOTE_PORT на ${VPS_HOST}...${NC}" + + # Создание конфигурации + TUNNEL_ID="tunnel_${REMOTE_PORT}_$(date +%s)" + cat > "/etc/ssh_tunnel/${TUNNEL_ID}.conf" << EOF +TUNNEL_ID="$TUNNEL_ID" +VPS_HOST="$VPS_HOST" +VPS_PORT="$VPS_PORT" +VPS_USER="$VPS_USER" +LOCAL_PORT="$LOCAL_PORT" +REMOTE_PORT="$REMOTE_PORT" +CREATED="$(date '+%Y-%m-%d %H:%M:%S')" +EOF + + echo -e "${GREEN}Туннель создан! Конфиг: /etc/ssh_tunnel/${TUNNEL_ID}.conf${NC}" + + # Создание службы + create_service "$TUNNEL_ID" + + read -p "Нажмите Enter для продолжения..." } -# Заглушки для остальных функций +# Быстрый SSH туннель +quick_ssh_tunnel() { + echo -e "${CYAN}Создание быстрого SSH туннеля...${NC}" + + if [ -z "$VPS_HOST" ]; then + echo -e "${RED}Сначала настройте VPS (опция 9)${NC}" + sleep 2 + return + fi + + REMOTE_PORT="10022" + LOCAL_PORT="22" + + echo -e "${YELLOW}Будет создан туннель: localhost:22 -> ${VPS_HOST}:${REMOTE_PORT}${NC}" + + TUNNEL_ID="ssh_tunnel_${REMOTE_PORT}" + cat > "/etc/ssh_tunnel/${TUNNEL_ID}.conf" << EOF +TUNNEL_ID="$TUNNEL_ID" +VPS_HOST="$VPS_HOST" +VPS_PORT="$VPS_PORT" +VPS_USER="$VPS_USER" +LOCAL_PORT="$LOCAL_PORT" +REMOTE_PORT="$REMOTE_PORT" +CREATED="$(date '+%Y-%m-%d %H:%M:%S')" +TYPE="ssh" +EOF + + echo -e "${GREEN}SSH туннель создан!${NC}" + echo -e "${CYAN}Для подключения используйте:${NC}" + echo -e "${BOLD}ssh -p $REMOTE_PORT ${VPS_USER}@${VPS_HOST}${NC}" + + create_service "$TUNNEL_ID" + + read -p "Нажмите Enter для продолжения..." +} + +# Управление туннелями manage_tunnels() { - echo -e "\${CYAN}Управление туннелями...\${NC}" - echo -e "\${YELLOW}Список туннелей:\${NC}" - ls /etc/ssh_tunnel/*.conf 2>/dev/null | while read conf; do - echo " \$(basename \$conf)" + while true; do + clear + echo -e "${BOLD}${CYAN}Управление туннелями${NC}" + echo -e "${YELLOW}=====================${NC}" + echo "" + + # Список туннелей + count=1 + declare -A tunnels + + for conf in /etc/ssh_tunnel/*.conf; do + if [ -f "$conf" ]; then + tunnels[$count]="$conf" + tunnel_name=$(basename "$conf" .conf) + echo -e "${CYAN}[$count]${NC} $tunnel_name" + ((count++)) + fi + done + + if [ $count -eq 1 ]; then + echo -e "${YELLOW}Нет настроенных туннелей${NC}" + fi + + echo "" + echo -e "${CYAN}[s]${NC} Показать статус всех туннелей" + echo -e "${CYAN}[r]${NC} Перезапустить все туннели" + echo -e "${CYAN}[b]${NC} Назад в главное меню" + echo "" + + read -p "Выберите туннель для управления или действие: " choice + + case $choice in + b|B) return ;; + s|S) + echo -e "${CYAN}Статус туннелей:${NC}" + systemctl list-units --type=service --state=running | grep ssh-tunnel + read -p "Нажмите Enter для продолжения..." + ;; + r|R) + echo -e "${CYAN}Перезапуск всех туннелей...${NC}" + for conf in /etc/ssh_tunnel/*.conf; do + if [ -f "$conf" ]; then + tunnel_name=$(basename "$conf" .conf) + systemctl restart "ssh-tunnel-${tunnel_name}.service" 2>/dev/null + echo -e " ${GREEN}✓${NC} $tunnel_name перезапущен" + fi + done + read -p "Нажмите Enter для продолжения..." + ;; + *) + if [[ $choice =~ ^[0-9]+$ ]] && [ $choice -ge 1 ] && [ $choice -lt $count ]; then + manage_single_tunnel "${tunnels[$choice]}" + else + echo -e "${RED}Неверный выбор${NC}" + sleep 1 + fi + ;; + esac done - sleep 2 } +# Управление одним туннелем +manage_single_tunnel() { + local conf="$1" + local tunnel_name=$(basename "$conf" .conf) + + source "$conf" + + while true; do + clear + echo -e "${BOLD}${CYAN}Управление туннелем: $tunnel_name${NC}" + echo -e "${YELLOW}=================================${NC}" + echo "" + echo -e "${CYAN}Информация:${NC}" + echo -e " Локальный порт: $LOCAL_PORT" + echo -e " Удаленный порт: $REMOTE_PORT" + echo -e " VPS: $VPS_USER@$VPS_HOST:$VPS_PORT" + echo "" + + # Проверка статуса + if systemctl is-active --quiet "ssh-tunnel-${tunnel_name}.service"; then + echo -e "${GREEN}✓ Служба активна${NC}" + else + echo -e "${RED}✗ Служба неактивна${NC}" + fi + + echo "" + echo -e "${CYAN}[1]${NC} Перезапустить туннель" + echo -e "${CYAN}[2]${NC} Остановить туннель" + echo -e "${CYAN}[3]${NC} Запустить туннель" + echo -e "${CYAN}[4]${NC} Показать логи" + echo -e "${CYAN}[5]${NC} Удалить туннель" + echo -e "${CYAN}[6]${NC} Назад" + echo "" + + read -p "Выберите действие: " action + + case $action in + 1) + systemctl restart "ssh-tunnel-${tunnel_name}.service" + echo -e "${GREEN}Туннель перезапущен${NC}" + sleep 1 + ;; + 2) + systemctl stop "ssh-tunnel-${tunnel_name}.service" + echo -e "${YELLOW}Туннель остановлен${NC}" + sleep 1 + ;; + 3) + systemctl start "ssh-tunnel-${tunnel_name}.service" + echo -e "${GREEN}Туннель запущен${NC}" + sleep 1 + ;; + 4) + echo -e "${CYAN}Логи туннеля:${NC}" + tail -20 "/var/log/ssh_tunnel/${tunnel_name}.log" 2>/dev/null || echo "Логи отсутствуют" + read -p "Нажмите Enter для продолжения..." + ;; + 5) + read -p "Вы уверены, что хотите удалить туннель $tunnel_name? (y/n): " confirm + if [[ "$confirm" =~ ^[Yy]$ ]]; then + systemctl stop "ssh-tunnel-${tunnel_name}.service" + systemctl disable "ssh-tunnel-${tunnel_name}.service" + rm -f "/etc/systemd/system/ssh-tunnel-${tunnel_name}.service" + rm -f "$conf" + rm -f "/var/log/ssh_tunnel/${tunnel_name}.log" + systemctl daemon-reload + echo -e "${GREEN}Туннель удален${NC}" + return + fi + ;; + 6) + return + ;; + *) + echo -e "${RED}Неверный выбор${NC}" + sleep 1 + ;; + esac + done +} + +# Настройка автозапуска setup_autostart() { - echo -e "\${CYAN}Настройка автозапуска...\${NC}" - sleep 1 + echo -e "${CYAN}Настройка автозапуска...${NC}" + + echo "1) Включить автозапуск всех туннелей" + echo "2) Выключить автозапуск всех туннелей" + echo "3) Настроить отдельную службу" + echo "4) Проверить статус автозапуска" + echo "5) Назад" + + read -p "Выберите действие [1-5]: " action + + case $action in + 1) + for conf in /etc/ssh_tunnel/*.conf; do + if [ -f "$conf" ]; then + tunnel_name=$(basename "$conf" .conf) + systemctl enable "ssh-tunnel-${tunnel_name}.service" 2>/dev/null + echo -e "${GREEN}✓ Автозапуск включен для $tunnel_name${NC}" + fi + done + ;; + 2) + for conf in /etc/ssh_tunnel/*.conf; do + if [ -f "$conf" ]; then + tunnel_name=$(basename "$conf" .conf) + systemctl disable "ssh-tunnel-${tunnel_name}.service" 2>/dev/null + echo -e "${YELLOW}✗ Автозапуск выключен для $tunnel_name${NC}" + fi + done + ;; + 3) + echo -e "${CYAN}Доступные службы:${NC}" + systemctl list-unit-files --type=service | grep ssh-tunnel + read -p "Введите имя службы: " service_name + if systemctl is-enabled "$service_name" 2>/dev/null; then + systemctl disable "$service_name" + echo -e "${YELLOW}Автозапуск выключен для $service_name${NC}" + else + systemctl enable "$service_name" + echo -e "${GREEN}Автозапуск включен для $service_name${NC}" + fi + ;; + 4) + echo -e "${CYAN}Статус автозапуска:${NC}" + systemctl list-unit-files --type=service | grep ssh-tunnel + ;; + 5) + return + ;; + *) + echo -e "${RED}Неверный выбор${NC}" + ;; + esac + + read -p "Нажмите Enter для продолжения..." } +# Просмотр логов view_logs() { - echo -e "\${CYAN}Просмотр логов...\${NC}" - tail -20 /var/log/ssh_tunnel/*.log 2>/dev/null || echo "Логи отсутствуют" - sleep 2 + while true; do + clear + echo -e "${BOLD}${CYAN}Просмотр логов${NC}" + echo -e "${YELLOW}=============${NC}" + echo "" + echo -e "${CYAN}[1]${NC} Логи конкретного туннеля" + echo -e "${CYAN}[2]${NC} Все логи туннелей" + echo -e "${CYAN}[3]${NC} Системные логи (journalctl)" + echo -e "${CYAN}[4]${NC} Лог монитора" + echo -e "${CYAN}[5]${NC} Реальный мониторинг (tail -f)" + echo -e "${CYAN}[6]${NC} Очистить все логи" + echo -e "${CYAN}[7]${NC} Назад" + echo "" + + read -p "Выберите действие [1-7]: " choice + + case $choice in + 1) + ls $LOG_DIR/*.log 2>/dev/null | while read log; do + echo " $(basename $log)" + done + read -p "Введите имя лог-файла: " log_file + if [ -f "$LOG_DIR/$log_file" ]; then + less "$LOG_DIR/$log_file" + else + echo -e "${RED}Файл не найден${NC}" + sleep 1 + fi + ;; + 2) + echo -e "${CYAN}Все логи туннелей:${NC}" + for log in $LOG_DIR/*.log; do + if [ -f "$log" ]; then + echo -e "\n${YELLOW}=== $(basename $log) ===${NC}" + tail -10 "$log" + fi + done + read -p "Нажмите Enter для продолжения..." + ;; + 3) + echo -e "${CYAN}Системные логи туннелей:${NC}" + journalctl -u ssh-tunnel-* --since "1 hour ago" -n 20 + read -p "Нажмите Enter для продолжения..." + ;; + 4) + if [ -f "$LOG_DIR/monitor.log" ]; then + echo -e "${CYAN}Лог монитора:${NC}" + tail -20 "$LOG_DIR/monitor.log" + else + echo -e "${YELLOW}Лог монитора отсутствует${NC}" + fi + read -p "Нажмите Enter для продолжения..." + ;; + 5) + echo -e "${CYAN}Реальный мониторинг логов (Ctrl+C для выхода)${NC}" + tail -f $LOG_DIR/*.log 2>/dev/null | grep --line-buffered -E "ERROR|FAIL|Active|Inactive|restart|connected|disconnected" + ;; + 6) + read -p "Вы уверены, что хотите очистить все логи? (y/n): " confirm + if [[ "$confirm" =~ ^[Yy]$ ]]; then + rm -f $LOG_DIR/*.log 2>/dev/null + echo -e "${GREEN}Логи очищены${NC}" + sleep 1 + fi + ;; + 7) + return + ;; + *) + echo -e "${RED}Неверный выбор${NC}" + sleep 1 + ;; + esac + done } +# Тестирование подключений test_connections() { - echo -e "\${CYAN}Тестирование подключений...\${NC}" - check_ssh_connection - sleep 2 + echo -e "${CYAN}Тестирование подключений...${NC}" + + echo "1) Тест подключения к VPS" + echo "2) Тест портов туннелей" + echo "3) Тест скорости соединения" + echo "4) Назад" + + read -p "Выберите тест [1-4]: " test_choice + + case $test_choice in + 1) + check_ssh_connection + ;; + 2) + echo -e "${CYAN}Тест портов туннелей:${NC}" + for conf in /etc/ssh_tunnel/*.conf; do + if [ -f "$conf" ]; then + source "$conf" + tunnel_name=$(basename "$conf" .conf) + echo -n " $tunnel_name (локальный $LOCAL_PORT): " + if timeout 2 nc -z localhost "$LOCAL_PORT" 2>/dev/null; then + echo -e "${GREEN}✓ Открыт${NC}" + else + echo -e "${RED}✗ Закрыт${NC}" + fi + fi + done + ;; + 3) + if [ -n "$VPS_HOST" ]; then + echo -e "${CYAN}Тест скорости соединения с VPS...${NC}" + timeout 10 ssh "$VPS_USER@$VPS_HOST" "dd if=/dev/zero bs=1M count=10 2>/dev/null | gzip -f | dd of=/dev/null 2>/dev/null" 2>/dev/null + if [ $? -eq 0 ]; then + echo -e "${GREEN}✓ Соединение стабильное${NC}" + else + echo -e "${YELLOW}⚠ Соединение медленное или нестабильное${NC}" + fi + fi + ;; + 4) + return + ;; + esac + + read -p "Нажмите Enter для продолжения..." } +# Настройка маршрутизации setup_routing() { - echo -e "\${CYAN}Настройка маршрутизации...\${NC}" - sleep 1 + echo -e "${CYAN}Настройка маршрутизации...${NC}" + + echo "1) Показать текущие правила iptables" + echo "2) Добавить правило перенаправления порта" + echo "3) Удалить правило" + echo "4) Сохранить правила" + echo "5) Назад" + + read -p "Выберите действие [1-5]: " routing_choice + + case $routing_choice in + 1) + echo -e "${CYAN}Текущие правила iptables:${NC}" + iptables -t nat -L -n -v + ;; + 2) + read -p "Входной порт: " in_port + read -p "IP назначения: " dest_ip + read -p "Порт назначения: " dest_port + + iptables -t nat -A PREROUTING -p tcp --dport "$in_port" -j DNAT --to-destination "$dest_ip:$dest_port" + iptables -t nat -A POSTROUTING -p tcp -d "$dest_ip" --dport "$dest_port" -j MASQUERADE + + echo -e "${GREEN}Правило добавлено${NC}" + ;; + 3) + read -p "Входной порт для удаления: " del_port + iptables -t nat -D PREROUTING -p tcp --dport "$del_port" -j DNAT 2>/dev/null + echo -e "${YELLOW}Правило удалено (если существовало)${NC}" + ;; + 4) + if command -v iptables-save &> /dev/null; then + iptables-save > /etc/iptables/rules.v4 + echo -e "${GREEN}Правила сохранены${NC}" + else + echo -e "${RED}iptables-save не найден${NC}" + fi + ;; + 5) + return + ;; + esac + + read -p "Нажмите Enter для продолжения..." } +# Настройки SSH setup_ssh_config() { - echo -e "\${CYAN}Настройка SSH...\${NC}" - echo -e "\${YELLOW}Текущий конфиг SSH:\${NC}" - grep -E "^(ClientAlive|TCPKeepAlive|ServerAlive)" /etc/ssh/sshd_config 2>/dev/null || echo "Настройки не найдены" - sleep 2 + echo -e "${CYAN}Настройка SSH...${NC}" + + echo "1) Показать текущую конфигурацию SSH" + echo "2) Перезапустить SSH демон" + echo "3) Проверить конфигурацию" + echo "4) Назад" + + read -p "Выберите действие [1-4]: " ssh_choice + + case $ssh_choice in + 1) + echo -e "${CYAN}Текущая конфигурация SSH:${NC}" + grep -E "^(ClientAlive|TCPKeepAlive|ServerAlive|Port|PasswordAuthentication|PermitRootLogin)" /etc/ssh/sshd_config 2>/dev/null || echo "Конфигурация не найдена" + ;; + 2) + systemctl restart sshd 2>/dev/null || service ssh restart 2>/dev/null + echo -e "${GREEN}SSH демон перезапущен${NC}" + ;; + 3) + if sshd -t 2>/dev/null; then + echo -e "${GREEN}✓ Конфигурация SSH корректна${NC}" + else + echo -e "${RED}✗ Ошибка в конфигурации SSH${NC}" + fi + ;; + 4) + return + ;; + esac + + read -p "Нажмите Enter для продолжения..." +} + +# Основное меню +show_menu() { + while true; do + clear + echo -e "${BOLD}${CYAN}════════════════════════════════════════════════════════════════${NC}" + echo -e "${BOLD}${CYAN} АВТОНОМНЫЙ МЕНЕДЖЕР SSH ТУННЕЛЕЙ v3.0 ${NC}" + echo -e "${BOLD}${CYAN}════════════════════════════════════════════════════════════════${NC}" + + # Отображение текущих настроек VPS + if [ -n "$VPS_HOST" ]; then + echo -e "${CYAN}Текущий VPS: ${VPS_USER}@${VPS_HOST}:${VPS_PORT:-22}${NC}" + else + echo -e "${RED}VPS не настроен! Выберите опцию 9 для настройки.${NC}" + fi + + echo "" + + # Проверка статуса подключения + if [ -n "$VPS_HOST" ]; then + echo -e "${CYAN}Проверка состояния подключения...${NC}" + if check_ssh_connection; then + echo -e "${GREEN}✓ Соединение с VPS активно${NC}" + else + echo -e "${RED}✗ Нет соединения с VPS${NC}" + fi + echo "" + fi + + 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} Настройки SSH" + echo -e "${BOLD}${YELLOW}[9]${NC} Настройка/смена VPS" + echo -e "${BOLD}${YELLOW}[0]${NC} Выход" + echo "" + read -p "Выберите опцию [0-9]: " 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) setup_ssh_config ;; + 9) setup_new_vps ;; + 0) + echo -e "${GREEN}Выход...${NC}" + exit 0 + ;; + *) + echo -e "${RED}Неверный выбор${NC}" + sleep 1 + ;; + esac + done } # Главный цикл -while true; do - show_menu -done +show_menu EOF # Создание файла с цветами @@ -872,15 +1247,15 @@ 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" \\ - -o "StrictHostKeyChecking=no" \\ - -o "UserKnownHostsFile=/dev/null" \\ - -o "TCPKeepAlive=yes" \\ - -o "ConnectTimeout=30" \\ - -R \${REMOTE_PORT}:localhost:\${LOCAL_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" \ + -R \${REMOTE_PORT}:localhost:\${LOCAL_PORT} \ \${VPS_USER}@\${VPS_HOST} -p \${VPS_PORT} Restart=always RestartSec=10