Files
vps_ssh_tunel/install_ssh_tunnel.sh
2025-12-22 14:40:03 +00:00

632 lines
24 KiB
Bash
Raw Blame History

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