474 lines
11 KiB
Markdown
474 lines
11 KiB
Markdown
# 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:**
|
|
|
|
#### 1. **Previne Link-uri Redundante**
|
|
```
|
|
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:**
|
|
|
|
```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)<br>**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:**
|
|
```conf
|
|
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:**
|
|
```conf
|
|
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:**
|
|
```conf
|
|
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:**
|
|
```conf
|
|
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) - `!`**
|
|
|
|
```conf
|
|
rule = "!connected(*.eu.*)";
|
|
```
|
|
**Înseamn:** "dacă **NU** există un server EU conectat"
|
|
|
|
### **2. AND (și) - `&&`**
|
|
|
|
```conf
|
|
rule = "connected(*.eu.*) && !directcon(*.eu.*)";
|
|
```
|
|
**Înseamnă:** "dacă există un server EU conectat **ȘI** nu e conectat direct"
|
|
|
|
### **3. OR (sau) - `||`**
|
|
|
|
```conf
|
|
rule = "connected(*.eu.*) || connected(*.asia.*)";
|
|
```
|
|
**Înseamnă:** "dacă există un server EU conectat **SAU** un server Asia conectat"
|
|
|
|
### **4. Paranteze pentru grupare - `()`**
|
|
|
|
```conf
|
|
rule = "connected(*.eu.*) && (!directcon(*.eu.*) || via(manhattan.*, *.eu.*))";
|
|
```
|
|
**Înseamnă:** "dacă există EU conectat **ȘI** (**nu** e direct **SAU** e prin Manhattan)"
|
|
|
|
---
|
|
|
|
## 💡 EXEMPLE PRACTICE
|
|
|
|
### **Exemplu 1: Previne Link-uri Multiple către Europa**
|
|
|
|
```conf
|
|
# 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`
|
|
|
|
---
|
|
|
|
### **Exemplu 2: Preferă Manhattan pentru Link-uri EU**
|
|
|
|
```conf
|
|
# 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**
|
|
|
|
```conf
|
|
# 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`
|
|
|
|
---
|
|
|
|
### **Exemplu 4: Permite doar 1 Link per Continent**
|
|
|
|
```conf
|
|
# 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)**
|
|
|
|
```conf
|
|
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)**
|
|
|
|
```conf
|
|
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:**
|
|
|
|
```conf
|
|
# ============================================================================
|
|
# 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:**
|
|
|
|
```irc
|
|
# 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ă:**
|
|
```conf
|
|
CRule {
|
|
server = "*.eu.underchat.org";
|
|
all = no;
|
|
rule = "connected(*.eu.underchat.org)";
|
|
};
|
|
```
|
|
|
|
**Pe fiecare server EU, adaugă:**
|
|
```conf
|
|
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+
|
|
|