#!/bin/bash # Script de ejemplo para gestión industrial automatizada # Conecta automáticamente a PLCs comunes de una línea de producción set -e echo "🏭 Configuración Industrial NAT para PLCs/SCADA" echo "================================================" # Configuración de PLCs comunes declare -A PLCS=( ["10.1.33.11"]="PLC Principal - Línea 1" ["10.1.33.12"]="PLC Secundario - Línea 1" ["10.1.33.13"]="HMI Operador" ["10.1.33.20"]="Historiador SCADA" ["10.1.33.30"]="Switch Industrial" ) # Servicios por defecto declare -A SERVICES=( ["vnc"]="5900" ["web"]="80" ["modbus"]="502" ["ssh"]="22" ["https"]="443" ) # Función para mostrar menú show_menu() { echo "" echo "Opciones disponibles:" echo "1. Conectar a PLC específico" echo "2. Conectar a todos los PLCs (VNC)" echo "3. Configurar acceso web a PLCs" echo "4. Acceso Modbus a controladores" echo "5. Ver estado del sistema" echo "6. Limpiar todas las conexiones" echo "7. Configuración personalizada" echo "8. Salir" echo "" } # Función para conectar a PLC específico connect_specific_plc() { echo "" echo "PLCs disponibles:" local i=1 local plc_ips=() for ip in "${!PLCS[@]}"; do echo "$i. $ip - ${PLCS[$ip]}" plc_ips+=("$ip") ((i++)) done echo "" read -p "Selecciona PLC (1-${#PLCS[@]}): " plc_choice if [[ $plc_choice -ge 1 && $plc_choice -le ${#PLCS[@]} ]]; then local selected_ip="${plc_ips[$((plc_choice-1))]}" echo "" echo "Servicios disponibles:" echo "1. VNC (5900) - Acceso gráfico" echo "2. Web (80) - Interface web" echo "3. HTTPS (443) - Interface web segura" echo "4. Modbus (502) - Comunicación industrial" echo "5. SSH (22) - Terminal" read -p "Selecciona servicio (1-5): " service_choice case $service_choice in 1) service="vnc" ;; 2) service="web" ;; 3) service="https" ;; 4) service="modbus" ;; 5) service="ssh" ;; *) echo "Opción inválida"; return ;; esac echo "" echo "Conectando a ${PLCS[$selected_ip]} ($selected_ip) - $service..." if python3 /home/miguefin/proxytcp/scripts/nat_client.py plc "$selected_ip" "$service" --wait; then echo "" echo "✅ ¡Conexión establecida exitosamente!" echo "📱 Desde PC2 conecta a: 91.99.210.72:(puerto asignado)" if [[ "$service" == "vnc" ]]; then echo "🖥️ Usar VNC Viewer con la dirección mostrada arriba" elif [[ "$service" == "web" || "$service" == "https" ]]; then echo "🌐 Abrir navegador web con la dirección mostrada arriba" fi else echo "❌ Error estableciendo conexión" fi else echo "Selección inválida" fi } # Función para conectar todos los PLCs connect_all_plcs() { echo "" echo "🔗 Conectando a todos los PLCs con VNC..." for ip in "${!PLCS[@]}"; do echo "" echo "Conectando a ${PLCS[$ip]} ($ip)..." if python3 /home/miguefin/proxytcp/scripts/nat_client.py plc "$ip" vnc; then echo "✅ $ip conectado" else echo "❌ Error conectando a $ip" fi sleep 1 done echo "" echo "📋 Resumen de conexiones:" python3 /home/miguefin/proxytcp/scripts/nat_client.py list } # Función para acceso web setup_web_access() { echo "" echo "🌐 Configurando acceso web a PLCs..." for ip in "${!PLCS[@]}"; do echo "Configurando web para ${PLCS[$ip]} ($ip)..." if python3 /home/miguefin/proxytcp/scripts/nat_client.py plc "$ip" web; then echo "✅ Web access configurado para $ip" else echo "⚠️ No se pudo configurar web para $ip" fi done echo "" echo "🌐 Acceso web configurado. Desde PC2 usar navegador con:" python3 /home/miguefin/proxytcp/scripts/nat_client.py list | grep -i web } # Función para acceso Modbus setup_modbus_access() { echo "" echo "🔧 Configurando acceso Modbus TCP..." # Solo PLCs que normalmente tienen Modbus modbus_plcs=("10.1.33.11" "10.1.33.12") for ip in "${modbus_plcs[@]}"; do if [[ -n "${PLCS[$ip]}" ]]; then echo "Configurando Modbus para ${PLCS[$ip]} ($ip)..." if python3 /home/miguefin/proxytcp/scripts/nat_client.py plc "$ip" modbus; then echo "✅ Modbus TCP configurado para $ip" else echo "⚠️ No se pudo configurar Modbus para $ip" fi fi done echo "" echo "🔧 Acceso Modbus configurado. Configurar cliente Modbus con:" python3 /home/miguefin/proxytcp/scripts/nat_client.py list | grep -i modbus } # Función para mostrar estado show_status() { echo "" echo "📊 Estado del Sistema NAT Industrial:" echo "====================================" if python3 /home/miguefin/proxytcp/scripts/nat_client.py status; then echo "" echo "📋 Conexiones Activas:" python3 /home/miguefin/proxytcp/scripts/nat_client.py list else echo "❌ No se pudo obtener el estado del sistema" echo " Verifica que el contenedor esté ejecutándose" fi } # Función para limpiar conexiones cleanup_connections() { echo "" echo "🧹 Limpiando todas las conexiones..." # Obtener lista de puertos activos y eliminarlos if command -v jq &> /dev/null; then # Si jq está disponible, usar parsing JSON ports=$(python3 /home/miguefin/proxytcp/scripts/nat_client.py status 2>/dev/null | jq -r '.rules[].external_port' 2>/dev/null) else # Método alternativo sin jq ports=$(python3 /home/miguefin/proxytcp/scripts/nat_client.py list 2>/dev/null | grep -oE '91\.99\.210\.72:([0-9]+)' | cut -d: -f2) fi if [[ -n "$ports" ]]; then for port in $ports; do echo "Eliminando conexión en puerto $port..." python3 /home/miguefin/proxytcp/scripts/nat_client.py remove "$port" >/dev/null 2>&1 || true done echo "✅ Conexiones eliminadas" else echo "ℹ️ No hay conexiones activas para eliminar" fi } # Función para configuración personalizada custom_config() { echo "" echo "⚙️ Configuración Personalizada" echo "=============================" read -p "IP del dispositivo: " custom_ip read -p "Puerto del dispositivo: " custom_port read -p "Descripción (opcional): " custom_desc echo "" echo "Creando conexión personalizada..." if python3 /home/miguefin/proxytcp/scripts/nat_client.py connect "$custom_ip" "$custom_port" --description "$custom_desc" --wait; then echo "✅ Conexión personalizada establecida" else echo "❌ Error creando conexión personalizada" fi } # Verificar dependencias check_dependencies() { if ! command -v python3 &> /dev/null; then echo "❌ Python3 no está instalado" exit 1 fi if ! python3 -c "import requests" &> /dev/null; then echo "⚠️ Módulo 'requests' no está disponible" echo " Instalando: pip3 install requests" pip3 install requests >/dev/null 2>&1 || { echo "❌ No se pudo instalar 'requests'" exit 1 } fi } # Función principal main() { echo "🏭 Sistema NAT Industrial - Gestión de PLCs/SCADA" echo "==================================================" check_dependencies while true; do show_menu read -p "Selecciona una opción (1-8): " choice case $choice in 1) connect_specific_plc ;; 2) connect_all_plcs ;; 3) setup_web_access ;; 4) setup_modbus_access ;; 5) show_status ;; 6) cleanup_connections ;; 7) custom_config ;; 8) echo "👋 ¡Hasta luego!" exit 0 ;; *) echo "❌ Opción inválida. Selecciona 1-8." ;; esac echo "" read -p "Presiona Enter para continuar..." done } # Ejecutar función principal main "$@"