ProxyTcpReverse/scripts/industrial_manager.sh

283 lines
8.4 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
# 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 "$@"