¿cuanta gente a visto el blog?

instalar el Controller RYU en Kali

 sudo apt update && sudo apt upgrade -y

sudo apt install xterm x11-xserver-utils -y

sudo apt install xterm x11-xserver-utils

sudo apt install xauth -y


sudo nano /etc/ssh/sshd_config


X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes


sudo service ssh restart

ssh -X mininet@10.10.10.148



sudo mn

xterm h1




sudo apt install git python3 python3-pip python3-dev build-essential libssl-dev libffi-dev -y

git clone https://github.com/faucetsdn/ryu.git

cd ryu
sudo pip3 install .

ryu-manager --version



sdn

Unir equipos distantes

Fue creada con arquitectura cliente servidos, el cliente establece una peticion al servidor y el cliente responde

Con la llegada de las redes sociales, ya no era solo trafico local, sino que esta red social se conecta a otros servidores oara dar los servicios, ahora esta tambien horizontal, demasiado trafico o en eventos en ancho de banda del equipo no avastece y se cae la red 

Demasiados equipos en internet, si un equipo se cae, debe hacer configuracion edicionales por uno nuevo

Debe ir modificando en cada dispositivos


DSN son redes definidas por software, red dinamica manejable, adaptable, coste eficiente

ideal para alta demanda de ancho de banda y naturaleza de software actuales

 

El plano de control son las reglas

Por medio de controladores, el cerebro del equipo de un linux, varios software gestionan eso


OpenLife, Rio, cisco, HP

Existen controladores de red definida por software (SDN) de código abierto y propietarios: 
  • De código abierto
    Algunos ejemplos son:
    • NOX/VIRUELA 
    • AbiertoLuz diurna 
    • Sistema operativo de red abierta 
    • Tejido de tungsteno 
    • Faro 
    • Foco 
    • Ryu 
    • Trema 
  • Propietarios
    Algunos proveedores que ofrecen controladores SDN son:
    • Cisco 
    • Redes Juniper 
    • VMware 
    • Nokia 
Los controladores SDN son software o interfaces de programación de aplicaciones (API) que se encargan de comunicarse con la infraestructura de hardware y dirigir el tráfico en una red. 
Las redes SDN son abiertas, programables y ágiles. Entre sus ventajas se encuentran: Mejor control y gestión de datos, Mayor seguridad, Alta eficiencia, Ahorro de costos, Unificar datos e infraestructura.
Una funciona como Kernel
No importa si es Cisco, si es HP, si es Microtik, 
Osea se programa que se comporte como Switch o tal


aplicaciones-controladores-hardware 

El problema esta que entre diferentes marcas, no pueden comunicarse, hay confluctos 

En la red actual se origrama equipo por equipo
En SDN se desarolla una aplicacion controlador que dice a cada equipo de como se va a comportat

Debox: Se desarrollar y operador


-El protocolo OpenFlow: ¿Que dice? emergente y abierto a comunicaciones, primera interfaz de comunicaciones 
Los protocolos más conocidos que utilizan los controladores SDN de Cisco para comunicarse con conmutadores y enrutadores son OpenFlow y OVSDB. 
OpenFlow es un protocolo que permite a los controladores SDN comunicarse con el plano de reenvío de los dispositivos de red. Se considera uno de los primeros estándares de redes definidas por software (SDN). 
Cisco también ofrece como alternativa a otros controladores de SDN su Application Policy Infrastructure Controller (APIC).

Con un Sandbox se puede ver como funcoiona

da comunicacion entre el controlador y el switch
Controlador SDN, centraliza la comunicacion que pasa pormdispositivos y provee una vision general de red

Mikrotik tiene un controlador en la nube pero debes pagar para usar esa nube. maneja a travez de apis

El emulador de red MININET
permite manejar las redes y enlaczarse a un simulador como tal

sdn
https://github.com/mininet/mininet/releases/
ip add

sudo mn


exit
borra configuracion

sudo mn -c

abre un kali

ifconfig


  • Mininet: 10.10.10.148
  • Kali: 10.10.10.129


  • sudo apt update

  • sudo apt install openssh-server

  • sudo service ssh start
  • ssh mininet@10.10.10.148

  • xtern h1


  • sudo apt update
  • sudo apt install xterm x11-xserver-utils
  • sudo nano /etc/ssh/sshd_config
  • link h1


  • X11Forwarding yes
    X11DisplayOffset 10
    X11UseLocalhost yes

    sudo service ssh restart

    xterm h1

    Enviar datos a la Base de datos con una llamada

     /etc/asterisk/pjsip.conf


    [1001] type=endpoint context=odbc_test ; Asegúrate de usar el contexto definido en extensions.conf


    sudo systemctl restart asterisk


    sudo nano /etc/asterisk/extensions.conf


    [odbc_test]

    exten => 100,1,NoOp(Leyendo valor desde la base de datos)

     same => n,Set(ODBC_RESULT=${ODBC_IVAST(SELECT numero FROM ultnum WHERE id=1)})

     same => n,NoOp(Valor obtenido: ${ODBC_RESULT})

     same => n,Hangup()


    exten => 101,1,NoOp(Insertando un nuevo valor en la base de datos)

     same => n,Set(ODBC_INSERT=${ODBC_IVAST(INSERT INTO ultnum (numero) VALUES (42))})

     same => n,NoOp(Valor insertado con éxito)

     same => n,Hangup()



    sudo asterisk -rx "dialplan reload"

    con menu

    sudo nano /etc/asterisk/extensions.conf

    [ivr_menu]
    exten => s,1,Answer()
     same => n,Background(welcome) ; Reproduce un audio inicial (reemplaza 'welcome' con tu archivo .wav)
     same => n,WaitExten(10) ; Espera 10 segundos para recibir una entrada del usuario
     same => n,Hangup()

    ; Opción 1 - Establecer número en la base de datos a 1
    exten => 1,1,NoOp(Opción 1 seleccionada)
     same => n,Set(ODBC_INSERT=${ODBC_IVAST(UPDATE ultnum SET numero=1 WHERE id=1)})
     same => n,Playback(option-1) ; Reproduce un mensaje indicando que se seleccionó la opción 1
     same => n,Hangup()

    ; Opción 2 - Establecer número en la base de datos a 2
    exten => 2,1,NoOp(Opción 2 seleccionada)
     same => n,Set(ODBC_INSERT=${ODBC_IVAST(UPDATE ultnum SET numero=2 WHERE id=1)})
     same => n,Playback(option-2) ; Reproduce un mensaje indicando que se seleccionó la opción 2
     same => n,Hangup()

    ; Opción 3 - Establecer número en la base de datos a 3
    exten => 3,1,NoOp(Opción 3 seleccionada)
     same => n,Set(ODBC_INSERT=${ODBC_IVAST(UPDATE ultnum SET numero=3 WHERE id=1)})
     same => n,Playback(option-3) ; Reproduce un mensaje indicando que se seleccionó la opción 3
     same => n,Hangup()

    ; Manejo de entradas inválidas
    exten => i,1,Playback(invalid) ; Reproduce un mensaje de opción inválida
     same => n,Goto(ivr_menu,s,2) ; Regresa al inicio del menú

    ; Manejo de tiempo agotado sin respuesta
    exten => t,1,Playback(goodbye) ; Reproduce un mensaje de despedida
     same => n,Hangup()


     


    sudo nano /etc/asterisk/pjsip.conf


    [1001]
    type=endpoint
    context=ivr_menu ; Cambia al contexto del menú IVR

    que solo funcione el celular para eso

    [ivr_menu]
    exten => s,1,Answer()
     same => n,Background(vm-intro) ; Reproduce la introducción del correo de voz
     same => n,WaitExten(10) ; Espera 10 segundos para recibir entrada del usuario
     same => n,Hangup()

    ; Opción 1
    exten => 1,1,NoOp(Opción 1 seleccionada)
     same => n,Set(ODBC_INSERT=${ODBC_IVAST(UPDATE ultnum SET numero=1 WHERE id=1)})
     same => n,Playback(demo-thanks) ; Agradece por seleccionar la opción 1
     same => n,Hangup()

    ; Opción inválida
    exten => i,1,Playback(invalid) ; Reproduce mensaje de opción inválida
     same => n,Goto(ivr_menu,s,1) ; Regresa al menú

    ; Tiempo agotado
    exten => t,1,Playback(vm-intro) ; Reproduce el mismo mensaje inicial
     same => n,Hangup()


    sudo asterisk -rx "dialplan reload"

    menu 774

    sudo nano /etc/asterisk/extensions.conf

    [default]
    exten => 774,1,Answer()
     same => n,Playback(demo-thanks) ; Reproduce un audio corto por defecto
     same => n,Goto(ivr_menu,s,1) ; Entra al menú IVR

    [ivr_menu]
    exten => s,1,NoOp(Ingreso al menú IVR)
     same => n,Background(vm-intro) ; Reproduce un mensaje (puedes usar cualquier archivo por defecto)
     same => n,WaitExten(10) ; Espera 10 segundos para recibir entrada del usuario

    ; Opción 1: Establecer el último número de la tabla como 1
    exten => 1,1,NoOp(Opción 1 seleccionada)
     same => n,Set(ODBC_INSERT=${ODBC_IVAST(UPDATE ultnum SET numero=1 WHERE id=1)})
     same => n,Playback(demo-thanks) ; Agradece al usuario
     same => n,Goto(ivr_menu,s,1) ; Regresa al menú

    ; Opción 2: Establecer el último número de la tabla como 0
    exten => 2,1,NoOp(Opción 2 seleccionada)
     same => n,Set(ODBC_INSERT=${ODBC_IVAST(UPDATE ultnum SET numero=0 WHERE id=1)})
     same => n,Playback(demo-thanks) ; Agradece al usuario
     same => n,Goto(ivr_menu,s,1) ; Regresa al menú

    ; Opciones no válidas: Volver al menú
    exten => i,1,Playback(invalid) ; Reproduce un mensaje indicando que la opción no es válida
     same => n,Goto(ivr_menu,s,1) ; Regresa al menú

    ; Tiempo agotado: Reproduce un mensaje y vuelve al menú
    exten => t,1,Playback(vm-intro) ; Reproduce un mensaje
     same => n,Goto(ivr_menu,s,1) ; Regresa al menú

    sudo nano /etc/asterisk/pjsip.conf


    [1001]
    type=endpoint
    context=default
    disallow=all
    allow=ulaw
    auth=auth1001
    aors=1001





    llamada condicional por tabla 

    isql -v ivast
     
    CREATE TABLE ultemp (
        id INT AUTO_INCREMENT PRIMARY KEY,
        valor INT NOT NULL
    );

    INSERT INTO ultemp (valor) VALUES (0);
    SELECT * FROM ultemp;



    sudo nano /etc/asterisk/extensions.conf

    [check_ultemp]
    exten => s,1,NoOp(Comprobando el valor de ultemp)
     same => n,Set(ULTEMP=${ODBC_READ(SELECT valor FROM ultemp WHERE id=1)})
     same => n,NoOp(Valor actual de ultemp: ${ULTEMP})

    ; Si el valor es mayor a 1000, llama al 1002
     same => n,GotoIf($[${ULTEMP} > 1000]?call_1002,1)

    ; Si el valor es menor o igual a 1000, cuelga cualquier llamada activa
     same => n,Hangup()

    [call_1002]
    exten => 1,1,NoOp(Llamando al 1002 porque ultemp es mayor a 1000)
     same => n,Dial(PJSIP/1002,10) ; Llama al 1002 durante 10 segundos
     same => n,Hangup()

    sudo nano /root/check_ultemp.sh
    #!/bin/bash

    while true; do
        # Ejecuta la comprobación en Asterisk
        asterisk -rx "channel originate Local/s@check_ultemp extension s@check_ultemp"
        sleep 5 # Espera 5 segundos antes de volver a comprobar
    done


    chmod +x /root/check_ultemp.sh 

    ./root/check_ultemp.sh



    isql -v ivast


    UPDATE ultemp SET valor=1500 WHERE id=1;

     sudo nano llamadacontinua1001.py 

    import socket
    import time

    # Configuración de Asterisk Manager Interface (AMI)
    ASTERISK_HOST = '127.0.0.1'  # Dirección IP del servidor Asterisk
    ASTERISK_PORT = 5038         # Puerto de AMI
    ASTERISK_USER = 'admin'      # Usuario definido en manager.conf
    ASTERISK_SECRET = 'admin'    # Contraseña definida en manager.conf

    def iniciar_llamada():
        try:
            # Crear socket para conexión AMI
            ami_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            ami_socket.connect((ASTERISK_HOST, ASTERISK_PORT))

            # Login en AMI
            login = (
                f"Action: Login\r\n"
                f"Username: {ASTERISK_USER}\r\n"
                f"Secret: {ASTERISK_SECRET}\r\n"
                f"\r\n"
            )
            ami_socket.sendall(login.encode())
            time.sleep(1)

            # Comando Originate para iniciar llamada
            originate = (
                f"Action: Originate\r\n"
                f"Channel: PJSIP/1001\r\n"
                f"Context: default\r\n"  # Cambia si usas otro contexto
                f"Exten: 1001\r\n"       # Extensión destino
                f"Priority: 1\r\n"       # Prioridad definida en extensions.conf
                f"CallerID: Modo Continuo <1003>\r\n"
                f"\r\n"
            )
            ami_socket.sendall(originate.encode())
            print("Llamada enviada a 1001. Esperando respuesta...")

            # Leer la respuesta de Asterisk
            while True:
                data = ami_socket.recv(1024).decode()
                print(data)
                if "Hangup" in data or "answered" in data.lower():
                    print("La llamada fue contestada o finalizada.")
                    break

            ami_socket.close()
        except Exception as e:
            print(f"Error: {e}")

    if __name__ == "__main__":
        try:
            while True:
                iniciar_llamada()
                time.sleep(1)  # Espera un segundo antes de intentar otra llamada
        except KeyboardInterrupt:
            print("\nModo continuo finalizado. No se realizarán más llamadas.")

  • Revisa manager.conf:

    Asegúrate de que manager.conf contenga algo similar a esto: 

    [admin] secret = admin read = system,call,log,verbose,command,agent,user write = system,call,log,verbose,command,agent,user

    Reinicia Asterisk después de cualquier cambio: 

    sudo systemctl restart asterisk
  • Verifica el canal PJSIP:

    Comprueba que el canal PJSIP/1001 esté registrado: 

    sudo asterisk -rx "pjsip show endpoints"

  • python3 llamadacontinua1001.py

    pip3 install pymysql

    sudo nano check_ultemp.py

    import socket
    import pymysql
    import time

    # Configuración de Asterisk Manager Interface (AMI)
    ASTERISK_HOST = '127.0.0.1'  # Dirección IP del servidor Asterisk
    ASTERISK_PORT = 5038         # Puerto de AMI
    ASTERISK_USER = 'admin'      # Usuario definido en manager.conf
    ASTERISK_SECRET = 'admin'    # Contraseña definida en manager.conf

    # Configuración de la base de datos
    DB_HOST = 'localhost'
    DB_USER = 'root'
    DB_PASSWORD = 'admin'
    DB_NAME = 'ivast'
    DB_TABLE = 'ultemp'

    # Variable para rastrear el estado de la llamada
    llamada_activa = False

    def iniciar_llamada():
        try:
            global llamada_activa
            # Crear socket para conexión AMI
            ami_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            ami_socket.connect((ASTERISK_HOST, ASTERISK_PORT))

            # Login en AMI
            login = (
                f"Action: Login\r\n"
                f"Username: {ASTERISK_USER}\r\n"
                f"Secret: {ASTERISK_SECRET}\r\n"
                f"\r\n"
            )
            ami_socket.sendall(login.encode())
            time.sleep(1)

            # Comando Originate para iniciar llamada
            originate = (
                f"Action: Originate\r\n"
                f"Channel: PJSIP/1001\r\n"
                f"Context: default\r\n"  # Cambia si usas otro contexto
                f"Exten: 1001\r\n"       # Extensión destino
                f"Priority: 1\r\n"       # Prioridad definida en extensions.conf
                f"CallerID: Alerta <1003>\r\n"
                f"\r\n"
            )
            ami_socket.sendall(originate.encode())
            print("Llamada iniciada a 1001.")
            llamada_activa = True

            ami_socket.close()
        except Exception as e:
            print(f"Error al iniciar la llamada: {e}")

    def finalizar_llamada():
        try:
            global llamada_activa
            # Crear socket para conexión AMI
            ami_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            ami_socket.connect((ASTERISK_HOST, ASTERISK_PORT))

            # Login en AMI
            login = (
                f"Action: Login\r\n"
                f"Username: {ASTERISK_USER}\r\n"
                f"Secret: {ASTERISK_SECRET}\r\n"
                f"\r\n"
            )
            ami_socket.sendall(login.encode())
            time.sleep(1)

            # Comando Hangup para finalizar la llamada
            hangup = (
                f"Action: Hangup\r\n"
                f"Channel: PJSIP/1001\r\n"
                f"\r\n"
            )
            ami_socket.sendall(hangup.encode())
            print("Llamada finalizada.")
            llamada_activa = False

            ami_socket.close()
        except Exception as e:
            print(f"Error al finalizar la llamada: {e}")

    def verificar_valor():
        try:
            global llamada_activa
            # Conexión a la base de datos
            conexion = pymysql.connect(
                host=DB_HOST,
                user=DB_USER,
                password=DB_PASSWORD,
                database=DB_NAME
            )
            cursor = conexion.cursor()

            # Consultar el valor actual de la tabla ultemp
            cursor.execute(f"SELECT valor FROM {DB_TABLE} ORDER BY id DESC LIMIT 1;")
            resultado = cursor.fetchone()

            if resultado:
                valor = resultado[0]
                print(f"Valor actual: {valor}")
                if valor > 1000 and not llamada_activa:
                    iniciar_llamada()
                elif valor <= 1000 and llamada_activa:
                    finalizar_llamada()
            else:
                print("No se encontró ningún dato en la tabla.")

            cursor.close()
            conexion.close()
        except Exception as e:
            print(f"Error al verificar el valor: {e}")

    if __name__ == "__main__":
        try:
            while True:
                verificar_valor()
                time.sleep(2)  # Intervalo de verificación en segundos
        except KeyboardInterrupt:
            print("\nScript detenido por el usuario.")



    python3 check_ultemp.py



    isql -v ivast

    UPDATE ultemp SET valor = 1500 WHERE id = 1;

    UPDATE ultemp SET valor = 900 WHERE id = 1;




    Consultar de la base de datos con ESP32

    ip a


    #include <WiFi.h>
    #include <HTTPClient.h>

    const char* ssid = "RED";  
    const char* password = "clave";

    // http://192.168.0.104/consulta_ultnum.php
    // Definir el pin para el LED
    #define LED_PIN 2  // Pin GPIO2 del ESP32 (G2)

    void setup() {
      // Inicializar el LED como salida
      pinMode(LED_PIN, OUTPUT);
      digitalWrite(LED_PIN, LOW); // Apagar el LED inicialmente
     
      Serial.begin(115200);
     
      // Conexión a la red WiFi
      Serial.println("Conectando a WiFi...");
      WiFi.begin(ssid, password);
     
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
     
      Serial.println("\nConexión establecida!");
      Serial.print("IP asignada: ");
      Serial.println(WiFi.localIP());
    }

    void loop() {
      if (WiFi.status() == WL_CONNECTED) {
        HTTPClient http;
        String serverUrl = "http://192.168.0.104/consulta_ultnum.php";
       
        Serial.println("Conectando al servidor...");
        http.begin(serverUrl);
        int httpCode = http.GET();

        if (httpCode > 0) { // Si el servidor responde
          String payload = http.getString();
          Serial.print("Respuesta recibida: ");
          Serial.println(payload);
         
          // Convertir la respuesta a entero
          int valor = payload.toInt();
         
          // Controlar el LED según el valor
          if (valor == 1) {
            Serial.println("Encendiendo el LED...");
            digitalWrite(LED_PIN, HIGH); // Encender LED
          } else if (valor == 0) {
            Serial.println("Apagando el LED...");
            digitalWrite(LED_PIN, LOW); // Apagar LED
          } else {
            Serial.println("Valor desconocido recibido.");
          }
        } else {
          Serial.print("Error en la conexión HTTP: ");
          Serial.println(httpCode);
        }

        http.end();
      } else {
        Serial.println("WiFi desconectado!");
      }
     
      delay(500); // Esperar 5 segundos antes de realizar otra consulta
    }

    sudo nano /var/www/html/consulta_ultnum.php
    <?php
    $servername = "localhost"; // Cambia si no usas localhost
    $username = "root";
    $password = "admin";
    $dbname = "ivast";

    // Crear conexión
    $conn = new mysqli($servername, $username, $password, $dbname);

    // Verificar conexión
    if ($conn->connect_error) {
        die("Conexión fallida: " . $conn->connect_error);
    }

    // Consulta SQL
    $sql = "SELECT numero FROM ultnum WHERE id = 1";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        // Obtener el valor
        $row = $result->fetch_assoc();
        echo $row['numero'];
    } else {
        echo "No se encontraron resultados.";
    }

    $conn->close();
    ?>


    http://10.10.10.138/consulta_ultnum.php



    Subir datos desde la esp 

    sudo nano envia_valor.php
    <?php
    $servername = "localhost";
    $username = "root";
    $password = "admin";
    $dbname = "ivast";

    // Conexión a la base de datos
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error) {
        die("Conexión fallida: " . $conn->connect_error);
    }

    // Obtener los datos enviados por la ESP32
    $id = $_POST['id'];
    $valor = $_POST['valor'];

    // Actualizar el valor en la tabla ultemp
    $sql = "UPDATE ultemp SET valor = $valor WHERE id = $id";

    if ($conn->query($sql) === TRUE) {
        echo "Valor actualizado con éxito";
    } else {
        echo "Error al actualizar: " . $conn->error;
    }

    $conn->close();
    ?>