ProxyTcpReverse/scripts/generate_ssh_key.sh

347 lines
10 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 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 "$@"