ids.alfacom.it/MIKROTIK_API_FIX.md
marco370 5c74eca030 Update MikroTik API connection to use correct REST API port
Update MIKROTIK_API_FIX.md to reflect the correction of the MikroTik API connection from the binary API port (8728) to the REST API port (80), ensuring proper HTTP communication for IP blocking functionality.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 7a657272-55ba-4a79-9a2e-f1ed9bc7a528
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Event-Id: 71f707e1-8089-4fe1-953d-aca8b360c12d
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/449cf7c4-c97a-45ae-8234-e5c5b8d6a84f/7a657272-55ba-4a79-9a2e-f1ed9bc7a528/U7LNEhO
2025-11-25 18:13:31 +00:00

7.4 KiB
Raw Blame History

Fix Connessione MikroTik API

🐛 PROBLEMA RISOLTO

Errore: Timeout connessione API MikroTik - router non rispondeva a richieste HTTP.

Causa Root: Confusione tra API Binary (porta 8728) e API REST (porta 80/443).

🔍 API MikroTik: Binary vs REST

MikroTik RouterOS ha DUE tipi di API completamente diversi:

Tipo Porta Protocollo RouterOS Compatibilità
Binary API 8728 Proprietario RouterOS Tutte Non HTTP (libreria routeros-api)
REST API 80/443 HTTP/HTTPS standard >= 7.1 HTTP con httpx

IDS usa REST API (httpx + HTTP), quindi:

  • Porta 80 (HTTP) - CONSIGLIATA
  • Porta 443 (HTTPS) - Se necessario SSL
  • Porta 8728 - API Binary, NON REST (timeout)
  • Porta 8729 - API Binary SSL, NON REST (timeout)

SOLUZIONE

1 Verifica RouterOS Versione

# Sul router MikroTik (via Winbox/SSH)
/system resource print

Se RouterOS >= 7.1 → Usa REST API (porta 80/443)
Se RouterOS < 7.1 → REST API non esiste, usa API Binary

2 Configurazione Porta Corretta

Per RouterOS 7.14.2 (Alfabit):

-- Database: Usa porta 80 (REST API HTTP)
UPDATE routers SET api_port = 80 WHERE name = 'Alfabit';

Porte disponibili:

  • 80 → REST API HTTP ( CONSIGLIATA)
  • 443 → REST API HTTPS (se SSL richiesto)
  • 8728 → API Binary (non compatibile)
  • 8729 → API Binary SSL (non compatibile)

3 Test Manuale

# Test connessione porta 80
curl http://185.203.24.2:80/rest/system/identity \
  -u admin:password \
  --max-time 5

# Output atteso:
# {"name":"AlfaBit"}

📋 VERIFICA CONFIGURAZIONE ROUTER

1 Controlla Database

-- Su AlmaLinux
psql $DATABASE_URL -c "SELECT name, ip_address, api_port, username, enabled FROM routers WHERE enabled = true;"

Output Atteso:

name          | ip_address    | api_port | username | enabled
--------------+---------------+----------+----------+---------
Alfabit       | 185.203.24.2  | 80       | admin    | t

Verifica:

  • api_port = 80 (REST API HTTP)
  • enabled = true
  • username e password corretti

Se porta errata:

-- Cambia porta da 8728 a 80
UPDATE routers SET api_port = 80 WHERE ip_address = '185.203.24.2';

2 Testa Connessione Python

# Su AlmaLinux
cd /opt/ids/python_ml
source venv/bin/activate

# Test connessione automatico (usa dati dal database)
python3 test_mikrotik_connection.py

Output atteso:

✅ Connessione OK!
✅ Trovati X IP in lista 'ddos_blocked'
✅ IP bloccato con successo!
✅ IP sbloccato con successo!

🚀 DEPLOYMENT SU ALMALINUX

Workflow Completo

1 Su Replit (GIÀ FATTO )

  • File python_ml/mikrotik_manager.py modificato
  • Fix già committato su Replit

2 Locale - Push GitLab

# Dalla tua macchina locale (NON su Replit - è bloccato)
./push-gitlab.sh

Input richiesti:

Commit message: Fix MikroTik API - porta non usata in base_url

3 Su AlmaLinux - Pull & Deploy

# SSH su ids.alfacom.it
ssh root@ids.alfacom.it

# Pull ultimi cambiamenti
cd /opt/ids
./update_from_git.sh

# Riavvia ML Backend per applicare fix
sudo systemctl restart ids-ml-backend

# Verifica servizio attivo
systemctl status ids-ml-backend

# Verifica API risponde
curl http://localhost:8000/health

4 Test Blocco IP

# Dalla dashboard web: https://ids.alfacom.it/routers
# 1. Verifica router configurati
# 2. Clicca "Test Connessione" su router 185.203.24.2
# 3. Dovrebbe mostrare ✅ "Connessione OK"

# Dalla dashboard detections:
# 1. Seleziona detection con score >= 80
# 2. Clicca "Blocca IP"
# 3. Verifica blocco su router

🔧 TROUBLESHOOTING

Connessione Ancora Fallisce?

A. Verifica Servizio WWW su Router

REST API usa servizio www (porta 80) o www-ssl (porta 443):

# Sul router MikroTik (via Winbox/SSH)
/ip service print

# Verifica che www sia enabled:
# 0  www         80   *       ← REST API HTTP
# 1  www-ssl    443   *       ← REST API HTTPS

Fix su MikroTik:

# Abilita servizio www per REST API
/ip service enable www
/ip service set www port=80 address=0.0.0.0/0

# O con SSL (porta 443)
/ip service enable www-ssl
/ip service set www-ssl port=443

NOTA: api (porta 8728) è API Binary, NON REST!

B. Verifica Firewall AlmaLinux

# Su AlmaLinux - consenti traffico verso router
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" destination address="185.203.24.2" port protocol="tcp" port="8728" accept'
sudo firewall-cmd --reload

C. Test Connessione Raw

# Test TCP connessione porta 80
telnet 185.203.24.2 80

# Test REST API con curl
curl -v http://185.203.24.2:80/rest/system/identity \
  -u admin:password \
  --max-time 5

# Output atteso:
# {"name":"AlfaBit"}

Se timeout: Servizio www non abilitato sul router

D. Credenziali Errate?

-- Verifica credenziali nel database
psql $DATABASE_URL -c "SELECT name, ip_address, username FROM routers WHERE ip_address = '185.203.24.2';"

-- Se password errata, aggiorna:
-- UPDATE routers SET password = 'nuova_password' WHERE ip_address = '185.203.24.2';

VERIFICA FINALE

Dopo il deployment, verifica che:

  1. ML Backend attivo:

    systemctl status ids-ml-backend  # must be "active (running)"
    
  2. API risponde:

    curl http://localhost:8000/health
    # {"status":"healthy","database":"connected",...}
    
  3. Auto-blocking funziona:

    # Controlla log auto-blocking
    journalctl -u ids-auto-block.timer -n 50
    
  4. IP bloccati su router:


📊 CONFIGURAZIONE CORRETTA

Parametro Valore (RouterOS >= 7.1) Note
api_port 80 (HTTP) o 443 (HTTPS) REST API
Servizio Router www (HTTP) o www-ssl (HTTPS) Abilita su MikroTik
Endpoint /rest/system/identity Test connessione
Endpoint /rest/ip/firewall/address-list Gestione blocchi
Auth Basic (username:password base64) Header Authorization
Verify SSL False Self-signed certs OK

ERRATO (API Binary - Timeout)

# Porta 8728 usa protocollo BINARIO, non HTTP REST
curl http://185.203.24.2:8728/rest/...
# Timeout: protocollo incompatibile

CORRETTO (API REST - Funziona)

# Porta 80 usa protocollo HTTP REST standard
curl http://185.203.24.2:80/rest/system/identity \
  -u admin:password

# Output: {"name":"AlfaBit"}

Database configurato:

-- Router Alfabit configurato con porta 80
SELECT name, ip_address, api_port FROM routers;
-- Alfabit | 185.203.24.2 | 80

📝 CHANGELOG

25 Novembre 2024:

  1. Identificato problema: porta 8728 = API Binary (non HTTP)
  2. Verificato RouterOS 7.14.2 supporta REST API
  3. Configurato router con porta 80 (REST API HTTP)
  4. Test curl manuale: {"name":"AlfaBit"}
  5. Router inserito in database con porta 80

Test richiesto: python3 test_mikrotik_connection.py

Versione: IDS 2.0.0 (Hybrid Detector)
RouterOS: 7.14.2 (stable)
API Type: REST (HTTP porta 80)