Исправления в этой версии:

    Полностью определенная функция show_menu() - теперь она есть в основном скрипте manager.sh

    Все функции меню реализованы:

        create_tunnel() - создание нового туннеля

        quick_ssh_tunnel() - быстрый SSH туннель

        manage_tunnels() - управление существующими туннелями

        setup_autostart() - настройка автозапуска

        view_logs() - просмотр логов

        test_connections() - тестирование подключений

        setup_routing() - настройка маршрутизации

        setup_ssh_config() - настройки SSH

        setup_new_vps() - настройка/смена VPS

    Улучшенное управление туннелями:

        Просмотр списка всех туннелей

        Управление отдельными туннелями (запуск/остановка/перезапуск)

        Просмотр логов конкретного туннеля

        Удаление туннелей

    Полноценное меню с навигацией и обработкой всех опций
This commit is contained in:
NW
2025-12-22 15:39:50 +00:00
parent f3681ea2ab
commit 865629e9df

View File

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