ircu2/CRULE_EXPLAINED.md

11 KiB

CRULE - Connection Rules (Reguli de Conectare)

📋 CE ESTE CRULE?

CRULE (Connection Rule) este un sistem de reguli inteligente care controlează CÂND și CUM serverul tău IRC se poate conecta la alte servere din rețea.

Este parte a sistemului SmartRoute - un mecanism avansat de routing pentru rețele IRC mari.


🎯 SCOPUL PRINCIPAL

CRULE permite administratorilor să definească condiții sub care o conexiune server-to-server:

  • Este permisă (dacă regulile sunt îndeplinite)
  • Este blocată (dacă regulile nu sunt îndeplinite)

Exemplu simplu:

"Nu te conecta la un server din Europa dacă există deja o conexiune către un alt server european"


🔧 CÂND SE FOLOSEȘTE?

Scenarii comune:

Problema: Ai 2 servere US și 2 servere EU
Vrei: Doar 1 link US-EU, nu 4!

Soluție CRULE: "connected(*eu.*)"
→ Dacă există deja un server EU conectat, nu mai face alte link-uri

2. Preferă Anumite Route

Problema: Vrei ca Manhattan să gestioneze link-urile către Europa, nu Boston
Vrei: Boston să se conecteze doar dacă Manhattan nu e disponibil

Soluție CRULE: "!via(manhattan.*, *eu.*)"
→ Blochează Boston dacă există deja link EU prin Manhattan

3. Control Autoconnect vs Manual

Problema: Autoconnect-ul e prea agresiv, dar vrei să lași operatorii să forțeze
Vrei: Autoconnect blocat, dar /CONNECT manual permis

Soluție CRULE: d-line (overrideable by opers)
→ Autoconnect blocat, dar operatorii pot forța cu /CONNECT

4. Necesită Operator Online

Problema: Vrei să eviți route-uri riscante când nu e nimeni să monitorizeze
Vrei: Conectare la servere "riscante" doar când un oper e online

Soluție CRULE: "!directop()"
→ Blochează dacă NU există un operator conectat direct

📝 SINTAXA CRULE

În ircd.conf:

CRule {
    server = "nume.server.ro";
    all = yes;              # yes = aplică la TOATE conectările
                            # no = doar la autoconnect (overrideable)
    rule = "expresie";      # Regula propriu-zisă
};

Parametri:

Parametru Valori Descriere
server "*.domain" Server-ul la care se aplică regula (wildcard permis)
all yes / no yes = Blochează TOATE (inclusiv /CONNECT manual)
no = Blochează doar autoconnect
rule "expresie" Expresia logică care definește condiția

🔍 FUNCȚII DISPONIBILE

1. connected(targetmask)

Ce face: Verifică dacă există un server conectat care se potrivește cu masca

Sintaxă: connected("*.eu.*")

Exemplu:

CRule {
    server = "madrid.es.eu.underchat.org";
    all = no;
    rule = "connected(*.eu.*)";
};

Efect: Blochează autoconnect la Madrid dacă există DEJA un alt server EU conectat.


2. directcon(targetmask)

Ce face: Verifică dacă există un server DIRECT conectat (nu prin intermediar) care se potrivește cu masca

Sintaxă: directcon("*.us.*")

Exemplu:

CRule {
    server = "boston.ma.us.underchat.org";
    all = yes;
    rule = "directcon(*.us.*)";
};

Efect: Blochează TOATE conectările la Boston dacă există deja un server US conectat direct la serverul curent.


3. via(viamask, targetmask)

Ce face: Verifică dacă un server (targetmask) este conectat PRIN un alt server (viamask)

Sintaxă: via("manhattan.*", "*.eu.*")

Exemplu:

CRule {
    server = "*.eu.*";
    all = no;
    rule = "via(manhattan.*, *.eu.*)";
};

Efect: Blochează autoconnect la servere EU dacă există deja un server EU conectat PRIN Manhattan.


4. directop()

Ce face: Verifică dacă există un operator conectat direct la serverul curent

Sintaxă: directop()

Exemplu:

CRule {
    server = "risky.server.net";
    all = no;
    rule = "!directop()";
};

Efect: Blochează autoconnect la risky.server.net dacă NU există un operator online (pentru monitorizare).


🧮 OPERATORI LOGICI

1. NOT (negare) - !

rule = "!connected(*.eu.*)";

Înseamn: "dacă NU există un server EU conectat"

2. AND (și) - &&

rule = "connected(*.eu.*) && !directcon(*.eu.*)";

Înseamnă: "dacă există un server EU conectat ȘI nu e conectat direct"

3. OR (sau) - ||

rule = "connected(*.eu.*) || connected(*.asia.*)";

Înseamnă: "dacă există un server EU conectat SAU un server Asia conectat"

4. Paranteze pentru grupare - ()

rule = "connected(*.eu.*) && (!directcon(*.eu.*) || via(manhattan.*, *.eu.*))";

Înseamnă: "dacă există EU conectat ȘI (nu e direct SAU e prin Manhattan)"


💡 EXEMPLE PRACTICE

# Pe server US: Boston
CRule {
    server = "*.eu.underchat.org";
    all = no;
    rule = "connected(*.eu.underchat.org)";
};

Efect:

  • Prima conexiune la un server EU → PERMISĂ
  • A doua conexiune la alt server EU → BLOCATĂ (autoconnect)
  • Operator poate forța cu /CONNECT madrid.es.eu.underchat.org

# Pe server US: Boston
CRule {
    server = "*.eu.underchat.org";
    all = no;
    rule = "connected(*.eu.underchat.org) && (!directcon(*.eu.underchat.org) || via(manhattan.*, *.eu.underchat.org))";
};

Efect:

  • Dacă există deja un server EU conectat:
    • Boston nu se mai conectează (lasă Manhattan să gestioneze)
    • Excepție: Dacă Boston DEJA are link EU direct, îl păstrează

Exemplu 3: Necesită Operator pentru Route-uri Riscante

# Link către server nesigur
CRule {
    server = "experimental.test.org";
    all = no;
    rule = "!directop()";
};

Efect:

  • Autoconnect blocat dacă NU există oper online
  • Dacă un oper e online, autoconnect PERMIS
  • Oper poate forța manual oricând cu /CONNECT

# Reguli pentru un HUB global
CRule {
    server = "*.eu.*";
    all = no;
    rule = "connected(*.eu.*)";
};

CRule {
    server = "*.asia.*";
    all = no;
    rule = "connected(*.asia.*)";
};

CRule {
    server = "*.us.*";
    all = no;
    rule = "connected(*.us.*)";
};

Efect:

  • Maxim 1 link către fiecare continent
  • Previne "mesh" complet (prea multe conexiuni)

⚙️ DIFERENȚA ÎNTRE all = yes și all = no

all = yes (D-line în conf vechi)

CRule {
    server = "*.eu.*";
    all = yes;
    rule = "connected(*.eu.*)";
};

Blochează:

  • Autoconnect
  • /CONNECT de la operatori
  • Conexiuni incoming de la alte servere

Folosit pentru: Reguli ABSOLUTE care nu trebuie niciodată încălcate


all = no (d-line în conf vechi)

CRule {
    server = "*.eu.*";
    all = no;
    rule = "connected(*.eu.*)";
};

Blochează:

  • Autoconnect

PERMITE:

  • /CONNECT manual de la operatori
  • Conexiuni incoming de la alte servere

Folosit pentru: Reguli de OPTIMIZARE care pot fi override-uite manual


🔧 CONFIGURARE ÎN ircd.conf

Exemplu Complet:

# ============================================================================
# SECȚIUNE: CRULE - Reguli de Conectare Inteligente
# ============================================================================

# Regula 1: Previne link-uri redundante către Europa
CRule {
    server = "*.eu.underchat.org";
    all = no;
    rule = "connected(*.eu.underchat.org)";
};

# Regula 2: Preferă Manhattan pentru link-uri EU (Boston backup)
CRule {
    server = "madrid.es.eu.underchat.org";
    all = no;
    rule = "via(manhattan.*, *.eu.underchat.org)";
};

# Regula 3: Link-uri experimentale doar cu oper online
CRule {
    server = "experimental.*.underchat.org";
    all = no;
    rule = "!directop()";
};

# Regula 4: Nu permite NICIODATĂ link către servere blacklist
CRule {
    server = "*.blacklisted.net";
    all = yes;
    rule = "connected(*)";  # Întotdeauna blocat
};

📊 VERIFICARE ȘI DEBUGGING

Comenzi IRC pentru testare:

# Vezi toate regulile configurate
/STATS d

# Vezi doar regulile absolute (all = yes)
/STATS D

# Testează o conexiune (ca operator)
/CONNECT madrid.es.eu.underchat.org

Output /STATS d exemplu:

:server 242 nick D madrid.es.eu.underchat.org::connected(*.eu.*)
:server 242 nick d experimental.*.underchat.org::!directop()
  • D (majusculă) = all = yes (absolute)
  • d (minusculă) = all = no (overrideable)

🎯 AVANTAJE CRULE

1. Control Granular

Definești exact CÂND și CUM se fac conexiunile, nu doar "poate sau nu poate".

2. Optimizare Topologie

Previne "mesh" complet (toate serverele conectate între ele) care poate cauza lag și probleme de routing.

3. Reducere Costuri

Link-urile internationale costă trafic → CRULE limitează link-urile redundante.

4. Siguranță

Poate preveni conexiuni nedorite sau periculoase automat.

5. Flexibilitate

Operatorii pot override-ui regulile all = no când e necesar.


🚨 CÂND NU TREBUIE FOLOSIT

Rețele mici (< 5 servere)

Overhead-ul de configurare nu merită pentru rețele mici.

Topologie simplă

Dacă ai doar 2-3 servere într-o linie, CRULE e overkill.

Fără operatori experimentați

Regulile complexe pot bloca conexiuni necesare dacă sunt configurate greșit.


🎓 TUTORIAL: Primul Tău CRULE

Scenariul:

  • Ai 2 servere US: boston.us și newyork.us
  • Ai 2 servere EU: madrid.eu și paris.eu
  • Vrei: Doar 1 link US-EU (nu 4!)

Soluția:

Pe fiecare server US, adaugă:

CRule {
    server = "*.eu.underchat.org";
    all = no;
    rule = "connected(*.eu.underchat.org)";
};

Pe fiecare server EU, adaugă:

CRule {
    server = "*.us.underchat.org";
    all = no;
    rule = "connected(*.us.underchat.org)";
};

Rezultat:

  • Prima conexiune US-EU → Permisă (ex: boston-madrid)
  • A doua conexiune US-EU → Blocată automat (ex: newyork-paris)
  • Dacă prima conexiune cade, a doua devine activă automat

📚 RESURSE SUPLIMENTARE

  • Documentație completă: doc/readme.crules
  • Cod sursă: ircd/crule.c
  • Exemple config: ircd/test/ircd-t1.conf
  • RFC IRC: Nu există standard oficial, e specific Undernet/Nefarious

🎯 CONCLUZIE

CRULE = SmartRoute pentru IRC

În loc să definești doar:

  • "Poate să se conecteze la X?"

Poți defini:

  • "Poate să se conecteze la X DACĂ Y și Z sunt îndeplinite?"

Este un sistem puternic dar complex - folosește-l doar dacă ai nevoie de control granular asupra topologiei rețelei!


Data: 14 Februarie 2026
Versiune: 1.0
Pentru: UnderChat IRCd v1.3.1+