347 lines
10 KiB
Bash
Executable File
347 lines
10 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Script para generar nueva clave SSH para el sistema NAT industrial
|
||
# Ejecutar desde PC1 (WSL2)
|
||
|
||
set -e
|
||
|
||
echo "🔐 Generación de Clave SSH para Sistema NAT Industrial"
|
||
echo "===================================================="
|
||
|
||
# Configuración
|
||
SSH_KEY_NAME="industrial_nat_key"
|
||
SSH_KEY_PATH="/home/miguefin/proxytcp/certs/ssh_private_key"
|
||
SSH_PUB_PATH="/home/miguefin/proxytcp/certs/ssh_private_key.pub"
|
||
PC3_HOST="91.99.210.72"
|
||
|
||
echo ""
|
||
echo "📍 Información:"
|
||
echo " Clave privada: $SSH_KEY_PATH"
|
||
echo " Clave pública: $SSH_PUB_PATH"
|
||
echo " Servidor destino: $PC3_HOST"
|
||
echo ""
|
||
|
||
# Función para generar clave SSH
|
||
generate_ssh_key() {
|
||
echo "🔑 Generando nueva clave SSH..."
|
||
|
||
# Crear directorio si no existe
|
||
mkdir -p "$(dirname "$SSH_KEY_PATH")"
|
||
|
||
# Generar clave SSH
|
||
ssh-keygen -t rsa -b 4096 -f "$SSH_KEY_PATH" -N "" -C "industrial-nat-$(whoami)@$(hostname)-$(date +%Y%m%d)"
|
||
|
||
# Establecer permisos correctos
|
||
chmod 600 "$SSH_KEY_PATH"
|
||
chmod 644 "$SSH_PUB_PATH"
|
||
|
||
echo "✅ Clave SSH generada exitosamente"
|
||
echo " Privada: $SSH_KEY_PATH"
|
||
echo " Pública: $SSH_PUB_PATH"
|
||
}
|
||
|
||
# Función para mostrar clave pública
|
||
show_public_key() {
|
||
echo ""
|
||
echo "📋 CLAVE PÚBLICA (copiar esta en PC3):"
|
||
echo "======================================"
|
||
cat "$SSH_PUB_PATH"
|
||
echo "======================================"
|
||
}
|
||
|
||
# Función para crear script de instalación en PC3
|
||
create_pc3_setup_script() {
|
||
local setup_script="/tmp/setup_pc3_nat.sh"
|
||
|
||
cat > "$setup_script" << 'EOF'
|
||
#!/bin/bash
|
||
|
||
# Script para configurar PC3 como intermediario SSH NAT
|
||
# Ejecutar en PC3 (91.99.210.72)
|
||
|
||
set -e
|
||
|
||
echo "🖥️ Configurando PC3 como Intermediario SSH NAT"
|
||
echo "=============================================="
|
||
|
||
# Verificar si somos root o tenemos sudo
|
||
if [[ $EUID -eq 0 ]]; then
|
||
SUDO=""
|
||
else
|
||
SUDO="sudo"
|
||
fi
|
||
|
||
# Función para instalar SSH server si no está
|
||
install_ssh_server() {
|
||
echo "📦 Verificando SSH Server..."
|
||
|
||
if ! systemctl is-active --quiet ssh && ! systemctl is-active --quiet sshd; then
|
||
echo " Instalando OpenSSH Server..."
|
||
$SUDO apt update
|
||
$SUDO apt install -y openssh-server
|
||
echo "✅ SSH Server instalado"
|
||
else
|
||
echo "✅ SSH Server ya está instalado"
|
||
fi
|
||
}
|
||
|
||
# Función para configurar SSH para túneles reversos
|
||
configure_ssh() {
|
||
echo "⚙️ Configurando SSH para túneles reversos..."
|
||
|
||
local ssh_config="/etc/ssh/sshd_config"
|
||
local backup_config="/etc/ssh/sshd_config.backup.$(date +%Y%m%d_%H%M%S)"
|
||
|
||
# Hacer backup de configuración
|
||
$SUDO cp "$ssh_config" "$backup_config"
|
||
echo " Backup creado: $backup_config"
|
||
|
||
# Configurar GatewayPorts si no está
|
||
if ! grep -q "^GatewayPorts yes" "$ssh_config"; then
|
||
echo "GatewayPorts yes" | $SUDO tee -a "$ssh_config" > /dev/null
|
||
echo " ✅ GatewayPorts habilitado"
|
||
else
|
||
echo " ✅ GatewayPorts ya estaba habilitado"
|
||
fi
|
||
|
||
# Configurar AllowTcpForwarding si no está
|
||
if ! grep -q "^AllowTcpForwarding yes" "$ssh_config"; then
|
||
echo "AllowTcpForwarding yes" | $SUDO tee -a "$ssh_config" > /dev/null
|
||
echo " ✅ AllowTcpForwarding habilitado"
|
||
else
|
||
echo " ✅ AllowTcpForwarding ya estaba habilitado"
|
||
fi
|
||
|
||
# Reiniciar SSH
|
||
echo " Reiniciando SSH Server..."
|
||
$SUDO systemctl restart ssh 2>/dev/null || $SUDO systemctl restart sshd
|
||
echo "✅ SSH Server reiniciado"
|
||
}
|
||
|
||
# Función para configurar firewall
|
||
configure_firewall() {
|
||
echo "🔥 Configurando Firewall..."
|
||
|
||
# Verificar si ufw está instalado y activo
|
||
if command -v ufw >/dev/null 2>&1; then
|
||
if $SUDO ufw status | grep -q "Status: active"; then
|
||
echo " UFW está activo, configurando reglas..."
|
||
$SUDO ufw allow 22/tcp comment "SSH"
|
||
$SUDO ufw allow 9000:9999/tcp comment "NAT Tunnels"
|
||
echo "✅ Reglas UFW configuradas"
|
||
else
|
||
echo " UFW está instalado pero inactivo"
|
||
fi
|
||
else
|
||
echo " UFW no está instalado"
|
||
fi
|
||
|
||
# Verificar iptables básico
|
||
if command -v iptables >/dev/null 2>&1; then
|
||
echo " Verificando reglas iptables básicas..."
|
||
# Solo mostrar info, no modificar iptables automáticamente
|
||
echo " ℹ️ Si usas iptables, asegúrate de permitir puertos 22 y 9000-9999"
|
||
fi
|
||
}
|
||
|
||
# Función para configurar clave SSH
|
||
setup_ssh_key() {
|
||
echo "🔑 Configurando autenticación por clave SSH..."
|
||
|
||
read -p "👤 ¿Cuál es tu usuario SSH en este servidor? (default: $USER): " ssh_user
|
||
ssh_user=${ssh_user:-$USER}
|
||
|
||
local home_dir
|
||
if [[ "$ssh_user" == "root" ]]; then
|
||
home_dir="/root"
|
||
else
|
||
home_dir="/home/$ssh_user"
|
||
fi
|
||
|
||
local ssh_dir="$home_dir/.ssh"
|
||
local auth_keys="$ssh_dir/authorized_keys"
|
||
|
||
echo " Configurando para usuario: $ssh_user"
|
||
echo " Directorio SSH: $ssh_dir"
|
||
|
||
# Crear directorio .ssh si no existe
|
||
if [[ "$ssh_user" == "$USER" ]]; then
|
||
mkdir -p "$ssh_dir"
|
||
chmod 700 "$ssh_dir"
|
||
else
|
||
$SUDO mkdir -p "$ssh_dir"
|
||
$SUDO chmod 700 "$ssh_dir"
|
||
$SUDO chown "$ssh_user:$ssh_user" "$ssh_dir"
|
||
fi
|
||
|
||
echo ""
|
||
echo "📋 AHORA NECESITAS AGREGAR TU CLAVE PÚBLICA"
|
||
echo "==========================================="
|
||
echo "1. Copia la clave pública que se mostró en PC1"
|
||
echo "2. Pégala cuando se solicite"
|
||
echo ""
|
||
echo "Formato esperado: ssh-rsa AAAAB3NzaC1yc2EAAA... comentario"
|
||
echo ""
|
||
|
||
read -p "📝 Pega tu clave pública SSH aquí: " public_key
|
||
|
||
if [[ -z "$public_key" ]]; then
|
||
echo "❌ No se proporcionó clave pública"
|
||
return 1
|
||
fi
|
||
|
||
# Validar formato básico de clave SSH
|
||
if [[ "$public_key" =~ ^(ssh-rsa|ssh-ed25519|ecdsa-sha2-) ]]; then
|
||
# Agregar clave a authorized_keys
|
||
if [[ "$ssh_user" == "$USER" ]]; then
|
||
echo "$public_key" >> "$auth_keys"
|
||
chmod 600 "$auth_keys"
|
||
else
|
||
echo "$public_key" | $SUDO tee -a "$auth_keys" > /dev/null
|
||
$SUDO chmod 600 "$auth_keys"
|
||
$SUDO chown "$ssh_user:$ssh_user" "$auth_keys"
|
||
fi
|
||
|
||
echo "✅ Clave SSH agregada para usuario $ssh_user"
|
||
else
|
||
echo "❌ Formato de clave SSH inválido"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
# Función para verificar configuración
|
||
verify_setup() {
|
||
echo "🧪 Verificando configuración..."
|
||
|
||
# Verificar SSH está ejecutándose
|
||
if systemctl is-active --quiet ssh || systemctl is-active --quiet sshd; then
|
||
echo "✅ SSH Server está ejecutándose"
|
||
else
|
||
echo "❌ SSH Server no está ejecutándose"
|
||
return 1
|
||
fi
|
||
|
||
# Verificar puerto 22
|
||
if netstat -tlnp 2>/dev/null | grep -q ":22 " || ss -tlnp 2>/dev/null | grep -q ":22 "; then
|
||
echo "✅ Puerto 22 está abierto"
|
||
else
|
||
echo "❌ Puerto 22 no está escuchando"
|
||
return 1
|
||
fi
|
||
|
||
# Mostrar información de conexión
|
||
local external_ip
|
||
external_ip=$(curl -s ifconfig.me 2>/dev/null || curl -s ipinfo.io/ip 2>/dev/null || echo "IP_NO_DETECTADA")
|
||
|
||
echo ""
|
||
echo "📊 INFORMACIÓN DE CONEXIÓN:"
|
||
echo "=========================="
|
||
echo " IP Externa: $external_ip"
|
||
echo " Puerto SSH: 22"
|
||
echo " Rango puertos NAT: 9000-9999"
|
||
echo ""
|
||
}
|
||
|
||
# Función principal
|
||
main() {
|
||
echo "Iniciando configuración de PC3..."
|
||
echo ""
|
||
|
||
install_ssh_server
|
||
configure_ssh
|
||
configure_firewall
|
||
setup_ssh_key
|
||
verify_setup
|
||
|
||
echo ""
|
||
echo "🎉 ¡Configuración de PC3 completada!"
|
||
echo ""
|
||
echo "📋 PRÓXIMOS PASOS:"
|
||
echo "1. Probar conexión SSH desde PC1:"
|
||
echo " ssh -i certs/ssh_private_key usuario@$(hostname -I | awk '{print $1}')"
|
||
echo ""
|
||
echo "2. Si la conexión SSH funciona, ejecutar en PC1:"
|
||
echo " ./setup.sh"
|
||
echo ""
|
||
echo "3. Usar el sistema NAT desde PC2:"
|
||
echo " python nat_client.py plc 10.1.33.11 vnc"
|
||
echo ""
|
||
}
|
||
|
||
# Ejecutar función principal
|
||
main "$@"
|
||
EOF
|
||
|
||
chmod +x "$setup_script"
|
||
echo ""
|
||
echo "📄 Script de configuración de PC3 creado: $setup_script"
|
||
}
|
||
|
||
# Función principal
|
||
main() {
|
||
echo "Generando nueva clave SSH para el sistema NAT industrial..."
|
||
echo ""
|
||
|
||
# Verificar si ya existe una clave
|
||
if [[ -f "$SSH_KEY_PATH" ]]; then
|
||
echo "⚠️ Ya existe una clave SSH en: $SSH_KEY_PATH"
|
||
echo ""
|
||
read -p "¿Quieres sobrescribirla? (y/N): " -n 1 -r
|
||
echo
|
||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||
echo "❌ Operación cancelada"
|
||
exit 1
|
||
fi
|
||
echo ""
|
||
fi
|
||
|
||
# Generar nueva clave SSH
|
||
generate_ssh_key
|
||
|
||
# Mostrar clave pública
|
||
show_public_key
|
||
|
||
# Crear script para PC3
|
||
create_pc3_setup_script
|
||
|
||
echo ""
|
||
echo "🎯 PRÓXIMOS PASOS:"
|
||
echo "================="
|
||
echo ""
|
||
echo "1. 📋 COPIAR la clave pública mostrada arriba"
|
||
echo ""
|
||
echo "2. 🖥️ En PC3 (91.99.210.72), ejecutar:"
|
||
echo " wget -O- https://pastebin.com/raw/XXXXXXXX | bash"
|
||
echo " (o copiar manualmente el script /tmp/setup_pc3_nat.sh)"
|
||
echo ""
|
||
echo "3. 🧪 PROBAR conexión SSH desde aquí:"
|
||
echo " ssh -i $SSH_KEY_PATH usuario@$PC3_HOST"
|
||
echo ""
|
||
echo "4. 🚀 Si funciona, ejecutar:"
|
||
echo " ./setup.sh"
|
||
echo ""
|
||
echo "5. 📱 Usar desde PC2:"
|
||
echo " python nat_client.py plc 10.1.33.11 vnc"
|
||
echo ""
|
||
|
||
# Mostrar información adicional
|
||
echo "ℹ️ INFORMACIÓN DE LA CLAVE:"
|
||
echo " Tipo: RSA 4096 bits"
|
||
echo " Privada: $SSH_KEY_PATH"
|
||
echo " Pública: $SSH_PUB_PATH"
|
||
echo " Propósito: Sistema NAT Industrial"
|
||
echo ""
|
||
|
||
# Verificar si ssh-agent está disponible para cargar la clave
|
||
if command -v ssh-agent >/dev/null 2>&1; then
|
||
echo "💡 CONSEJO: Para cargar la clave en ssh-agent:"
|
||
echo " eval \$(ssh-agent -s)"
|
||
echo " ssh-add $SSH_KEY_PATH"
|
||
echo ""
|
||
fi
|
||
|
||
echo "✅ ¡Nueva clave SSH generada exitosamente!"
|
||
}
|
||
|
||
# Ejecutar función principal
|
||
main "$@" |