This commit is contained in:
NW
2025-12-22 14:40:03 +00:00
commit 6ee7537d65

632
install_ssh_tunnel.sh Normal file
View File

@@ -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 <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