From f3681ea2abdbf4e65b8bc914f1f359cc7a0bfd8e Mon Sep 17 00:00:00 2001 From: NW Date: Mon, 22 Dec 2025 15:23:04 +0000 Subject: [PATCH] v1.2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Основные исправления: Интерактивный запрос данных VPS - скрипт теперь явно запрашивает: IP/домен VPS (обязательное поле) Порт SSH (по умолчанию 22) Имя пользователя (root или другой) Улучшенная SSH конфигурация для локальной сети: Добавлены параметры TCPKeepAlive, ControlMaster, ControlPersist Увеличены таймауты соединения Настроены буферы и компрессия Добавлены современные шифры для стабильности Настройка SSH демона: Автоматическая настройка /etc/ssh/sshd_config Включение ClientAliveInterval и TCPKeepAlive Разрешение подключения по паролю (для локальной сети) Автоматический перезапуск SSH демона Улучшенная обработка ошибок: Проверка доступности порта VPS Несколько методов копирования SSH ключа Возможность продолжить установку даже если подключение не удалось Сохраняются настройки VPS в /etc/ssh_tunnel/vps_settings.conf --- install_ssh_tunnel.sh | 519 +++++++++++++++++++++++++++++++++++------- 1 file changed, 438 insertions(+), 81 deletions(-) diff --git a/install_ssh_tunnel.sh b/install_ssh_tunnel.sh index d4188fc..33c1992 100644 --- a/install_ssh_tunnel.sh +++ b/install_ssh_tunnel.sh @@ -1,7 +1,7 @@ #!/bin/bash # Установщик автономного менеджера SSH туннелей -# Использование: bash <(curl -s https://raw.githubusercontent.com/ВАШ_ЛОГИН/ВАШ_РЕПОЗИТОРИЙ/main/install_ssh_tunnel.sh) +# Использование: bash <(curl -s https://git.softuniq.eu/OpenDoor/vps_ssh_tunel/raw/branch/main/install_ssh_tunnel.sh) # Цвета для вывода RED='\033[0;31m' @@ -29,7 +29,7 @@ echo "" if [[ $EUID -ne 0 ]]; then echo -e "${RED}ОШИБКА: Этот скрипт требует прав root (sudo).${NC}" echo "Пожалуйста, запустите снова:" - echo -e "${BOLD}sudo bash <(curl -s )${NC}" + echo -e "${BOLD}sudo bash <(curl -s https://git.softuniq.eu/OpenDoor/vps_ssh_tunel/raw/branch/main/install_ssh_tunnel.sh)${NC}" exit 1 fi @@ -118,7 +118,16 @@ setup_ssh() { echo -e "${BOLD}${YELLOW}════════════════════════════════════════════════════════════════${NC}" echo "" - read -p "Введите IP адрес или доменное имя VPS: " VPS_HOST + # Запрос данных VPS + while true; do + read -p "Введите IP адрес или доменное имя VPS: " VPS_HOST + if [ -n "$VPS_HOST" ]; then + break + else + echo -e "${RED}Поле не может быть пустым!${NC}" + fi + done + read -p "Введите порт SSH (по умолчанию 22): " VPS_PORT VPS_PORT=${VPS_PORT:-22} @@ -132,7 +141,14 @@ setup_ssh() { VPS_USER="root" echo -e "${YELLOW}Будет использоваться пользователь: root${NC}" else - read -p "Введите имя пользователя: " VPS_USER + while true; do + read -p "Введите имя пользователя: " VPS_USER + if [ -n "$VPS_USER" ]; then + break + else + echo -e "${RED}Имя пользователя не может быть пустым!${NC}" + fi + done fi # Проверка подключения @@ -164,11 +180,12 @@ setup_ssh() { log_message "SSH ключ сгенерирован" "$GREEN" fi - # Настройка SSH конфигурации - log_message "Настройка конфигурации SSH..." "$BLUE" + # Настройка SSH конфигурации для стабильного подключения + log_message "Настройка конфигурации SSH для стабильного подключения..." "$BLUE" - # Создание конфига для root + # Создание конфига для root с улучшенными настройками cat > /root/.ssh/config << EOF +# Основная конфигурация SSH Host tunnel-vps HostName $VPS_HOST Port $VPS_PORT @@ -178,19 +195,77 @@ Host tunnel-vps UserKnownHostsFile /dev/null ServerAliveInterval 30 ServerAliveCountMax 3 - ConnectTimeout 10 + ConnectTimeout 30 TCPKeepAlive yes IdentitiesOnly yes + ExitOnForwardFailure yes + # Увеличенные настройки для локальной сети + IPQoS throughput + Compression yes + ControlMaster auto + ControlPath ~/.ssh/control-%r@%h:%p + ControlPersist 10m + # Дополнительные настройки стабильности + 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 Host * + # Глобальные настройки для всех хостов StrictHostKeyChecking no UserKnownHostsFile /dev/null ServerAliveInterval 30 ServerAliveCountMax 3 + TCPKeepAlive yes + Compression yes + ControlMaster auto + ControlPath ~/.ssh/control-%r@%h:%p + ControlPersist 10m + ConnectTimeout 30 + # Настройки для локальной сети + GSSAPIAuthentication no + AddressFamily inet + # Увеличение размера буферов + SendEnv LANG LC_* + HashKnownHosts yes + # Настройки переподключения + RekeyLimit 1G 1h EOF chmod 600 /root/.ssh/config + # Настройка SSH демона для локальных подключений + log_message "Настройка SSH демона для локальных подключений..." "$BLUE" + + # Бэкап оригинального конфига + SSHD_CONFIG="/etc/ssh/sshd_config" + if [ -f "$SSHD_CONFIG" ]; then + cp "$SSHD_CONFIG" "${SSHD_CONFIG}.backup.$(date +%Y%m%d%H%M%S)" + + # Добавляем настройки для стабильности + if ! grep -q "ClientAliveInterval" "$SSHD_CONFIG"; then + echo "ClientAliveInterval 30" >> "$SSHD_CONFIG" + fi + if ! grep -q "ClientAliveCountMax" "$SSHD_CONFIG"; then + echo "ClientAliveCountMax 3" >> "$SSHD_CONFIG" + fi + if ! grep -q "TCPKeepAlive" "$SSHD_CONFIG"; then + echo "TCPKeepAlive yes" >> "$SSHD_CONFIG" + fi + + # Разрешаем подключение по паролю (если нужно) + sed -i 's/^#\?PasswordAuthentication .*/PasswordAuthentication yes/' "$SSHD_CONFIG" + + # Разрешаем подключение root (если нужно) + sed -i 's/^#\?PermitRootLogin .*/PermitRootLogin yes/' "$SSHD_CONFIG" + + # Перезапускаем SSH демон + systemctl restart sshd 2>/dev/null || service ssh restart 2>/dev/null + log_message "SSH демон перезапущен с новыми настройками" "$GREEN" + fi + # Копирование ключа на VPS echo "" log_message "Копирование SSH ключа на VPS ($VPS_USER@$VPS_HOST)..." "$CYAN" @@ -229,50 +304,81 @@ EOF 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 "Тестовое подключение к VPS с новыми настройками..." "$BLUE" + + # Тест с подробным выводом + echo -e "${CYAN}Выполняю тестовое подключение...${NC}" + if ssh -p "$VPS_PORT" \ + -o BatchMode=yes \ + -o ConnectTimeout=15 \ + -o ServerAliveInterval=30 \ + -o TCPKeepAlive=yes \ + "$VPS_USER@$VPS_HOST" \ + "echo 'SSH подключение успешно! Система: \$(uname -a)'"; then log_message "Тестовое подключение прошло успешно!" "$GREEN" + echo -e "${GREEN}✓ Настройки SSH работают корректно${NC}" else log_message "Тестовое подключение не удалось" "$YELLOW" + echo -e "${YELLOW}⚠ SSH подключение не удалось, но установка продолжается${NC}" + echo -e "${YELLOW}Вы сможете настроить подключение позже через tunnel-manager${NC}" read -p "Продолжить установку? (y/n): " CONTINUE_INSTALL if [[ ! "$CONTINUE_INSTALL" =~ ^[Yy]$ ]]; then exit 1 fi fi - # Настройка для не-root пользователей (если запущено не из-под root) + # Настройка для не-root пользователей if [[ $EUID -eq 0 ]] && [ -d "/home/" ]; then - log_message "Настройка SSH для всех пользователей системы..." "$CYAN" + echo "" + read -p "Настроить SSH для обычных пользователей системы? (y/n): " SETUP_USERS - # Копируем конфиг для всех домашних директорий - 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" + if [[ "$SETUP_USERS" =~ ^[Yy]$ ]]; then + log_message "Настройка SSH для всех пользователей системы..." "$CYAN" + + for HOME_DIR in /home/*; do + if [ -d "$HOME_DIR" ] && [ "$HOME_DIR" != "/home/*" ]; then + USER=$(basename "$HOME_DIR") + USER_SSH_DIR="$HOME_DIR/.ssh" + + echo -e "${CYAN}Настройка пользователя: $USER${NC}" + + 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 + echo -e " ${GREEN}✓ Ключ скопирован для $USER${NC}" + fi 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 + done + fi fi + + # Сохранение настроек VPS для использования в скриптах + log_message "Сохранение настроек VPS..." "$BLUE" + cat > /etc/ssh_tunnel/vps_settings.conf << EOF +# Настройки VPS для автономных туннелей +VPS_HOST="$VPS_HOST" +VPS_PORT="$VPS_PORT" +VPS_USER="$VPS_USER" +CONFIGURED_ON="$(date '+%Y-%m-%d %H:%M:%S')" +EOF + + log_message "Настройки SSH сохранены в /etc/ssh_tunnel/vps_settings.conf" "$GREEN" } # Установка основного скрипта @@ -284,15 +390,17 @@ install_main_script() { mkdir -p /var/log/ssh_tunnel mkdir -p /etc/ssh_tunnel - # Скачивание или создание основного скрипта - # Здесь должен быть ваш основной скрипт из Git репозитория - # Для примера создадим базовую версию + # Проверяем, есть ли сохраненные настройки 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.0 - Полностью автономный +# Версия 2.1 - Улучшенная стабильность подключений # Конфигурация CONFIG_DIR="/etc/ssh_tunnel" @@ -306,30 +414,116 @@ source "$SCRIPT_DIR/colors.sh" 2>/dev/null || { BLUE='\033[0;34m'; CYAN='\033[0;36m'; NC='\033[0m'; BOLD='\033[1m' } +# Загрузка настроек VPS если есть +if [ -f "/etc/ssh_tunnel/vps_settings.conf" ]; then + source "/etc/ssh_tunnel/vps_settings.conf" +fi + +# Функция проверки подключения +check_ssh_connection() { + 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}" + + 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}" + return 0 + else + echo -e "\${RED}✗ Не удалось подключиться\${NC}" + return 1 + fi +} + +# Функция настройки нового VPS +setup_new_vps() { + 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} + 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 'Проверка успешна'" 2>/dev/null; then + 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')" +CONFIGEOF + + 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 "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.0 ${NC}" - echo -e "${BOLD}${CYAN}════════════════════════════════════════════════════════════════${NC}" - echo "" + echo -e "\${BOLD}\${CYAN}════════════════════════════════════════════════════════════════\${NC}" + echo -e "\${BOLD}\${CYAN} АВТОНОМНЫЙ МЕНЕДЖЕР SSH ТУННЕЛЕЙ v2.1 \${NC}" + echo -e "\${BOLD}\${CYAN}════════════════════════════════════════════════════════════════\${NC}" - # Проверка статуса - check_system_status + # Отображение текущих настроек 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 "" - 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 + # Проверка статуса подключения + 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 ;; @@ -337,15 +531,176 @@ show_menu() { 5) view_logs ;; 6) test_connections ;; 7) setup_routing ;; - 8) exit 0 ;; - *) echo -e "${RED}Неверный выбор${NC}"; sleep 1 ;; + 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" +} + +# Функция создания службы +create_service() { + local tunnel_id="\$1" + local service_file="/etc/systemd/system/ssh-tunnel-\${tunnel_id}.service" + + cat > "\$service_file" << EOF +[Unit] +Description=SSH Tunnel: \$tunnel_id +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +EnvironmentFile=/etc/ssh_tunnel/\${tunnel_id}.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} \\ + \${VPS_USER}@\${VPS_HOST} -p \${VPS_PORT} +Restart=always +RestartSec=10 +User=root + +StandardOutput=append:/var/log/ssh_tunnel/\${tunnel_id}.log +StandardError=append:/var/log/ssh_tunnel/\${tunnel_id}.log + +[Install] +WantedBy=multi-user.target +EOF + + systemctl daemon-reload + 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" + + 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}" + fi +} + +# Заглушки для остальных функций +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)" + done + sleep 2 +} + +setup_autostart() { + echo -e "\${CYAN}Настройка автозапуска...\${NC}" + sleep 1 +} + +view_logs() { + echo -e "\${CYAN}Просмотр логов...\${NC}" + tail -20 /var/log/ssh_tunnel/*.log 2>/dev/null || echo "Логи отсутствуют" + sleep 2 +} + +test_connections() { + echo -e "\${CYAN}Тестирование подключений...\${NC}" + check_ssh_connection + sleep 2 +} + +setup_routing() { + echo -e "\${CYAN}Настройка маршрутизации...\${NC}" + sleep 1 +} + +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 +} + +# Главный цикл while true; do show_menu done @@ -365,19 +720,6 @@ 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 @@ -534,10 +876,18 @@ 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 +User=root + +StandardOutput=append:/var/log/ssh_tunnel/example_ssh.log +StandardError=append:/var/log/ssh_tunnel/example_ssh.log [Install] WantedBy=multi-user.target @@ -549,6 +899,10 @@ EOF log_message "Пример туннеля создан! Для подключения используйте:" "$GREEN" echo -e "${BOLD}ssh -p 10022 $VPS_USER@$VPS_HOST${NC}" + echo "" + echo -e "${YELLOW}Проверьте подключение:${NC}" + echo -e " systemctl status ssh-tunnel-example_ssh.service" + echo -e " tail -f /var/log/ssh_tunnel/example_ssh.log" fi fi } @@ -564,6 +918,7 @@ finish_installation() { log_message "Итоги установки:" "$CYAN" echo -e "${GREEN}✓${NC} Зависимости установлены" echo -e "${GREEN}✓${NC} SSH ключи сгенерированы и настроены" + echo -e "${GREEN}✓${NC} SSH конфигурация улучшена для стабильности" echo -e "${GREEN}✓${NC} Основной скрипт установлен: /opt/ssh_tunnel_manager/manager.sh" echo -e "${GREEN}✓${NC} Systemd службы настроены" echo -e "${GREEN}✓${NC} Автозапуск включен" @@ -572,7 +927,8 @@ finish_installation() { 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 -e " SSH ключ: /root/.ssh/id_rsa" + echo -e " Конфиг SSH: /root/.ssh/config" echo "" fi @@ -580,6 +936,7 @@ finish_installation() { echo -e " ${CYAN}tunnel-manager${NC} - запуск менеджера туннелей" echo -e " ${CYAN}systemctl status tunnel-monitor${NC} - статус монитора" echo -e " ${CYAN}journalctl -u tunnel-monitor -f${NC} - просмотр логов" + echo -e " ${CYAN}ssh -p ${VPS_PORT:-22} $VPS_USER@$VPS_HOST${NC} - тестовое подключение" echo "" echo -e "${BOLD}Автономная работа гарантирована!${NC}" echo -e "Система автоматически запустится после перезагрузки." @@ -612,7 +969,7 @@ main_installation() { # Устанавливаем зависимости install_dependencies - # Настраиваем SSH + # Настраиваем SSH (теперь будет запрашивать данные) setup_ssh # Устанавливаем основной скрипт