v1.3
Исправления в этой версии:
Полностью определенная функция 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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user