From 6ee7537d651b7239ab65e0c4816c8822e9372469 Mon Sep 17 00:00:00 2001 From: NW Date: Mon, 22 Dec 2025 14:40:03 +0000 Subject: [PATCH] Initial --- install_ssh_tunnel.sh | 632 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 632 insertions(+) create mode 100644 install_ssh_tunnel.sh diff --git a/install_ssh_tunnel.sh b/install_ssh_tunnel.sh new file mode 100644 index 0000000..d4188fc --- /dev/null +++ b/install_ssh_tunnel.sh @@ -0,0 +1,632 @@ +#!/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 )${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/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 \ No newline at end of file